JSFiddle 不管理函数内的点击事件

JSFiddle does not manage click events inside a function

我有一个非常简单的 JSFiddle

HTML

<input type="button" value="Submit" id="myBtn" onclick="foo()">

JS

function foo(){
    console.log('click');

  $("#myBtn").click(function(event) {
    console.log('click2');
  });

    console.log('click3');

}

这是 link:https://jsfiddle.net/mdvyo481/

我已经在 No Wrap - Head 模式下加载了脚本。奇怪的是,当我单击该按钮时,clickclick3 会打印在控制台中,但 click2 不会打印。如果我再次点击它,我会打印 2 张 click2

看起来 event 在 fiddle 中没有得到妥善管理。有办法解决吗?

这是正确的行为。发生这种情况的原因是因为您在调用 foo 函数时绑定了事件 click。第一次调用 foo 时绑定事件,第二次再次绑定,依此类推。绑定事件不会删除之前的绑定,因此如果您单击 submit 10 次,您将绑定 10 个不同的 click 事件处理程序,它们都做同样的事情,您将收到 'click2'在控制台中 10 次。

使用 jquery 或使用 onclick 属性在您的按钮上添加点击处理程序,但不能同时使用。

我提供了两个示例来说明这一点:

function foo(element) {
  console.log(element.id + ' was clicked <- onclick attribute handler')
}


$("#myBtn").click(function(event) {
  console.log(event.target.id + ' was  clicked, <- jQuery handler')
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<input type="button" value="Submit" id="myBtn" onclick="foo(this)">

您的示例不起作用的原因是您仅在调用 foo() 后才设置 jquery 点击处理程序,因此它不会触发。