Для более легкого использования и более выразительного кода я создал для этого плагин jQuery:
$('div.my-element').clickOut(function(target) {
//do something here...
});
Примечание: target - это элемент, на который пользователь фактически нажал. Но обратный вызов все еще выполняется в контексте исходного элемента, поэтому вы можете использовать this , как и следовало ожидать в обратном вызове jQuery.
Plugin:
$.fn.clickOut = function (parent, fn) {
var context = this;
fn = (typeof parent === 'function') ? parent : fn;
parent = (parent instanceof jQuery) ? parent : $(document);
context.each(function () {
var that = this;
parent.on('click', function (e) {
var clicked = $(e.target);
if (!clicked.is(that) && !clicked.parents().is(that)) {
if (typeof fn === 'function') {
fn.call(that, clicked);
}
}
});
});
return context;
};
По умолчанию прослушиватель событий щелчка помещается в документ. Однако, если вы хотите ограничить область прослушивания событий, вы можете передать объект jQuery, представляющий родительский элемент уровня, который будет верхним родителем, на котором будут прослушиваться щелчки. Это предотвращает ненужные прослушиватели событий уровня документа. Очевидно, что это не будет работать, если предоставленный родительский элемент не является родителем вашего исходного элемента.
Используйте вот так:
$('div.my-element').clickOut($('div.my-parent'), function(target) {
//do something here...
});