2012-04-04 29 views
0

Was ich versuche ist zu testen, wenn ein Element (ein SELECT) seinen Fokus verliert, wenn der Fokus auf ein anderes spezifisches Element (ein anderes SELECT) übertragen wurde. Ich möchte etwas auslösen, wenn der Fokus verloren ist und nicht auf einer der beiden liegt.Testen, welches Element den Fokus hat, wenn man es verloren hat

Das Problem ist, ich teste in der ersten Auswahl, wenn es den Fokus verloren hat (mit dem Blur-Ereignis), wenn die andere Auswahl es hat, aber das DOM ist noch nicht aktualisiert.

Hier ist ein exemple von dem, was ich getan habe:

$select1.on("blur", function() { 
    if($select2.is(":focus")) 
    { 
     // do something 
    } 
    else 
    { 
     // do something else 
    } 
}); 

$ select1 und select2 $ sind nur zwei Variablen, die das Element enthalten. Ich habe gelesen, dass JQuery einen Bezeichner ": focus" hinzufügt, wenn ein Element den Fokus erhält, aber so wie ich es gemacht habe, funktioniert es nicht.

In allen Fällen geht es in die sonst "etwas anderes tun".

Antwort

2

Matt hat Recht bezüglich der Reihenfolge der Ereignisse, aber Sie können ein wenig kreativer sein.

Verwenden Sie zum Beispiel einen setTimeout, um die Prüfung auf Unschärfe zu verzögern, damit Sie wissen, dass Sie bereits Ihren Fokus ausgelöst haben. Einfach.

$select1.on("blur", function() { 
    window.setTimeout(function() { 
    if($select2.is(":focus")) 
    { 
     // do something 
    } 
    else 
    { 
     // do something else 
    } 
    },100); 
}); 

Versuchen Sie es.

+0

Ich hänge meinen Kopf in Schande, dass ich diese Lösung nicht in Betracht gezogen habe ...: P – Matt

+0

Dank euch beiden ... jetzt funktioniert es super. – maniak

+0

@Matt ist ein bisschen ein Hack, aber JavaScript neigt dazu, ein wenig hacky wegen der niedrigen Einstiegspunkt und Browser-Geschichte eigenartig zu sein. –

1

Da das blur Ereignis deutlich gefeuert, bevor die focus des neuen Elements ist, das nur, was Sie tun können eine Variable in einem Fall eingestellt ist und es in dem anderes erkennen.

$select1.on('blur', function (e) { 
    var $that = $(this); 

    setTimeout(function() { 
     if (($that.data('focussed') || 0) > e.timeStamp - 5) { 
      // Do something 
     } else { 
      // Something else 
     } 
    }, 1); 
}); 

$select2.on('focus', function (e) { 
    $select1.data('focussed', e.timeStamp); 
}); 

Sehen Sie es hier arbeiten; http://jsfiddle.net/uZAMm/

+0

Wie kann ich eine Aktion nur ausführen, wenn $ select2 nicht den Fokus erhält? Ich kann es in $ select2.focus nicht testen, weil er es vielleicht nicht gewinnen könnte. – maniak

+0

@maniak: der Code ist da. Fügen Sie Code zu '// Do something' hinzu, das ausgeführt werden soll, wenn der Fokus übertragen wird, und fügen Sie Code zu' // Other else' hinzu, der ausgeführt werden soll, wenn dies nicht der Fall ist. – Matt

+0

Danke, aber kann ich das gleiche erreichen mit einer FunktionName.call (this)? Weil ich es schlampig fand, setTimeout zu verwenden (ich könnte es falsch machen, dies zu tun = D). – maniak

Verwandte Themen