それなりブログ

とあるWebエンジニアのそれなりのブログ、JavaScript/Node.js/Python/PHP/ゲーム作成 など

Event.stopObservingをしてもゴミが残る

prototype.jsのイベント追加・削除周りの話です。
バージョンは、script.acluo.us1.7.0内の1.5.0っす
Event.observeでイベントを追加して、
Event.stopObservingでイベントを削除するのがprototype.jsルールなんすけど、
それでイベントを削除しても、内部のEvent.observersにゴミが残ってるということに気づいた。
ユーザの操作により、イベントを上書きをするものを作ってたのですが、
どうもprototype.jsにはイベントの上書き手段がないようなので、
仕方なしに、イベント削除→追加で代替しようと思いきや、なんか釈然としない仕様。
見なきゃ良かった。
ちなみに、Event.stopObservingをする際には
Event.observeの引数に入れた関数と全く同じものを引数で渡す必要があるようです。

これはネイティブのelement.removeEventListenerとかelement.detachEventの仕様みたいなんですけど、何で関数を渡さないと削除できないんだろう??

3hハマり
あああああ
↑の件なんですけど、そりゃ関数を渡さないとダメですな

element.addEventListener("click", handlerA, false);
element.addEventListener("click", handlerB, false);

これで、elementオブジェクトに、2つイベントを登録できるので
片方を明示的に指定したい場合は、関数を渡す以外に判断方法がないすね
nobu氏が教えてくれた。ありがとう。

ついでにIE6で

element.attachEvent("onclick", handlerA);
element.attachEvent("onclick", handlerB);

これをやったら、複数イベントが登録できました。
“element.addEventListener(“click”, handler, false);” と、大体同じだと思っていいのかしらん。


3 Responses to “Event.stopObservingをしてもゴミが残る”

  • nobu より:

    >何で関数を渡さないと削除できないんだろう??
    indexに対するlistenerではなく、listenerそのものがindexとして働いているからでは?と言ってみたり。

  • kjirou より:

    多分、そうですよねー。
    そうだとして、1要素1イベントなら、そのindexは不要じゃないか、って疑問があるんですけど
    結局は「まずは仕様書を読んでからだ」って話になりそうなので、この辺で誤魔化しておこうかと思ってました。
    ご存知でしたら、教えて下さいませ。

  • kjirou より:

    ・・・と、リアルで指摘ありがとうす。
    記事に追記しました。


Categories

Archives