1

我有一个 .js 库正在将 mouseup 事件注册到 DOM 元素的情况。DOM 元素被移除和替换,事件被重新注册。这会导致注册两个重复的事件。例如,这里是一个复制品:

请注意:这是使用 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如果已经存在鼠标事件,如何防止第二次调用注册鼠标事件?

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()并将事件直接附加到对象上。然后,当对象被移除时,事件处理程序也会被移除。

如果您因为其他原因不能这样做,那么您还要跟踪是否已经安装了事件处理程序,无论是在全局变量中还是.data()#stranded元素上使用 jQuery。

PS.live()已被弃用,您应该对所有版本的 jQuery 使用.on()(jQuery 1.7+) 或.delegate()(jQuery before 1.7)。

于 2012-08-03T18:37:52.443 回答
0

你为什么要调用 addLive() 函数两次?

删除一个,它会工作:)

于 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 回答