我有两个带有两个div的jsfiddler设置:
<div class="d1" style="background-color: red; position: fixed; top: 0; bottom: 0; right; 0; left: 0; right: 0;">
<div class="d2" style="width: 200px; height: 100px; background-color: green; position: relative; top: 100px; left: 100px;"></div>
</div>
$(function() {
$('.d1').on('click', function(event) {
alert('clicked on red');
});
$('.d2').on('click', function(event) {
alert('clicked on green');
});
});
<div class="d1" style="width: 200px; height: 100px; background-color: red; position: relative; top: 100px; left: 100px;">
</div>
<div class="d2" style="width: 200px; height: 100px; background-color: green; position: relative; top: 100px; left: 100px;"></div>
$(function() {
$('.d1').on('click', function(event) {
alert('clicked on red');
});
$('.d2').on('click', function(event) {
alert('clicked on green');
});
});
在这两种情况下,我点击绿色div,并且不释放鼠标按钮,我将指针移动到红色div上,然后释放按钮。在第一次设置中,红色div触发click
事件,而第二次设置则不触发事件。
为什么会有差异?
答案 0 :(得分:4)
因为click
是mousedown
和mouseup
一组事件的简写。
点击事件仅在这一系列事件发生后触发:
指针在指针内时按下鼠标按钮 元件。
当指针位于内部时,鼠标按钮被释放 元件。
如果两个条件都不满足,则该功能不会触发。
所以
单击绿色div,在不释放鼠标按钮的情况下,将指针移动到红色div上,然后释放按钮。
只有红色功能触发,因为mousedown
发生在红色div内的绿色div 上,因此红色div也被点击,mouseup
发生在红色的div。
所以mousedown
和mouseup
只发生在红色div上。
答案 1 :(得分:0)
在上面的设置(1)中,绿色的是绿色的孩子。因此,当您单击绿色时,它会自动点击父项,因此即使点击红色div也是如此。
通常,您不会发现此问题,因为当click事件已经绑定到子元素时没有任何绑定到父级的click事件,就像setup(2)一样。
单击父项不会触发对子项的单击,除非鼠标位于子项的已定义域中,换句话说,如果有人单击子元素本身。
答案 2 :(得分:0)
在你的第一步为什么它的工作原理与其他提到的答案一样,绿色div在红色div中。因此,如果您单击绿色div单击事件以激活绿色div。同时由于JS漂亮的功能事件冒泡相同的点击事件传递给它的红色div的父母。
因此,当您单击绿色div鼠标按下事件时,同时触发绿色div和红色div。当你的鼠标移动到红色div并释放它时,红色div的点击事件会触发,但不会触发绿色div。因为要进行点击事件,您需要将鼠标按下并向上鼠标。但在你的情况下鼠标没有为绿色div开火。
在你的第二次设置中,两个div彼此相邻而不是另一个。因此附加到两个div的事件都是个人的。
所有其他答案都是正确的我只是解释理论:D
答案 3 :(得分:0)
如果您需要通过此问题,可以执行类似
的操作$(document).on("mousedown", function(e){
var tar = $(e.target).attr('class');
$(document).on("mouseup",function(){
if (tar == "d1"){
alert("clicked on red");
}
if(tar == "d2"){
alert("clicked on green");
}
$(document).off("mouseup");
});
});
不确定是否是这种情况,只是提出来了。