为什么在删除className后触发了附加到className的click事件?

时间:2016-08-20 17:59:03

标签: javascript jquery

相关:Jquery timeout for doubleclick

鉴于此代码:



function handleClick() {
  var div = $(this);
  var original = $(this).html();
  div.html("Tap again");
  $(".onlyfire").addClass("fire").off("click");
  $(".fire").one("click", function(fire) {
    alert("this should not be showing once the text is changed back to original");
    $(this).off("click")
  });
  setTimeout(function() {
    $(div).html(original);
    $(".onlyfire").removeClass("fire").click(handleClick);
  }, 2000);
}

function onlyfire() {
  $(".onlyfire").click(handleClick);
};
onlyfire();

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js">
</script>
<div class="onlyfire">
  Do Something
</div>
&#13;
&#13;
&#13;

fire之后的className元素移除了.onlyfire 2000ms,其中预期结果是附加到click的{​​{1}}事件也会被渲染为不适用,因为.fire中不会有.fire元素。

然而,正如comment

指出@ 120382833
  

点击“执行某事”,等待2秒,直到“执行某事”为止   返回,再次点击它会显示警告..它不应该......它   应该再次显示点按,只有在前2秒点击时才会显示   警报应该出现。

重现

  1. document;
  2. 处检查.onlyfire元素
  3. 点击console元素;
  4. 两秒钟不做任何事;
  5. 原始文本应设置为.onlyfire元素;
  6. .onlyfire .fire将从className元素;
  7. 中删除
  8. 再次点击.onlyfire元素
  9. 附加到.onlyfire元素的处理程序被调用,然后调用.fire,但此时alert("this should not be showing once the text is changed back to original")中不存在.fire元素
  10. 问题:这是一个jQuery错误,还是预期的行为?或者,我们是否忽略了document中可以解释结果的内容?

2 个答案:

答案 0 :(得分:4)

事件处理程序绑定到元素而不是它们的classNames。静态事件处理程序不像委托事件处理程序那样工作。

答案 1 :(得分:4)

这是预期的行为。

附加事件处理程序后,对该元素所做的类更改不会影响事件将触发事件处理程序的事实。该类仅在查找附加处理程序的元素时起作用。完成后,类选择器不再起作用。