对不起我的英语,我不是以英语为母语的人。
我的代码有问题。我的页面上有这样的东西:
$('#hook label').on('click', function() {
console.log('ok');
icon = $(this).next('input').val();
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<div id="hook">
<label><input> <img src="http://placehold.it/35x35" ></label>
<label><input> <img src="http://placehold.it/35x35" ></label>
<label><input> <img src="http://placehold.it/35x35" ></label>
<label><input> <img src="http://placehold.it/35x35" ></label>
</div>
如果单击图像,此代码运行两次,但是当我单击input或label元素时,只运行一次。如何阻止两次运行?
答案 0 :(得分:5)
这是因为标签的默认行为。要停止它,您需要告诉事件对象停止是默认行为,如下所示:
$('#hook label').on('click', function(ev) {
ev.preventDefault();
console.log('ok');
icon = $(this).next('input').val();
});
单击与for
属性相关联的标签或标签内的标签,将输入与“假”点击事件对焦。这就是为什么你通过扩展获得两次事件的原因,如果你点击输入,你也点击标签(父母)。
答案 1 :(得分:1)
这是两次,因为当您点击标签时,它也会向输入发送点击事件,并且新事件会回到标签。这很棘手:)
所有浏览器都提供更好的表单可用性。
所以另一个可能的解决方案是:
$('label').click(function(e) {
if (e.target.tagName === "LABEL") {
alert("!! here")
}
});
答案 2 :(得分:0)
您只需要添加一个preventDefault()。
$('#hook label').on('click', function(e) {
e.preventDefault();
console.log('ok');
});
我希望它对你有帮助。
答案 3 :(得分:-2)
如果要阻止事件被触发两次,可以使用'mousedown'事件处理程序。它只会被触发一次,因为它不会通过单击标签触发标准。