Why is the onClick event triggered twice?
我有以下HTML:
1 2 3 | <span onclick="alert('Boem')"> <button id="test1">test</button> </span> |
当我调用以下javascript时:
1 | $('#test1').trigger('click'); |
onclick事件被触发两次,而我希望它只触发一次。因为jquery应该在dom树中查找op,并且只找到一个onclick。
我不控制跨度,它是在第三方工具中生成的。我可以控制按钮和他的参数。
您可以在这里找到一个JSfiddle示例:http://jsfiddle.net/voga/v4100zke/
更新我不知道跨度的onclick听者的内容。这也是由第三方工具生成的。我希望单击触发器像现在一样执行这个onclick,但只执行一次。
它调用了两次,因为按钮在一个范围内,并且范围内有
您需要使用以下代码停止按钮的默认行为:
1 2 3 | $(function(){ $('#test1').click(function(e){e.preventDefault();}).click(); }); |
演示
要停止事件传播,请使用:stop propagation
1 2 3 4 | $("#test1" ).on("click", function(ev) { ev.stopPropagation(); }); $('#test1').trigger('click'); |
请注意,在DOM中按顺序分配事件。
演示
起泡。子级上的单击事件也发生在父级上(span)。
我也遇到了一个类似的问题,我不得不下载一个PDF文件,它被下载了两次。我使用了jquery的stopImmediatePropagation方法。
1 2 3 4 5 | $("#test1" ).on("click", function(e) { e.stopImmediatePropagation(); }); $('#test1').trigger('click'); |
StopImmediatePropagation将阻止任何父处理程序以及任何其他处理程序执行。有关详细信息,请参阅此处。
我在莫代尔也面临这个问题
通过以下技巧解决-
1 | $('#saveButton').off('click').on('click', { modal: modal }, save) |
这里,
注意,您已经使用了jquery的click方法,它将同时发出dom的mouse click事件和jquery的click事件。然后jquery的click事件和dom的mouse click事件都被传播到span元素,它的onclick侦听器被触发两次,因此它会发出两次警报。
检查这个演示去弄清楚
关于如何处理它,只需使用stoppropagation作为上面的答案。
1 2 3 4 5 6 | $('#test1').click(function() { // comment this line and run, 'parent' will be alerted TWICE!!! since both mouseEvent and jQuery.Event trigger the onclick listener $('#children').click(function(e) {e.stopPropagation()}) }); |
我也有同样的问题。我的事实是,我使用的是
因此,我得到了更具体的描述,并使用
这也应该有效:
1 | $($('#test1').parent()).trigger('click'); |
这里是
1 | One is by the button |
和
要避免两次警报,请使用此
1 2 3 | <span> <button onclick="alert('Boem')" id="test1">test</button> </span> |
这个线索将有助于回答"为什么"。
一个更好的方法是为元素分配一个单击处理程序,以便将JavaScript从HTML中抽象出来:
http://jsfiddle.net/v4100zke/3/
1 2 3 | $('#test1').click(function() { alert('Boem') }); |
希望有帮助。