【问题标题】:`click()` in click event handler点击事件处理程序中的`click()`
【发布时间】:2017-05-05 06:51:44
【问题描述】:

测试:

var btn = document.querySelector('button')
btn.addEventListener('click', log)

function log(event) {
  var p = document.createElement('p')
  p.textContent = event.type
  document.body.appendChild(p)
  fire()
}

function fire() {
  btn.click()
}
<button type="button">Click me</button>

我认为会抛出异常。点击事件处理程序中的click() 调度点击事件,点击事件处理程序再次调用click(),它再次调度点击事件,依此类推。但是结果和我想的不一样,它只输出了两次'click'(IE 输出了一次'click')。

现在改一下fire函数,创建一个click事件并dispatch,结果如预期。

  var btn = document.querySelector('button')
  btn.addEventListener('click', log)

  function log(event) {
    var p = document.createElement('p')
    p.textContent = event.type
    document.body.appendChild(p)
    fire()
  }

  function fire() {
    var event = new MouseEvent('click')
    btn.dispatchEvent(event)
  }
<button type="button">Click me</button>

我的问题是为什么click() 的行为不同?

注意:不使用jQuery,与jQuery方法.click()无关。

【问题讨论】:

    标签: javascript


    【解决方案1】:

    dispatchEvent 将事件同步发送到目标,因此当您使用dispatchEvent 时,事件处理程序帧会在堆栈上累积并最终溢出。因此,打印无限 click 并填充您的堆栈(控制台异常)。见documentation

    但是,当您使用 .click() 时,JavaScript 中的受控事件。它只模拟一个事件,即click,而不是连续同步调用。如需更多帮助,请参阅documentation

    【讨论】:

    • 嗯,这里没有使用jQuery。
    • 应用程序。但是这两种方法(JavaScriptclick() 和`JQuery)都以相同的方式工作。查看更新的答案。
    【解决方案2】:

    您的.click() 执行与它相关的操作(如以下链接)芽不会触发click 事件> 没有再次调用log 函数,因此不会执行重复的点击事件。

    在第二个版本中,您不断触发click 事件,因此您的log 函数将无限次执行。

    【讨论】:

    • 你能再解释一下吗?为什么没有再次调用日志?
    • @Rajesh 未执行 click 事件 - 未执行 log 函数
    • @Justinas 为什么logfire 被调用了两次?根据你的说法,log 应该只被调用一次。但是 console.log 显示了两个执行:jsfiddle.net/wostex/82d39L4n/1
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-28
    • 2015-09-24
    • 2011-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多