开发者问题收集

未接管的连击:超过最大呼叫堆栈大小 - jQuery错误

2015-10-19
1721

我正在使用 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'),它运行良好!

2个回答

由于链接绑定了点击事件,因此当您移动链接并触发点击时,点击事件将再次触发,从而永远调用点击触发器。

为什么需要手动触发点击事件?如果您的模态对话框显示逻辑在函数中,则只需让点击事件调用该函数即可。如果它不在单独的函数中,则应该这样做。

stopPropagation 和 PreventDefault 将分别停止事件沿树向上传播,并阻止点击事件的默认操作,但调用触发器再次“点击”按钮超出了这些函数的范围

Steven Brookes
2015-10-19

这是一个无限递归,因为

$('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();
    });
Axel Amthor
2015-10-19