解除jQuery事件处理程序

8

我刚刚试着回答这个问题,并为自己准备了这个例子:

<script>
  function trialMethod()
  {
    alert('On Submit Run!'); return true;
  }
  function trialMethod2()
  {
    alert('On Submit Run trialMethod2!'); return true;
  }
</script>

<form id="aspnetForm" onsubmit="trialMethod();">
    <input type="submit">
</form>

为什么第一个解除绑定不起作用:
<input type="button" id="btnTrial1" value="UNBIND 1" 
   onclick="$('#aspnetForm').unbind('submit', trialMethod);">

但是这个可以用于trialMethod2方法:
<input type="button" id="btnTrial2" value="UNBIND 2" 
   onclick="$('#aspnetForm').bind('submit', trialMethod2).unbind('submit', trialMethod2);">
6个回答

13

第一个解绑定场景无法生效,这是因为jQuery的事件模型。jQuery将每个事件处理函数存储在一个数组中,你可以通过$("#foo").data('events')访问该数组。 unbind 函数只在该数组中查找给定的函数。因此,你只能使用 bind() 添加的事件处理程序来执行 unbind().


5

如果使用jQuery,任何人都不应该混淆他们的标记与交互代码。

在页面上添加一些JavaScript代码,如下所示:

$(function() {
    $('#aspnetForm').bind('submit',function() {
        trialMethod();
    });
    $('#btnTrial2').bind('click',function() {
        $('#aspnetForm').unbind('submit');
    });
    $('#btnTrial2').bind('click',function() {
        $('#aspnetForm').bind('submit', trialMethod2).unbind('submit');
    });
});

现在,问题已经解决了... 现在一切都应该正常工作(即使在第二个按钮被按下后完全解绑#aspnetForm前,您现在将双重绑定#aspnetForm)。问题在于表单从一开始就没有真正“绑定”。您可以在标记中解除onsubmit参数的绑定。


没有人应该将他们的标记与交互代码混在一起,就这样。 - eyelidlessness
确实,它们永远不应该结合在一起。没有任何例外。特别是如果你正在使用jQuery :D。 - KyleFarris

3
您可以通过删除相应的属性来解除绑定:
 $('#aspnetForm').removeAttr('onsubmit');

1

我之前遇到过类似的问题。我的结论是,你只能解绑已经绑定的方法。由于trialmethod()并没有通过jquery绑定,调用unbind方法将不起作用。

如果你有机会弄清楚,请告诉我们。

谢谢。


1

bind、unbind 和表单提交操作存在一个错误:

如果你绑定了事件然后解除绑定,而你想要提交表单,你不能使用 $(form).submit(),而是要使用 $(form INPUT[type=submit]).click()


0
据我所见,在jQuery API文档中,unbind()已被弃用:https://api.jquery.com/unbind/ 引用如下:
自jQuery 3.0起,.unbind()已被弃用。自jQuery 1.7以来,它已被.off()方法取代,因此其使用已经不建议了。
应该使用off()方法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接