未捕获RangeError:超出最大调用堆栈大小 - jQuery错误

时间:2015-10-19 15:24:42

标签: javascript jquery google-chrome stack-overflow

我正在使用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)添加到页面上以在单独的位置显示相同的链接。

我想在新创建的链接中模拟原始链接的行为(它会导致模式弹出),因此我使用触发器("单击")函数来执行此操作。

注意:

如果我只是在外部点击功能范围之外运行触发器('点击'),它运行正常!

2 个答案:

答案 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事件的默认操作,但调用触发器来点击'该按钮再次超出了这些功能的范围