0

だから、ここに状況があります。同じタイプのオブジェクトがいくつかあり、それらはすべて同じイベントをリッスンしています。これらの各オブジェクトのハンドラーは、DOMの一部を操作します。これらのオブジェクトは、ほとんどいつでも再作成または破棄できます。破棄されると、オブジェクトが担当するDOMの一部になります。問題は、これらのオブジェクトのハンドラーが固執し、オブジェクトが破棄された後もDOMを操作しようとし続けることです。

以下は私が持っているコードで、うまくいくようです。ただし、ハンドラーが破棄される方法は気にしないので、jQueryには適さない可能性があります。もっと良い方法はありますか?

        var ID: "uniqueID",
    connectEvents: function ()
    {
      $(someDiv).on("customEvent", this, this.eventHandler);
    },
    eventHandler: function (e)
    {
        //do some stuff to the DOM
    },
    destroy: function ()
    {
      var gridCell = this;
      if (jQuery(someDiv).data("events"))
      {
         var handlers = jQuery(someDiv).data("events").customEvent
         var handlerIndex = -1;
         $(handlers).each(function (i, handler)
         {
            if (handler.data.ID === ID)
               handlerIndex = i;
         });
         if (handlerIndex > 0)
         {
            handlers.splice(handlerIndex, 1);
         }
      }
      //Destroy some Dom elements
    }
4

2 に答える 2

0

イベント処理は、次のステートメントを使用して祖先 div に委任されます。

$(someDiv).on("customEvent", this, this.eventHandler);

これが をアタッチする唯一のステートメントであり、ターゲット要素が削除された後も動作this.eventHandlerが見られる場合は、その「customEvent」を祖先 div に委譲する他の要素をまだ含める必要があります。eventHandlersomediv

@charlietfl の提案によるイベントの名前空間は、差し迫った問題を解決する可能性がありますが、完全な解決策ではないと思います。もっと根本的なものを修正する必要があります。

おそらく、「customEvent」を自分が思っているよりも多くの要素に委譲している可能性があります。

于 2013-01-16T23:08:59.217 に答える
0

要素が同様のクラス「テスト」を持っているとしましょう。

あなたができることは次のとおりです。

$('.test').click(function(){
   $(this).off(); // remove all event handlers assigned to this object with class test that has been clicked.

   $(this).remove(); // removes the element
})
于 2013-01-16T22:26:43.560 に答える