2013-07-05 3 views
5

Ich habe 3 Textfelder in einem div und ich muss ein Ereignis auslösen, wenn der Fokus einen dieser Eingänge verlässt und nicht zu einem anderen dieser 3 Eingänge geht.jQuery - Ereignis auslösen, wenn der Fokus eine Gruppe von Steuerelementen verlässt

Solange der Benutzer eines dieser drei Steuerelemente bearbeitet, wird das Ereignis nicht ausgelöst. Das Ereignis wird nur ausgelöst, wenn der Fokus auf ein Steuerelement geändert wurde, das nicht einer dieser Eingaben ist.

Ich versuchte focusout an allen drei Eingängen verwenden und prüfen, ob document.ActiveElement einer der drei Eingänge ist aber focusout eine Kontrolle auftritt, bevor focusin auf einem anderen so document.ActiveElement immer leer ist.

Wer hat eine Idee, wie man das umgehen kann?

+1

Das ist eine schwierige, würde ich wahrscheinlich für einen kurzen Timer-Ansatz gehen – musefan

Antwort

7

Ich würde einen Timer verwenden, um dieses schwierige Dilemma zu lösen.

Wenn der Fokus verloren geht, starten Sie den Timer. Dann können Sie den Timer abbrechen, wenn der Fokus dann auf einen anderen "sicheren" Eingang gesetzt wird.

Etwas wie folgt aus:

var timeoutID; 

$("#TheSafeZone input").focus(function() { 
    if (timeoutID) { 
     clearTimeout(timeoutID); 
     timeoutID = null; 
    } 
}); 

$("#TheSafeZone input").blur(function() { 
    releaseTheHounds(); 
}); 

function releaseTheHounds() { 
    timeoutID = setTimeout(function() { 
      alert("You're all going to die down here"); 
    }, 1); 
} 

Here is a working example

HINWEIS: Ich habe das Timeout eingestellt haben, dass nur 1ms, scheint dies für mich zuverlässig zu arbeiten, aber es kann dabei ein paar Tests lohnen andere Browser (ich verwende Chrome). Ich denke, es hängt davon ab, wie die JS-Engine Ereignisse verarbeitet, aber ich weiß nicht genug darüber, um sicher zu sagen, dass alle Browser die gleichen funktionieren

+0

Eine der besten Antworten, die ich bekommen habe. – user779444

+0

Ich habe eine ähnliche Anforderung, wo ich benutzerdefinierte Autocomplete-Steuerelement erstellen. Timeout war mein letzter Ansatz. Ich möchte wissen, kann dies ohne Zeitüberschreitungen durchgeführt werden –

+0

@Goutham ܢܢ: ähm, wahrscheinlich. Vielleicht müssten Sie jedem einzelnen Element auf Ihrer Seite ein Klick-/Fokus-Ereignis hinzufügen und prüfen, ob es von einem Textfeld in ein anderes übergeht ... nicht sicher, dass es besser als ein Timer ist, aber ich kann Ihre verstehen Zögern, Timer zu benutzen - es scheint ein bisschen verdächtig – musefan

0

Put "Blur" und "Focus" Ereignisse mit entgegengesetzter Logik, so dass wenn je Benutzer verlässt Gruppe von Steuerelementen in DIV angegeben nur "Blur" Ereignis wird ausgelöst.

$(document).on("blur","#edit-area .form-control", function (event) { 
     $('.editButtons').show(); 

    }); 
    $(document).on("focus","#edit-area .form-control", function (event) { 
     $('.editButtons').hide(); 

    }); 
Verwandte Themen