- JavaScript情報交換所(プログラミング既習者専用) [無断転載禁止]©2ch.net
84 :デフォルトの名無しさん[sage]:2016/04/26(火) 00:50:01.95 ID:6NLvX0gR - >>80
> jQueryは要素ごとの情報の格納場所の必要性を昔から認識していた これは俺もすごく思うが、 実際のところはリークと速度低下が怖くてJavaScript側で持っている。 さすが実用ライブラリだけあって痒い所には手が届いているというところか。 >>82 > handleEventはswitchでイベントを振り分ける必要があって使いづらい。 これは何故?俺は使ったことは無いが、見る限りそういう感じではない。 イベントハンドラは基本的に直リンクというか、振り分け済みの関数を与えるのが基本で、 thisが効くオブジェクトを与えられるのなら、子クラスを与えればいいだけ。 当たり前だがオブジェクト指向の基本どおりだ。 また、最初からイベントハンドラ内で振り分けする気であれば、 ルートNodeにイベントつけてe.targetのclassで判定するのが自然だ。 何か別の条件ではまっただけの気がするが。 とはいえ、DOMの仕様がJavaScriptから見て中途半端なのはJavaとの相乗りが原因だとは理解した。
|
- JavaScript情報交換所(プログラミング既習者専用) [無断転載禁止]©2ch.net
92 :デフォルトの名無しさん[sage]:2016/04/26(火) 23:52:32.19 ID:6NLvX0gR - >>83
前半、言っていることは分かるんだが、現実的には、 this がDOMであるコードと自前のオブジェクトを this 参照するコードを 同一のコードで処理(相互運用)するためには、 自前のオブジェクトをDOMモドキにする必要があって、 (DOMと同じプロパティ等でアクセスできるように形を揃える) これだと余計に苦労する。 だから結局、既に書かれたコードを流用することは難しく、 書き直すかラップしてしまうほうが簡単だ。 多分現実的には相互運用をしている奴は少ないのではないかと思う。 もちろんthisで共通アクセスできないとその可能性すらないからそれよりはマシだが、 現実的にはこの仕様はあっても使えない。
|
- JavaScript情報交換所(プログラミング既習者専用) [無断転載禁止]©2ch.net
93 :デフォルトの名無しさん[sage]:2016/04/26(火) 23:53:03.95 ID:6NLvX0gR - >>82の話の通りなら、handleEventはJava用であって、JavaScript用ではないことになる。
実際、>>85ではメリットが無いだろ。 JavaScriptでわざわざ使うのならメリットがある以下の記述になる。 var hit_list = new Set(); var EventHalndler = function(){ this.status = 'waiting'; } EventHandler.prototype = { handleEvent: function (e) { e.currentTarget.classList.add('hoge'); // class で管理 this.status = 'hit'; // 個別オブジェクトで管理 hit_list.add(e.currentTarget); // Set で管理 } }; var ehandler = new EventHander(); element.addEventListener('click', ehandler); DOM側で管理するならclass、JavaScript側で一括管理でよければSetでいい。 どうしても個別のオブジェクトに格納したければ 「thisを生かして」 使うことになる。 当たり判定のグルーピングを細かく変更したいときはこのやり方が適するけど、 用途はあまり無いと思う。
|
- JavaScript情報交換所(プログラミング既習者専用) [無断転載禁止]©2ch.net
94 :デフォルトの名無しさん[sage]:2016/04/26(火) 23:54:04.46 ID:6NLvX0gR - だから「相互運用」を考えるのなら、
e.currentTargetとthisの両方を異なる意味で用いている上記のようなケースをどうするかであって、 多分これはどうにもならんだろ。 手っ取り早いのはラップ関数内でthis値をMapなりから引っ張ってきてしまうことだが、 要するに書き換えが必要なので仕様をわざわざ合わせた意味がない。 何らかのために仕様をあわせたというのなら、 そのおかげで書き換えなくても済みました!がないと意味が無い。 DOM側からすると妥協だということだが、放置でもよかった気はする。(仕様として追認の必要なし) なお、thisかe.currentTargetの片方しか使ってないコードは自動でも書き換えできる範囲だと思う。 しかしそうなると問題の出所はブラウザの実装で、 何故e.currentTargetに統一せずにthisを渡すことにしたかだな。 正直、あれ、thisで渡されても全くメリットないよな? > DOM4で標準化された事で既存のコードが確実に動作する事が保証された これは多分、気にする人にとっては重要なのだろうけど、 Webサイトなんて10年後の動作を保証されたところで意味が無いし、 「当面(数年)確実に動く」であれば大半の人にとって問題ない。 それが実装主体で推移している原因にもなっていると思う。
|
- JavaScript情報交換所(プログラミング既習者専用) [無断転載禁止]©2ch.net
95 :デフォルトの名無しさん[sage]:2016/04/26(火) 23:55:02.00 ID:6NLvX0gR - >>82
とここまで書いて気づいたが、switch は e.target ではなく e.type か。 確かにこれでは使いにくいな。JavaScriptなら以下で逃げられるが、 これが出来ないからオブジェクトで与えているのだと思われ、Javaでは壮絶な糞コードになりそうだな。 EventHandler.prototype = { handleEvent: function (e) { this[e.type].call(this,e); }, click: function(e){}, mouseover: function(e){}, mouseout: function(e){}, };
|
- JavaScript情報交換所(プログラミング既習者専用) [無断転載禁止]©2ch.net
96 :デフォルトの名無しさん[sage]:2016/04/26(火) 23:55:42.51 ID:6NLvX0gR - >>86
いやそのjQuery.eachのthisは意味があるぞ。 それならthisで書かれたイベントハンドラをeachで回せる。(DOMのイベント寄り) ただe.currentTargetで書くべきだというのと、 そもそも他に代替手段がありまくるので、割とどうでもいいが。 thisを固定したことによるデメリットの方が上回るかもしれない。 ただまあ、そちらの主張どおり、 thisに対しては緩く考える(○○が来ると仮定しない)方が何かと便利なのは事実だろう。
|