1

.js ライブラリが mouseup イベントを DOM 要素に登録している状況があります。DOM 要素が削除され、置き換えられ、イベントが再登録されます。これにより、2 つの重複したイベントが登録されます。たとえば、ここに再現があります:

注意:これは jQuery バージョン 1.4.4 を使用しています

<div id="top">
 <div id="nested">
  <div id="stranded">
   Alien Code
  </div>
 </div>
</div>​

<script type="text/javascript">
 function addLive(){
  $("#stranded").live("mouseup",
   function (e) {
    var node = document.getElementById("stranded");
    var nodeCopy = $(node).clone(true)[0];
    var tar  = document.getElementById("nested");
    tar.appendChild(nodeCopy);
   }
  );
 }
 addLive();
 addLive();
</script>

また、ここに jsFiddle があります: http://jsfiddle.net/3zbtK/

addLiveマウスイベントが既に存在する場合、2 回目の呼び出しでマウスイベントが登録されないようにするにはどうすればよいですか?

4

4 に答える 4

1

新しいより良いものを登録する前に、イベント ハンドラーの削除を試みることができます。

それができない場合、問題がデフォルトのハンドラーにある場合は、それらを無視できます。

あなたが探しているのは preventDefault だと思います

<script>
$("a").click(function(event) {
  event.preventDefault();
  $('<div/>')
    .append('default ' + event.type + ' prevented')
    .appendTo('#log');
});
</script>

また、それをテストすることもできます

たとえば、アンカーをクリックしても、ブラウザーは新しい URL に移動しません。event.isDefaultPrevented() を使用して、このメソッドが、このイベントによってトリガーされたイベント ハンドラーによって呼び出されたかどうかを判断できます。

于 2012-08-03T18:37:29.807 に答える
1

編集の制約が何であるか、および変更できるコードを正確に教えてくれません。

最も簡単な方法は、使用をやめて.live()、イベントをオブジェクトに直接アタッチすることです。次に、オブジェクトが削除されると、イベント ハンドラーも削除されます。

他の理由でそれができない場合は、イベント ハンドラーが既にインストールされているかどうかを、グローバル変数で、または要素で jQuery を使用して追跡し.data()ます#stranded

PSは廃止されたため、jQuery のすべてのバージョンで(jQuery 1.7+) または(1.7 より前の jQuery).live()を使用する必要があります。.on().delegate()

于 2012-08-03T18:37:52.443 に答える
0

addLive()関数を2回呼び出すのはなぜですか?

1つ削除すると、機能します:)

于 2012-08-03T18:36:39.887 に答える
0
function addLive(){
 $("#stranded").die("mouseup");
 $("#stranded").live("mouseup",
  function () {
   var node = document.getElementById("stranded");
   var nodeCopy = $(node).clone(true)[0];
   var tar  = document.getElementById("nested");
   tar.appendChild(nodeCopy);
 }
);
}
于 2012-08-03T19:10:08.373 に答える