2016-02-10 6 views
3

Я хочу что-то сделать, нажав на body, за исключением menutop, который находится внутри body.щелкните по телу, за исключением конкретных div

<body> 
<div id="menutop">lorem ipsum...</div> 
... 
</body> 

JS

$("body").not($("#menutop")).click(function(){ 
    console.log("323"); 
}); 

также попытался

var n = $("#menutop"); 
$("body:not(n)").click(function(){ 
    console.log("323"); 
}); 

, но нажав на menutop в обоих случаях консоль показывает 323

ответ

5

Селектор $("body").not($("#menutop")) будет выбрать body элемент, если это не t #menutop элемент. Поскольку элемент body явно не является элементом #menutop, элемент body по-прежнему выбран, и к нему присоединяется событие click.

Даже если вы нажмете на #menutop элемент, событие щелчка по-прежнему пузырь и вызвать событие щелчка на body элемент, поэтому один из вариантов является сделать проверку, чтобы увидеть, если event.target является #menutop элемент:

$(document).on('click', function (event) { 
    if (!$(event.target).closest('#menutop').length) { 
    // ... clicked on the 'body', but not inside of #menutop 
    } 
}); 

в качестве альтернативы, вы можете также подавить бульканье события и stop event propagation при нажатии на #menutop элемент:

$(document).on('click', function (event) { 
    // ... clicked on the 'body', but not inside of #menutop 
}); 
$('#menutop').on('click', function (event) { 
    event.stopPropagation(); 
}); 
+1

Совершенного. Сэкономленные так много часов. Спасибо. –

1
$('#menutop').click(function(event) { 
    event.stopPropagation(); 
}) 

stopPropagation() будет удерживать ваш клик от распространения и активировать щелчок по телу.

2

Вы можете использовать event.stopPropagation() на элементе menutop для предотвращения щелчка по телу ниже.

Смотрите это codepen для решения

JS

$("body").click(function(){ 
    alert("323"); 
}); 

$("#menutop").click(function(event) { 
    event.stopPropagation(); 
}); 
Смежные вопросы