我正在使用jQuery,我正在尝试在click函数中添加一个单击触发器以用于其他链接。继承人我所拥有的:
$('.details .banner .banner_link').on("click", function(e){
e.stopPropagation();
e.preventDefault();
$('a.banner_link').trigger("click");
});
正如您所看到的,我正在使用stopProp和PreventDef,但我仍在使用:
Uncaught RangeError: Maximum call stack size exceeded
这让我发疯了,我已经坚持了一段时间任何帮助,或者至少为什么会发生这种情况?!
背景:
上面代码中的.banner_link和a.banner_link是同一页面上的两个单独链接。我把html用于a.banner_link并将其(通过js)添加到页面上以在单独的位置显示相同的链接。
我想在新创建的链接中模拟原始链接的行为(它会导致模式弹出),因此我使用触发器("单击")函数来执行此操作。
注意:
如果我只是在外部点击功能范围之外运行触发器('点击'),它运行正常!
答案 0 :(得分:0)
自
以来,这是一次无限递归$('a.banner_link').trigger("click");
将再次调用click处理程序,依此类推。
由于“点击”不是真实事件,e.stopPropagation();
将无效(因为实际点击已经停止传播)。
您可以使用状态变量来停止
$('.details .banner .banner_link').on("click", function(e){
if ( $(this).clickstate )
return:
e.stopPropagation();
e.preventDefault();
$(this).clickstate = true;
$('a.banner_link').trigger("click");
});
更智能的方式就是改变选择器:
$('.details .banner a.banner_link').on("click", function(e){
// do what needs to be done ...
});
另一种方法是将a.banner_link
的点击处理程序的内部封装到一个函数中并调用它:
function aClick() {
...
}
$('.details .banner .banner_link').on("click", function(e){
e.stopPropagation();
e.preventDefault();
aClick();
});
$('a.banner_link').on("click", function(e){
aClick();
});
答案 1 :(得分:0)
由于链接有一个绑定到它的点击事件,当您移动链接并触发点击时,点击事件将再次触发,这反过来调用点击触发器为永恒。
为什么需要手动触发点击事件?如果你的模态对话框显示逻辑在一个函数中,只需要点击事件调用该函数。如果它不在一个单独的函数中,它应该是。
stopPropagation和preventDefault将停止向上传播树的事件,并分别阻止click事件的默认操作,但调用触发器来点击'该按钮再次超出了这些功能的范围