jQuery点击事件注册错误

7
我有一个按钮,我想要添加一个点击监听器,但每次运行代码时,它都会抛出一个控制台错误。
以下是引发该错误的js代码,第一行正常运行,第二行是导致错误的行: jquery.js:4435 Uncaught TypeError: ((n.event.special[g.origType] || (intermediate value)).handle || g.handler).apply is not a function
$toolbar.off('click', '.btn-save'); // $toolbar is assigned $("#toolbar") on init           
$toolbar.on('click', '.btn-save', function(e){
    saveData(0);
});

让我感到困惑的是,如果我通过控制台手动运行这段代码,就不会出现错误。

以下是HTML代码:

<div class="row" id="toolbar">
<div class="col-lg-12">
    <button type="button" class="btn btn-primary btn-save">Save</button>
    <button type="button" id="btnCancel" class="btn btn-default btn-cancel">Cancel</button>
</div>
</div>

2
如果你想要调试帮助,你应该提供足够的代码让其他人能够轻松运行。制作一个jsfiddle是一个不错的选择... - Robert Munn
4个回答

7
我已经找到了问题,下面我的监听器中,有一个不相关的监听器被我附加上去了。 $(document).on("click", "#btn-back", Views.Editor.close);
问题在于,这里的 Views.Editor.close 是错误的方法名。 当我更改了方法名之后,错误就消失了。
我没有意识到一个不相关的监听器会影响其他监听器。

在Internet Explorer 11中,遇到了同样的问题。原来有一个无效的事件监听器被我忽视或遗忘了:.on("click", ".")。实际上,即使只有一个无效的监听器,也可能会破坏其他监听器的功能,至少如果脚本执行设置为在每个异常处停止的话是这样的。请注意,这个错误也会出现在jQuery的开发/完整版本中。 - Tacticus

0

啊,看起来如果我理解了问题/你想做什么,你可能把JQuery参数搞错了。

DOM事件应该附加到HTML中的项目上:

html:

<div class="row">
<div class="col-lg-12">
    <button id="save-btn-id" type="button" class="btn btn-primary btn-save">Save</button>
    <button type="button" id="btnCancel" class="btn btn-default btn-cancel">Cancel</button>
</div>
</div>

js:

$(document).ready(function() {
  $('#save-btn-id').click(function(evt) {
    saveData(0);
  });
});

也不起作用,我已经尝试了我所知道的所有3种点击分配类型,$btn.click(func),$btn.on('click', func)和$toolbar.on('click', '#btn', func)。 - iceman2992

0
尝试这个:https://jsfiddle.net/jorge182/a1y9abcj/2/
toolbar =  $("#toolbar")


$(toolbar).off('click', '.btn-save'); // $toolbar is assigned $("#toolbar") on init           
$(toolbar).on('click', '.btn-save', function(e){
    saveData();
});


function saveData(){
   alert();
}

嗯,不知道为什么在 jsfiddle 上尝试时似乎无法工作。 - iceman2992
可能是代码遗留问题,你不想深入研究它,但我认为在一行中停用一个操作,然后在下一行中激活它没有太多意义...我会删除设置按钮关闭的那一行。 - cralfaro

0
从我在jQuery的API文档中看到的.off()函数和上面的代码示例中,似乎该函数没有作为第三个参数传递给.off()函数。因此,jQuery库可能会抱怨找不到要删除的函数。
请参见:http://api.jquery.com/off/ 尝试这个方法,看看是否有帮助:
function clickListener(e){
    saveData(0);
};

$toolbar.off('click', '.btn-save', clickListener);
$toolbar.on('click', '.btn-save', clickListener);

我刚刚尝试了一下,不幸的是它不起作用。我甚至尝试注释掉.off()命令,结果还是一样的。 - iceman2992
代码在这个版本为2.2.1的jsfiddle上运行良好:https://jsfiddle.net/briankueck/75ucysvx/ - Clomp
当查看此链接:http://code.jquery.com/jquery-2.2.1.js时,我发现代码在4731-2行。您可能需要在这些行之前在本地主机jquery.js文件中放置调试器,以查看此代码行中的值:“ret =((jQuery.event.special [handleObj.origType] || {})。handle || handleObj.handler).apply(matched.elem,args);” - Clomp

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