'点击()'的click事件处理
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()
,再次分派点击事件,依此类推。但结果与我想的不一样,只输出两次'点击'(IE输出一次'点击')。
现在更改fire
函数,创建一个click事件并分派它,结果如预期。
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()
无关。
你的.click()
做了与之相关的动作(如下面的链接)bud并没有触发click
event> no log
函数再次被调用,所以没有执行重复的点击事件。
在第二个版本中,你经常触发click
事件,所以你的log
函数执行无限次。
dispatchEvent
将事件同步发送到目标,所以当您使用dispatchEvent
时,事件处理程序帧在堆栈上累积并最终溢出。因此,打印无限click
并填充您的堆栈(控制台异常)。请参阅documentation
但是,当您在javascript中使用.click()受控事件时。它仅模拟一个事件,即click
而不是连续同步呼叫。请参阅documentation获取更多帮助。
呃,这里没有使用jQuery。 –
appologies。但是这两种方法(JavaScript和JQuery的'click()')都以相同的方式工作。看到更新的答案。 –
你能解释一下吗?为什么日志不再被调用? – Rajesh
@Rajesh没有执行'click'事件 - 没有'log'函数执行 – Justinas
@Justinas为什么'log'和'fire'被调用两次?据你说,'log'应该只被调用过一次。但console.log显示两个执行:https://jsfiddle.net/wostex/82d39L4n/1/ – wostex