2013-08-21 16 views
13

Das Problem war, dass ich eine "onClickOut" -Event benötigen.onClickOut (klicken Sie nach dem Verlassen des Elements)

Zum Beispiel: Sie haben eine DIV-Anzeige auf Schweben (onMouseOver) einige Schaltfläche oder was auch immer.

Wenn Sie außerhalb des Elements klicken, muss es ausgeblendet werden, aber wenn Sie $ ("body") sagen, klicken Sie auf und es wird auch ausgeblendet, wenn Sie auf das Element klicken. :/

Nun höre ich die Mausposition und wenn mouseleave() Ich setze eine Variable beim Klicken in mein Element. Im nächsten Schritt höre ich ein generelles click-event (body) aber ich frage ob die var gesetzt wurde. Wenn nicht, muss es ein Klick außerhalb meines Elements sein, damit ich mein Element ausblenden kann.

Ich hoffe, dass Sie es verwenden können:

$("#schnellsuche_box").mouseleave(function() { 
    var inside; 
    $("#schnellsuche_box").click(function() { 
     inside = true; 
    }); 
    $("body").click(function() { 
     if(!inside) { 
      $("#schnellsuche_box").hide(); 
     } 
    }); 
    delete inside; 
}); 
+0

Hinweis: Sie können eine lokale Variable nicht löschen. (Aber selbst wenn Sie könnten, würde es hier keinen Sinn ergeben, da Ihre Click-Handler versuchen, diese Variable zu verwenden.) – nnnnnn

Antwort

3

Sie tun, indem Sie auf Dokumentebene zu einem Klick zu hören, und in der Event-Handler Sie überprüfen, ob das angeklickte Element #schnellsuche_box oder ein beliebiges Element innerhalb #schnellsuche_box war closest() unter Verwendung, etwa so:

$(document).on('click', function(e) { 
    if (! $(e.target).closest('#schnellsuche_box').length) 
     $('#schnellsuche_box').hide(); 
}); 

FIDDLE

1

Sie müssen die #schnellsuche_box Click-Ereignis, um zu verhindern sprudeln bis zum body Click-Ereignis (das Standardereignis Propagation) von return false tun:

$("#schnellsuche_box").click(function() { 
    inside = true; 

    return false; 
}); 
+1

'event.stopPropogation();' wird auch funktionieren, mir wurde gesagt, dass 'return false' nur die Blasenbildung stoppt wenn in jquery Callbacks verwendet – rps

+0

@rps Ja, das wird funktionieren, aber das ist nicht exklusiv für jQuery, es funktioniert auch in nur JavaScript. – mattytommo

+1

Ich bin nicht sicher, was "es" in Ihrem Kommentar bezieht * "es funktioniert auch nur in JavaScript" *, aber wenn es 'return false;' ist, dann wird es nur das Standard-Ereignis in "Nicht-jQuery "Ereignishandler, nicht Ereignisausbreitung. –

0

Versuchen Sie dies:

$("body").click(function(e) { 
    var $target = $(e.target); 
    if (!$target.is('#schnellsuche_box') && 
     !$target.parents('#schnellsuche_box').length) { 
     alert('outside'); 
    } 
}); 
0
$("#schnellsuche_box").on("click",function(event) { 
    event.preventDefault(); 
    event.stopPropagation(); 
}); 
+0

@ F4r-20 Sie müssen nicht, "event" bezieht sich auf das aktuelle JavaScript-Ereignis. – mattytommo

+0

Ich wusste es nicht, danke. – George

+0

@mattytommo - zumindest tut es, wenn Sie IE und einige Versionen von Chrome verwenden. Es sollte als ein Parameter definiert werden. – adeneo

Verwandte Themen