为什么我的点击事件在jquery中被调用了两次?

shu*_*uji 11 checkbox jquery click onclick

为什么我的click事件在jquery中被触发了两次?

HTML

<ul class=submenu>
    <li><label for=toggle><input id=toggle type=checkbox checked>Show</label></li>
</ul>
Run Code Online (Sandbox Code Playgroud)

使用Javascript

$("ul.submenu li:contains('Show')").on("click", function(e) {
    console.log("toggle");
    if ($(this).find("[type=checkbox]").is(":checked")) console.log("Show");
    else console.log("Hide");
});
Run Code Online (Sandbox Code Playgroud)

这是我在控制台中得到的:

toggle                     menu.js:39
Show                       menu.js:40
toggle                     menu.js:39
Hide                       menu.js:41


> $("ul.submenu li:contains('Show')")
[<li>?                                            ]
    <label for=?"toggle">?
      <input id=?"toggle" type=?"checkbox" checked>?
      "Show"
    </label>?
</li>?
Run Code Online (Sandbox Code Playgroud)

T.J*_*der 29

如果我没有记错,我已经看到了至少某些浏览器这种行为,其中点击label 触发点击label input.

所以,如果你忽略了其中的事件e.target.tagName"LABEL",你只得到了一个事件.至少,这是我在测试中得到的:

  • 这只是为我节省了几个小时的头发.谢了哥们. (3认同)

big*_*igT 6

input标记在标记内构造时会发生此行为label

<label for="toggle"><input id="toggle" type="checkbox" checked>Show</label>
Run Code Online (Sandbox Code Playgroud)

如果input复选框放在 外面label,使用idfor属性,click不会发生事件的多次触发:

<label for="toggle">Show</label>
<input id="toggle" type="checkbox" checked>
Run Code Online (Sandbox Code Playgroud)


Pat*_*h92 6

我建议您在change上使用input[type="checkbox"]只会触发一次的事件。因此,为解决上述问题,您可以执行以下操作:

$("#toggle").on("change", function(e) {
  if ($(this).is(":checked"))
    console.log("toggle: Show");
  else
    console.log("toggle: Hide");
});
Run Code Online (Sandbox Code Playgroud)

https://jsfiddle.net/ssrboq3w/

使用querySelector的原始JS版本与IE的较早版本不兼容:

document.querySelector('#toggle').addEventListener('change',function(){
  if(this.checked)
    console.log('toggle: Show');
  else
    console.log('toggle: Hide');
});
Run Code Online (Sandbox Code Playgroud)

https://jsfiddle.net/rp6vsyh6/

  • 应该被接受,因为听起来更合乎逻辑 (2认同)