开发者问题收集

在列表元素内触发 .click() 会产生错误

2016-05-17
79

我有一个列表,其中可以包含纯文本或链接。如果有链接,则整个列表元素必须是可点击的。因此,当我执行此操作时:

if ($('.link').length) {
  $('li[data-contains-link]').on('click', function (e) {
      $('.link').click()    
  })
}

它给出了错误: Uncaught RangeError:超出最大调用堆栈大小

有什么方法可以避免这种情况?

3个回答

您在点击事件之后引发点击事件 - 可能是递归调用。请确保 li[data-contains-link] 不是 .link ,否则将陷入无限循环。

Ramesh Soni
2016-05-17

$('.link') 位于 $('li[data-contains-link]') 内部

或者

某些 $('li[data-contains-link]') 具有类链接。

这会将您置于一个循环中,该循环监听点击,然后在自身或其子项之一上生成点击,从而进行递归。

prateekbh
2016-05-17

尝试在 .link 的点击处理程序中添加 event.stopPropagation()

 $('li[data-contains-link]').on('click', function (e) {
    $('.link').click();    
 })

$('.link').on('click', function (e) {
    e.stopPropagation(); // <---addd it here.
    console.log('.link elem clicked!!!!');    
 })

由于此属性选择器 li[data-contains-link] 表明它是一个具有 .link 元素的父元素。由于您已在父元素上绑定了点击事件,并且正在触发子元素上的点击,因此会进行递归调用,从而导致错误: Uncaught RangeError: Maximum call stack size reached

这是由于 事件冒泡 造成的。 event.stopPropagation() 可用于停止事件冒泡到父元素,因此不会有任何递归调用,因为父元素不会获取事件。

Jai
2016-05-17