+ JavaScript の質問用スレッド vol.123 + [転載禁止]©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
JavaScript を自ら学ぶ人のための質問スレッドです。 >>2-4 のテンプレを読んだ上で質問してください。 ■質問を書く上で (1) 煽り、コード制作依頼等、人を不快にさせる投稿はご遠慮下さい。公序良俗を守った応対を心がけてください。 (2) 他の人に迷惑をかけるスクリプトの質問はご遠慮ください。 (ブラクラ、[戻る], [閉じる], [クリック] の妨害、画面占有など) (3) 質問者及び議論を行う人はメール欄を空欄にし、名前にレス番を入れることを強く推奨します。回答者はなりすましを判断できませんので、なりすましが現れても自己責任となります。 (4) 常に自発的に調べる心構えを持ってください。 具体的には「自分で調べてから質問する」「回答をもらってわからない単語があればGoogle検索してみる」など。 わからない内容を代わりに調べてくれる回答者をお望みの方は余所で質問してください。 (5) 出来るだけ一般的な用語を使用してください。脳内オレオレ用語は混乱の元です。 (6) 出来るだけサンプルコードを掲示してください。言葉による説明は行き違いが生まれる場合があります。 ※必ず「問題の事象が再現されること」を確認してください。 必要な部分だけ切り出したつもりで現象が再現できていなかったケアレスミスがしばしば見られます。 (7) サンプルコードに HTML が含まれる場合は http://validator.w3.org/ で [Check] してみてください。 (8) 質問を具体的かつ詳細に書くと回答を得られやすいです。>>2 の質問テンプレートを活用してみてください。 (9) 時にはあなたが望む「答え」だけでなく、「意見」などが寄せられる場合もあります。 + JavaScript の質問用スレッド vol.122 +(c)2ch.net http://peace.2ch.net/test/read.cgi/hp/1420095379/ (ライブラリ禁止条項は、多数の意見によって廃止されました。ライブラリの質問もOKです) すいません。バタバタしててスレを覗きに来れませんでした。 >>569 ありがとうございます! ただ、>>573 でご指摘あるとおり、「元々の場所(並び順も同じ)に戻したい」が理想でした。 最初の質問に記入し忘れていて申し訳ありませんでした。 >>567 ありがとうございます。 戻す際にループを行ってソートする方法も考えてはいたのですが、 実環境で使用するコンボボックスが200件近く表示される可能性もあり、 もしかしたら少し時間がかかってしまうのではないか、と思った次第です。 >>587 嘘は良くないよ。 https://html.spec.whatwg.org/multipage/forms.html#the-multiple-attribute >>The multiple attribute is a boolean attribute だからmultiple="true"は正しい。 multiple="false"は間違い。 皆様、ありがとうございました。 頂いた回答と、optgroup内のソート処理を組み合わせることで、 意図した動作をIE/Firefox/Chromeのそれぞれで確認することが出来ました。 http://jsfiddle.net/fw1e85vy/1/ HTML規約的に妙な部分ことになっているかもしれないですが、 data-sort -> id にしても問題なさそうですかね・・・ そこまでやるなら要素の外にごちゃごちゃくっつけるんじゃなくて 丸っとカスタムエレメントにすべきだよ。 >>594 煽った上に嘘を言うとはとことん使えない野郎だな https://html.spec.whatwg.org/multipage/infrastructure.html#boolean-attribute > The values "true" and "false" are not allowed on boolean attributes. To represent a false value, the attribute has to be omitted altogether. 英語が読めないならせめてvalidatorでも使って調べてから書け どこが嘘かね? 俺はHTML5がわざわざ正しいことにしてくれたから正しいと言っている。 HTML5 とは >>594 みたいなバカに合わせて、酷かった現状に溜息まじりでアリバイを作ってくれたクソな仕様だよ。 自分で自分をバカと言ったw バカは >>597 だな。 短く言い直してやるよ。 multiple="true" は現行HTMLで正しいことにしてくれたから正しい。 しかし、過去においてその間違いを犯していた大量のアホがいたから、ふつうは格好悪くて書けない。 (だからHTML5仕様の例示にも属性名省略で書いてある。) (そして、そもそも、仕様を読めなかった大多数の低脳は省略が名であることを知らないから、過去において大量に間違えていた。) >>599 は別人だから責めんといてくれ まず、multiple="true"は仕様に沿っておらず、validatorではエラーになる。 これは分かってるよな? >>597 にも書いたし、validatorでも確認できるから、先入観を持たずに確認してくれ。 次に、>>598 は、仕様に沿ってなくても、自分の思い通りになれば「正しいことにしてくれる」って思ってるのか? それなら、<select multiple="on">も<select multiple="yes">も>>598 にとっては「正しい」のか? HTML4では値がmultiple一択だった。 HTML5では何でもいい。 しかし、JSのDOMでは、最初から真偽値だった。 当時のその現状を参考にしてDOM仕様がまとめられた。 HTMLの属性値で文字列としてしか取得できないのだが、見た目にtrueと書いてあると、JSを書く者には親近感が湧くのかもしれない。とにかくこの過去の仕様に照らしての間違いを過去においていたるところで見た。 なんと、HTML5で、何でも良いことにしてくれたw HTML5での、属性名省略そのものの崩壊とtfootの位置、この2つが代表例だと思っているが、さすがにたまげたわ、馬鹿に合わせてここまで敷居を下げないと実情に合わないんだなって。笑うしかない。 ところで、お前は馬鹿だから現行HTMLでは何でもいいってどういうことか分かってないんだろ、どうせ。 multiple="" multiple="false" multiple="true" multiple="multiple" multiple これらがぜんぶ同じ。笑うしかないわなw お前みたいな馬鹿のせいでこうなったんだよ。 >>593 やっときたかw > ただ、>>573 でご指摘あるとおり、「元々の場所(並び順も同じ)に戻したい」が理想でした。 まあそうだろうと思って、あれからすぐに作っていたのだが レスがあるまで待ってた。 http://jsfiddle.net/L2p6zkux/3/ >>595 補足するならば、ソート使ってないのでデータが増えても問題ないのと HTML Validにしている。 >>596 > そこまでやるなら要素の外にごちゃごちゃくっつけるんじゃなくて > 丸っとカスタムエレメントにすべきだよ。 >>595 のコードの場合、data-sort=を減らすためだけに カスタムエレメントにしろって話? それはやり過ぎだろう。 それ以前に俺のコードの場合は、data-sortという特殊な属性も必要なく HTMLの標準のごく普通のselectだけを使ってるから 新たに要素を作るカスタムエレメントのする意味ないけどね。 で、一つ引っかかるんだけど、「そこまでやる」というけど、 たった14行だよ? (無理やり書けば4行ぐらいに収めることは可能) たった14行で作れる小さな機能ためにカスタムエレメント導入するほうが、 そこまでやることじゃないって思うけど。 外部に分離する前に、まずんなの大したこと無い。簡単に短いコードで 実現できる。と思いつけるようにならないと。 >>601 > (だからHTML5仕様の例示にも属性名省略で書いてある。) multipleは値じゃなくて属性だよ。 http://www.w3.org/TR/REC-html32#select > multiple > The presence of this attribute signifies that the > users can make multiple selections. By default only one selection is allowed. HTML3やHTML4の仕様を見てみれば、昔から属性だってのはわかると思うんだが。 XHTMLだけが異端で、気の迷いでHTMLをXMLの仕様に歪めたために multiple="multiple"などという変な表記が生まれた。 XHMTLはXMLだから厳格なんだ。故に正しいんだって思っているのかもしれないけど、 HTMLは(XHTMLを除いて)XMLではなく、例えば一部の終了タグとかも省略できるのが 正しい仕様。multipleはHTMLの仕様では昔から値無しの属性。 XHTMLの方が例外なんでもうなかったことにした方がいい。 >>603 > ところで、お前は馬鹿だから現行HTMLでは何でもいいってどういうことか分かってないんだろ、どうせ。 > multiple="" > multiple="false" > multiple="true" > multiple="multiple" > multiple > これらがぜんぶ同じ。笑うしかないわなw > お前みたいな馬鹿のせいでこうなったんだよ。 そんなに不思議なことじゃない。というかおそらくHTML3とかの時代から 挙動は変わってない。 なぜならmultipleは属性であって、その属性があれば有効になるから 値が何であろうと、それを参照していない。 これは知らないものは無視するというHTMLの動きの原則にあっているし 昔からの挙動だと思う。 >>597 別に煽ってるつもりはないし、相変わらず何も分かってないのはそっちでしょ。 >>The values "true" and "false" are not allowed on boolean attributes. ってのはあくまでNoteであって、"true"/"false"を使ってはいけないという仕様があるのではなく、 "true"/"false"にboolean attributesとしての特別の意味はないから気をつけてね程度のもの。 実際は属性値として設定しておくことは可能でその場合はtrueとみなされる。 嘘は良くないよ。 >>611 煽ってるつもりがないなら悪かった だが誤解しているのはそちらなので、譲りたくない気持ちは分かるがもう一度考えてくれ > "true"/"false"を使ってはいけないという仕様があるのではなく、 断言する。ある。 NOTEのすぐ上にこう書いてある https://html.spec.whatwg.org/multipage/infrastructure.html#boolean-attribute > If the attribute is present, its value must either be the empty string or a value that is an ASCII case-insensitive match for the attribute's canonical name, with no leading or trailing whitespace. 『属性が存在するなら、その値は「空の文字列」か「大文字小文字を区別せず属性名に一致する文字列」(前後に空白文字は認めない)である必要がある』 と、明記してある。 つまり、<select multiple>も<select multiple="">も<select multiple="multiple">も<select multiple="MuLtIpLe">もいい。 しかし、<select multiple="true">や<select multiple="hoge">や<select multiple="ok">はダメだ。 ちなみに「NOTE」は日本語の「ノート」という意味もあるが、「重要/注目/注記」という意味もある。 multiple="true"は君に限らず多くの人が間違えることなので、わざわざ注記してくれてるんだよ。 >>612 横から失礼、それはあんたの勘違い。よく読み直そう。 教える価値のない相手なのでレスはやめる スレ汚しすまなかった いやちょっと待て、あんた盛大に勘違いしといて「教える価値(ry」ってドンだけ…. > 横から失礼、それはあんたの勘違い。よく読み直そう。 なんで勘違いって言ってるくせに その勘違いの場所を具体的に指摘できないの?w もうそれで勝負付いているんだけど、 気づいているかな? 急に逃げててワロタww どこが勘違いしてるか指摘してやって恥かかせてやろうぜ じゃあ今から、どの部分が勘違いか指摘していやる。 仕様書読むからちょっと待ってろ >>594 を読め。 https://html.spec.whatwg.org/multipage/forms.html#the-multiple-attribute >>The multiple attribute is a boolean attribute この部分の行間を読めばわかるでしょ? boolean attributeって書いているってことは 論理的に考えるとtrueでもいいはずだ boolean attributeって書いてあるだけで、trueが許されるなんて書いてないんですがwww あ、それが行間を読むってことなんですねw 書いてないけど、お前ん中ではそうなんだろうな理論ですねw >>620 横だけど、 "true"が許されないってどういう意味で言ってる? getAttributeでは当然"true"が帰ってくる 値は何でもいいので属性があれば有効というのが正式な動作だよ >>622 > "true"が許されないってどういう意味で言ってる? HTMLの正しい仕様の話に決まってるだろw > getAttributeでは当然"true"が帰ってくる JavaScriptは無関係ないので他所でやれw >>607 おおお・・・シンプルかつ読みやすい方法、ありがとうございます。 これは元リスト側の選択したoptionを、別のタグ(template)に置き換えている、 という認識でしょうか。 自分の拙い頭脳では、どうやって元の場所と認識しているのか、まだピンときていませんが・・・ >>595 でまとめた方法より見やすいので、こちらを採用させて頂きたいと思います。 ありがとうございました。 >>607 ・・・あれ、jQuery 2.1.3を使用したら動かなくなりました(´・ω・`) A→Bは動作しますが、B→Aが反応しないようです。 >625 > これは元リスト側の選択したoptionを、別のタグ(template)に置き換えている、 > という認識でしょうか。 あってます。 >>626 > ・・・あれ、jQuery 2.1.3を使用したら動かなくなりました(´・ω・`) あれ、ほんとだ。 edgeは正式版の最新版だと思ってたら3.0.0.preだったよ。 一応修正した。 http://jsfiddle.net/L2p6zkux/9/ ぐぐるとreplaceWithするとdataが消えるとかあるけど 仕様なのかバグなのかよくわからない。 少なくとも3.0.0 preでは挙動が変わってるようだ。 やっていることは 位置を覚えておく必要があるから、optionを別のものに 置き換えてその場所をポインタにする。 置き換えるのはいいとしてなにに? template (HTMLの使用上許されている物はこれしか無いから) 置き換えるのはreplaceWithでできるけど、 元に戻すための情報が必要だね。data()で保存。 保存する値は要素ごとに違うから、replaceWithは 関数を引数にして新しい要素を作ってdata()で保存させる。 戻すときはその情報を使って戻す。 まあこんな感じ。 考え方のコツは、要素(複数のoption)を一つ一つ 処理していくんじゃなくて、「複数のoption」という一つの塊をみて どばっと置換。どばっと戻す。って考えることかな。 塊で処理したいけど、一つ一つの要素で微妙に違いがある場合は このようにreplaceWithの引数に関数を指定すれば良い。 不具合のせいでreplaceWithがbefore & detachになってしまったけど。 .replaceWith()は内部的に.remove()を使っている。 .remove()は仕様通りDataやイベントリスナを削除するので、.replaceWith()でもDataが消えちゃうみたいだね。 あぁ、なるほど、だからdata()を使わずに 要素のプロパティに直接保存した時は問題なかったのか。 replaceWithした時に残る情報、残らない情報とがあって 統一されてないから3.0でバグとして修正されたのかな。 覚えておこう。 ごめん、勘違いだったorz ソースを見たところ、別に内部的に.remove()が使われているわけではなく、 .replaceWith()自体でDataの削除をしていた。 削除の挙動的には.remove()と同等みたいだけど。 あと、ドキュメントに該当の記述があったので参考までに。 http://api.jquery.com/replacewith/ Additional Notes: The .replaceWith() method removes all data and event handlers associated with the removed nodes. <template>にそういう使い方があったのか 勉強になった >>624 正しいではなく上品な使い方の間違いでは? HTMLは道具なんだからそれを意図的に使えれば正しいといえる。 HTML5はいろいろな場合における細かい挙動まで整備されたんだから、 HTML4以前のように上品に使わないと動作が保証されないということはない。 今回"true"を何が何でも使っちゃいけないという合理的な理由は見つからないし、 仕様に則っても間違いではない。 自分に無駄にルールを作って、道具に使われちゃいけないと思うよ。 それを意味もなく人に強制するのはもっとよくない。 早く誤ちを認めたらどう? >>633 "正しい" であってるよ。 HTMLには仕様書があって その仕様書に書かれていることだから。 >>627-628 ありがとうございます! わかりやすい解説も助かります! それでは名無しに戻ります。 色々とありがとうございました。 >>634 論外 仕様書が読めるようになってからまた来てね >>638 それがjQueryのもっとも重要な所で、これをわかっているかどうかで jQueryに対しての評価が違う。 時々document.querySelectorAllがあるからjQueryは もう要らないっていう人がいるけどこれはわかってない人。 セレクタからDOM要素を取得することはできるけど、 その取得した要素に対して簡単に操作する方法をDOMは提供していない。 $('.class').remove(); 例えばこんなの jQueryは.classに当てはまる要素全てを塊として、.remove()メソッドを実行できるが DOMでやるならば、ループして一個づつ処理しないといけない。 DOM標準にjQueryのような仕様が入る気配はないし、 jQueryに変わるライブラリなら出来る可能性があるが、 .remove()、.add()、.attr()、.data()、.on()、・・・ 必要なのを全部書いていたら、それjQueryでよくね?ってなっちゃう。 VirtualDOMを使うライブラリのように、jQueryどころか、 document.querySelectorAllを含むDOM操作がまったく必要ない ライブラリを使うならば話は別だが、DOM APIを使うよりもjQueryの方が 良いという事実は今後も揺らぐことはないだろう。 自分はループして一個ずつ処理するのでいいと思うけどな。 document.queryAll('.class').forEach(el => el.remove());程度の記述量で済むわけだし、 逆にただそれを省くために色々な不要な処理も入った半ばブラックボックス化してるライブラリを勉強して使った方がいいとは思えない。 jQueryの良いところはDefferdとかAnimationとかAjaxとかひと通り必要なものが揃ってたことであって、 それらが潰れた今となっては、もう必ずしも必要な存在ではないというか、使わない方が良い存在になってきているのは事実。 >>639 が言ってるのは結局はまだほんの少し使える部分もあるよってことでしかない。 DOM操作だけのサブセットを使うというんならまだアリだと思う。けしてベストではないけど。 > document.queryAll('.class').forEach(el => el.remove());程度の記述量で済むわけだし、 動かないだろw わかってない証拠、 DOM操作だけのサブセット = jQueryの中から必要な物を厳選 = jQueryの機能の殆ど = ならQueryでいいじゃんw jQueryはよく絞り込まれてるよ。どのメッソドもほしいもの。 >>641 どこがどう分かってないのか説明よろ。 >>642 それちきんとコード比でも見て言ってるの? document.queryAll('.class').forEach(el => el.remove()); を正しく書くなら Array.prototype.forEach.call(document.querySelectorAll('.class'), el => el.parentNode.removeChild(el)); だな 議論に参加しようと思ったら突っ込まれるところを作ってはいけない >>643 > どこがどう分かってないのか説明よろ。 せめて動くコードを書けって言ってる。 想像の中で動くであろうコードを書いて、ほら短いといっても、 それはお前の頭んなかの想像の話だろwってことだ。 > el => el.parentNode.removeChild(el) この書き方は現状Firefoxでしか動かないから、これが現実的なところだろうね。 Array.prototype.forEach.call(document.querySelectorAll('.class'), function(el) { el.parentNode.removeChild(el) }); この後、メソッドチェーンしたいんだけど?と言われたら(笑) >>644 話の流れ的に紛らわしかったかもしれないけど、よく見て。 NodeListを返すquerySelectorAllじゃなくて、Elementsを返すqueryAllを使った。 ElementsはArrayを継承してるからforEachが直に使えるでしょ? >>646 メソッドチェーンしたければmapを使えばいいよ。 >>647 え? remove()は? もしかして、お前の想像の世界ではあるって ことになっんの? 想像の世界の技術で反論(笑) そんな感じで、さまざまなメソッドを オレオレライブラリで作るんだろう?w だったらjQueryでいいじゃんってなるって 最初から言ってる。 >>648 だから動くコードを書けって言ってる。 結局書くと、ばれるのが怖いんだよ。 だから、擬似コード書いて 勝った気になってる。 $('.class').remove(); Array.prototype.forEach.call(document.querySelectorAll('.class'), el => el.parentNode.removeChild(el)); 可読性が大きく違いすぎるw >>649 Elementはremove()を持ってるよ。 >>647 適当なこと言ってすまなかった DOMのLS見てきたけど、今までとかなり変わってて驚いた 勉強し直してくる >>652 > オブジェクトは 'remove' プロパティまたはメソッドをサポートしていません。 説明してくれるかい? 各ブラウザ間の互換性を取るための ライブラリが必要だな! jQuery(ボソッ) >>650 queryAllはまだどのブラウザにも実装されていないけど、モダンブラウザかIE11以降でエミュ可能。 removeはChromeとFirefoxで入ってるのを確認した。 ES6の構文は必要ならトランスパイラを使えばいい。 自分が問題視しているのは、学習コストとそれが古いものになることでの無駄。 もう標準が用意されるってわかった時点で、その機能はポリフィルに切り替えて行くべきだと思ってる。 いや、だからjQueryでいいでしょ? 結局お前が示したコードよりも、 さらにjQueryの方が短くて、 どのブラウザでも動くんだし。 どんなに頑張っても可読性はjQuery > DOMだからねぇ。 DOMの進化が10年遅すぎた。 その10年の間にjQueryは誰もが持ってる必須の知識となってしまったし、 DOMを使った結果、jQueryより劣ることしかできないんじゃ なんのためにDOM使うのか理由がない。 せめてこれぐらいは、DOMでも25文字ぐらいでできてもらわないとね。 $('.class').remove(); >>655 それは当然大事。 ただ、jQueryが生まれた当初と比べて、互換性がまだまだ取れないという点は未だ残っているが、 そもそも標準機能が不足してるという点は改善されてきてる。 各機能の有り様について標準が提供されているときは、それに従うべきだと思う。 そうするとライブラリというよりポリフィル的なものになる。 そういう意味ではjQueryはとりあえず使っとけと言うものでは無くなった。 特にjQueryは標準にかなり影響を与えていて、標準がjQueryを改善した、 似てるけれど少し違うものを用意しているという問題もある。 つまりjQueryのAPIは腐ってきてるということ。 ただしDOMAPIもそれほど豊富なわけではないのでまだまだDOM操作のフレームワークやライブラリは必要。 とはいえ比較的基礎的なAPIを提供するjQueryをわざわざ使う価値と、合うケースは減ってきてると思う。 $ → $ = document.queryAll.bind(document) on → ES7を先取りしてObserableに切り替える でいいんじゃない Observableな感じを思い浮かべるとメソッドチェーン指向ってのは正しい気がする そういうスタイルで書くならやっぱり同期メソッドもチェーンで書きたいよね でもObservableとjQueryを組み合わせるのは難しそう ここを標準に期待するのは無理だから、おそらくまたどこかのいいライブラリがデファクトスタンダードになって それを標準が追いかけるようになるんだろうね いつまでたってもライブラリからは逃れられずに時代は繰り返される あーでもExtensible Webに則るとそういう世界であってるか もしElementsにElementのメソッドつけようと思ったらこんな感じになる? Elements.prototype.__proto__ = new Proxy(Array.prototype, { get(aryProto, key, elems) { return (key in aryProto) ? aryProto[key] : (...args) => elems.map(el => el[key](...args)) } }); あまり知られてないがスムーススクロールも標準でできるようになったんだよな。 http://dev.w3.org/csswg/cssom-view/#enumdef-scrollbehavior Chでようやく認識するようになった段階で動くのはFxくらいだが。 >>663 を試そうと思ったけど、なぜか手元のFF37だと上手くいかない…。 原因を調べるとどうやらprototypeとproxyを組み合わせると上手く動かない。 var o = Object.create(new Proxy({ hoge: 1 }, { get(){ return 2; } })); console.log(o.hoge); // 2 console.log(o.fuga); // なぜかundefined??? これはバグ? >>663 標準化される前に、標準のprototypeを拡張するのはよくないよ。 あとから標準化された時に名前がかぶっていたら互換性の問題が発生する。 Prototype.jsがそれで痛い目にあってる。 http://qiita.com/jwhaco/items/b5b474883d3020f6dc5f 標準のprototypeを拡張するぐらいなら、 独自のオブジェクトでラップした方がいいと思う。 それがjQueryでやってることでも有る。 良いも悪いもElementsを拡張しようと思えばそうするしか無いでしょ。 まあサブクラスを作るのが一番筋がいいと思うけどな。 > まあサブクラスを作るのが一番筋がいいと思うけどな。 それを実現しようと思ったら、document.getElementsByNameの 戻り値をサブクラスにするってことになるんだけど、 getElementsByNameはdocumentだけにあるものじゃない。 すべての要素に、getElementsByNameがあるわけだから Elementsを拡張するのであれば、Elementを拡張しなければならなくなる。 もちろんgetElementsByNameだけじゃないね。getElementsByTagNameとかもそう サブクラスを作るって言えば簡単に思えるかもしれないが、 実際には標準のDOMのElementのメソッドを書き換えまくることをしないといけない。 それで安定して動くのか?って考えると難しい話なんだよ。 だから現実には標準のprototypeを書き変えることをしない。 ブラウザという実行環境がユーザーの手にあって開発者の自由にできないものは、 開発者が自由に実行環境を決めることが可能なデスクトップアプリや サーバーサイドアプリと同じやり方でやったらだめなんだよ。 callで置換されたthisを一時的に変更するにはどうすればいいでしょうか 例えば、 function A(x) { this.piyo = new B(x); this.C = x; }; A.prototype.do = function() { this.piyo.do.call(this); //(1) }; function B(x) { this.B = x; }; B.prototype.do = function() { console.log(this.B); // undefined console.log(this.C); // 10 }; var hoge = new A("10"); hoge.do(); というコードがあったとします。 この時、(1)でthisをhogeとして呼び出したのでthis.Bがundefinedになりますが、 this.Bの時だけthisをpiyoとして呼び出したいのです。 (1)をthis.piyo.do();として、console.log(this.C);をconsole.log(B.C);とすると、クラス変数ではないのでundefinedとなります。 >>671 頭が硬いね。 別にそうしなくてもSub.from(hoge)としてラップすればいいんだよ。 jQueryみたいな1から作るのと違うのはElementsのメソッドを活かしながら必要な機能のみを安全に拡張できるところ。 必要な機能? onは必要だしattrやpropやdataも必要 addもremoveも、insertもbeforeもafterもreplaceWithもだし、 eachやgrepも必要だろう。 もちろんメソッドチェーンも必要だし、 逆に必要じゃない機能ってなんだ? 結局jQueryの再実装をしているだけなんだが。 >>673 標準のDOM要素に標準化されてないメソッドを追加すると あとで同じメソッドが標準のDOM要素に追加された時困るから やるべきじゃないよ。 継承しても一緒。継承元に有る標準のメソッドを オーバーライドしてしまうことになる。 >>675 オーバーライドしてしまうのなら問題ないよ。 >>663 が問題なのはオーバーライドしないことで、同名の標準ができた時に壊れることだから。 それに標準のものには追加してないでしょ。 別個体のサブクラスに明示的にラップするという操作を伴うものだから、他への影響はないよ。 誰かがしちゃいけませんって言ったことを理由も考えずに信じ続けるのは良くない。 >>676 > オーバーライドしてしまうのなら問題ないよ。 おいおいw 問題を認識してないのかよ。 DOM非標準のものならば、自分しか使わないから問題ないが DOM標準の場合は、オーバーライドしてしまったら 他のライブラリが改変された関数を使ってしまうかもしれないだろ。 だからjQueryなどはDOMとは全く別のオブジェクトで ラッピングするという手法をとっているのだが。 話をまとめるか? 1. 標準のElementsにはattr()というメソッドはありませんでした。 2. だから標準のElementsを拡張してattr()を追加しました。 3. このattr()は当然オレオレ実装です。 4. あるときElementsに標準仕様でattr()が追加されました。 5. オレオレattr()と標準attr()で仕様が違いました。 6. 他のライブラリは標準attr()だと思ってるのにオレオレattr()が呼び出されて困りました。 こういう話なんだが。これprototype.jsで実際に起きた話な。 で、お前はサブクラスなら問題無いと言っているわけだが、 サブクラスでも問題有るんだよ。なぜならElementsを返すのは誰?って話。 例えばdocument.getElementsByTagName()だけじゃなくて 全ての要素.getElementsByTagName() やその他多くの全て。 すべての要素のgetElementsByTagName()だけでなく、 createElement('div') で作られた要素のgetElementsByTagName()も サブクラスを返すように改変しないといけない。 そうすると、DOMのElementのprototypeを改編する話だってのはわかるな? >>677 >>サブクラスを返すように改変しないといけない だからそうじゃないって言ってるだろ。 >>673 を見たのか? 逐一Elementsをサブクラスにラップして使うやり方について言ってるの。 だからElementsを利用してる他のものに影響を与えることはない。 まず人の話をよく聞いてから批判しような。 >>678 あんたたサブクラスとラップという用語を ちゃんとわかってないって言うことがよくわかったよw ラップするならばサブクラスにする必要はないし普通はしない。 jQueryはDOM要素郡(そこでいうElements)をラップしたもの。 > jQueryはDOM要素郡(そこでいうElements)をラップしたもの。 正確に言うならば、jQueryの$()などで返すjQueryオブジェクトは DOM要素郡(そこでいうElements)をラップしたもの。 そもそもElementsを何のサブクラスにするって言ってるんだろう? ちゃんとわかってるなら○クラスのサブクラスにするって 具体的に言えるはずだ。 ぜひ○の中身を答えて欲しい。 先回りしていっておくと、世の中には○クラスを引数にする 関数が存在するが、○クラスを互換性がない形に改変すると その関数の引数に入れられなくなる。(本当にサブクラスなら入れられる) だが改変しないとメソッドチェーンが使えなくなる。 >>679 分かってないのはあんた。 Elementsに元々あるメソッドを使うためにもそうするのが一番自然、 言い訳見苦しいよ。負けを認めなさい。 >>683 > Elementsに元々あるメソッドを使うためにもそうするのが一番自然、 Elementsに元々あるメソッドって何のことだよw なんのサブクラスにしたいわけ? 答えられてないよね? > 言い訳見苦しいよ。負けを認めなさい。 ワロタw 勝ったつもりでいるんだw 元々のメソッドを使う方が絶対にいいはずだって 固定観念を持っているんだろうね。 jQueryのeachではなく、 Elements.forEach(Array.forEach)を使ったほうが いいはずだって思ってるのだろうけど、 forEachではメソッドチェーンが出来無くなってしまうわけで 元々のメソッドを使うとjQueryからすると劣化してしまう。 劣化しないように作るとなると元々のメソッドはほぼ全て使えなくなってしまう。 ここまで考えずに、元々のメソッドを使う方が絶対にいいはずだって 固定観念を持っているんだろうね。 👀 Rock54: Caution(BBR-MD5:0be15ced7fbdb9fdb4d0ce1929c1b82f) >>684 queryAllとかあるでしょ。 それらを一々再実装するの? 元からあるのを使った方がいいに決まってる。 >>685 mapを使えばmapはthisのコンストラクタを見て、 きちんとサブクラスのインスタンスに結果を追加していってくれる。 他のArrayのメソッドでも同じ。 そういう意味でもサブクラスにするのは正しい。 >>687 > それらを一々再実装するの? 君はライブラリを使うってことを覚えようよw jQueryが実現しているから使うだけ。 それにqueryAllが返すElementsの話だろ? Elementsをサブクラスにしろっていう話なんだから。 queryAllがあるのはElementであってElementsじゃない。 mapがあるのはArrayであってElementにはない。 Elementsにも無い。(queryAllが返す要素の配列は、本当の配列じゃないから) それらを一々サブクラスに再実装するの?w >>688 ライブラリを使えばいいというのはそのとおりだよ。ライブラリはダメとか言ってないだろう。 そういう話ではなく、どういう手法がいいかということで、 jQueryのように丸っと世界を構築するよりも、>>663 のようにするよりも、サブクラスを用意するのが一番折り合いがとれてるという話をしてるんだ。 なにを勘違いして一人で苛立ってるんだ? そしてElements.prototype.__proto__ == Array.prototypeだし、 queryAllが返すのだって列記としたArray exotic objectだから。 ES6からはビルトインコンストラクタはnewTargetを見て適切なプロトタイプを持ったインスタンスを作ってくれるでしょ? 継承するというのはそういうことだよ。 もうホントにね、人の話は聞かない、仕様も読まない知らない、考える力もない、反省もしない。 君と話してると呆れて疲れるね。 >>689 焦点がずれてるな。サブクラスにする危険性をわかってない。 まずElementsがArrayだとしてjQueryに比べれば大幅にメソッドが足りない。 onとかattrとかきりがないから全部言わないよ? そこでElementsのサブクラスを作ってメソッド追加しろって言いたいんだろ? それが危険だという話。 ElementsのサブクラスはArrayでは無くなってしまうから。 なぜなら、 Elementsのサブクラスにhogeというメソッドを作った。 将来のArrayが拡張してhogeというメソッドを作った。 ElementsのサブクラスのhogeとArrayのhogeは別物 つまり、ElementsのサブクラスのはArrayではなくなる。 型あり言語なら型とシグネチャで正しくディスパッチしてくれるが JavaScriptのような言語では無理 そして問題はまだある。 Elementsのサブクラスを作ったからといって、 queryAllがElementsのサブクラスを返してくれるわけじゃない。 DOMのあらゆるAPIがElementsの代わりに、 Elementsのサブクラスを返すようにモンキーパッチしまくらないといけない。 何かを忘れていると、よくわからないエラーが発生することになる。 危険性があるうえに、既存のメソッドを間違いなく修正するという大変な作業が必要。 サブクラスの仕様を考えただけで全てがうまくいくって考えてるようだが経験と想像力が足りないよ。 あと、想像の世界の話をしてないで 実際の動くコード書きなさい。 jsfiddleって知ってるかい? またjQuery厨が暴れて生温かい視線を浴びてるのか。 >>690 論点がずれてるのはあんた。 オーバーライドは問題にならないという話はもう上でしただろ。 想像力がないのか? もし万が一新しいメソッドがArrayやElementsに追加され、 それがサブクラスと被ったら、ライブラリをバージョンアップすればいいだけ。 サブクラスは元クラスのプロトタイプ拡張と違って、明示的に使ってない周りへ影響を与えないし、 環境が新しくなっても、古いバージョンのライブラリに依存してる古いコードが壊れることもない。 それと、queryAllがサブクラスを返したりすることはやらないと言ってるでしょ。 一度ラップしてやれば、例えばmapなんかはArrayではなくきちんとサブクラスのインスタンスを返してくれるように ES6では設計されているので、何度もラップしたりすることなくチェーンできる。 ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる