未接管的连击:超过最大呼叫堆栈大小 - jQuery错误
我正在使用 jQuery,我试图在点击函数内为不同的链接添加点击触发器。以下是我所拥有的:
$('.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 是同一页面上的两个独立链接。我获取了 a.banner_link 的 html 并将其(通过 js)添加到页面上,以在单独的位置显示相同的链接。
我想在新创建的链接中模拟原始链接的行为(它会导致模式弹出),因此我使用触发器(“click”)函数执行此操作。
注意:
如果我只是在外部点击函数范围之外运行触发器('click'),它运行良好!
由于链接绑定了点击事件,因此当您移动链接并触发点击时,点击事件将再次触发,从而永远调用点击触发器。
为什么需要手动触发点击事件?如果您的模态对话框显示逻辑在函数中,则只需让点击事件调用该函数即可。如果它不在单独的函数中,则应该这样做。
stopPropagation 和 PreventDefault 将分别停止事件沿树向上传播,并阻止点击事件的默认操作,但调用触发器再次“点击”按钮超出了这些函数的范围
这是一个无限递归,因为
$('a.banner_link').trigger("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();
});