Für eine einfachere Nutzung und einen aussagekräftigeren Code habe ich ein jQuery-Plugin für diese Funktion erstellt:
$('div.my-element').clickOut(function(target) {
//do something here...
});
Nota: Ziel ist das Element, das der Benutzer tatsächlich angeklickt hat. Aber Callback wird immer noch im Kontext des ursprünglichen Elements ausgeführt, so können Sie este wie Sie in einem jQuery-Callback erwarten würden.
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;
};
Standardmäßig wird der Click-Event-Listener auf dem Dokument platziert. Wenn Sie jedoch den Anwendungsbereich des Ereignis-Listeners einschränken möchten, können Sie ein jQuery-Objekt übergeben, das ein übergeordnetes Element darstellt, das das oberste übergeordnete Element ist, bei dem auf Klicks geachtet wird. Dadurch werden unnötige Ereignis-Listener auf Dokumentenebene vermieden. Natürlich funktioniert dies nur, wenn das übergebene übergeordnete Element ein übergeordnetes Element des ursprünglichen Elements ist.
So verwenden:
$('div.my-element').clickOut($('div.my-parent'), function(target) {
//do something here...
});