2013-04-08 12 views
5

Ich versuche, einen Listener einzustellen, der auf alle Fokusereignisse wartet. Insbesondere versuche ich zu hören, wann immer eine Eingabe oder Textbox den Fokus erhält. Per einige der Forschung, ist die weithin akzeptierte Weg, dies zu erreichen, wie folgt aus:Javascript: Global Element Fokus-Listener

document.body.onfocus = function(event) { 
    //Check the event.target for input/textbox 
    //Do something 
}; 

Aber die document.body.onfocus scheint nicht, jemals zu schießen. Ich dachte, es sein könnte, weil das Dokument tatsächlich nicht immer den Fokus erhalten und so versuchte ich:

document.body.focus(); 

Um zunächst „Set“ den Fokus, aber das funktioniert auch nicht.

Irgendwelche Ideen, wie ich ein Fokusereignis auf alle Eingaben/Textfelder hören kann, ohne das Ereignis direkt auf das Element selbst zu setzen? Vanilla Javascript nur bitte, ich benutze kein Framework.

Pro die akzeptierte Antwort hier einige Arbeitscode:

var focusHandler = function(event) { 
    var type = event.target.nodeName.toLowerCase(); 
    if(type == 'input' || type == 'textarea') { 
     //Do something 
    } 
}; 
document.body.addEventListener('focus', focusHandler, true); //Non-IE 
document.body.onfocusin = focusHandler; //IE 
+0

Wohin führen Sie diesen Code? In der ''? Oder irgendwo in der ''? Ich denke nicht, dass der 'document.body' verfügbar sein wird, wenn Code in der' 'ausgeführt wird ... nicht sicher – Ian

+0

Eine separate js-Datei. Nicht im HTML überhaupt. – ryandlf

+0

Aber wo ist die JS-Datei in Ihrem HTML enthalten? – Ian

Antwort

5

Da einige Ereignisse (Fokus, Unschärfe, Veränderung) nicht aufblähen, würde ich Ihnen empfehlen, stattdessen Event Capturing auszuprobieren. Zunächst einmal funktioniert onfocus nicht, deshalb müssen Sie addEventListener verwenden, wo Sie den verwendeten Delegierungsmodus im dritten Argument angeben können. Betrachten Sie MDN für die Verwendung von addEventListener.

Und sehen Sie sich diese article für weitere Informationen über das Delegieren des Fokus-Ereignisses an.

+0

Funktioniert wunderbar. Toller Artikel auch. Ich habe mich immer gefragt, was das am Ende eines EventListeners falsch war! OP mit etwas Arbeitscode aktualisieren. – ryandlf

3

Die focus event nicht Blase aus Elementen bis zu ihren Vorfahren Elemente, so dass Sie keine Ereignis Delegation (Einhaken es auf body verwenden können und zu sehen, es für alle Nachkommen von body), um es zu erkennen.

Es gibt ein neueres Ereignis, focusin (eine Microsoft-Innovation, jetzt auch in anderen Browsern verfügbar), die bubble, so dass für Sie je nach Browsern, die Sie unterstützen möchten, funktioniert.

+1

Siehe diesen interessanten Artikel für weitere Informationen und einen netten Hack: http: //www.quirksmode .org/blog/archives/2008/04/delegating_the.html –

+1

Und natürlich, wenn Sie offen für die Verwendung von Bibliotheken sind, macht jQuery 'focus' und' blur' bubble in einem browserübergreifenden Modus, ohne dass Sie sich darum kümmern müssen es. –