为什么这种解体不起作用?

时间:2009-04-29 20:03:10

标签: javascript jquery javascript-events

我几分钟前尝试回答this question并为自己准备了这个例子:

<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 个答案:

答案 0 :(得分:11)

由于jQuery的事件模型,第一个unbind场景不起作用。 jQuery将每个事件处理函数存储在一个数组中,您可以通过$(“#foo”)。data('events')访问它。 unbind函数仅查找此数组中的给定函数。因此,您只能取消绑定()使用bind()

添加的事件处理程序

答案 1 :(得分: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双重绑定,然后在按下第二个按钮时完全取消绑定它)。问题是这种形式从来没有真正“束缚”开始。您可以在标记中取消绑定onsubmit个参数。

答案 2 :(得分:3)

您可以取消绑定以下方式:p

  

$( '#aspnetForm')removeAttr( '的onsubmit');

答案 3 :(得分:1)

之前我遇到过类似的问题。我得出的结论是,你只能取消绑定你绑定的方法。由于trialmethod()没有通过jquery绑定,因此调用unbind对该方法无效。

如果你有任何机会弄明白,请告诉我们。

感谢。

答案 4 :(得分:1)

绑定,取消绑定和表单提交操作存在错误:

如果您绑定然后取消绑定,并且您想要提交表单,则无法使用$(form).submit(),但是$(form INPUT[type=submit]).click()

答案 5 :(得分:0)

据我在jQuery API文档中看到的,unbind()已被弃用: https://api.jquery.com/unbind/

  

自jQuery 3.0起,不推荐使用.unbind()。被它取代   自jQuery 1.7以来的.off()方法,因此它的使用已经   灰心丧气。

应该使用off()方法。