Angenommen, ich hänge eine blur
Funktion wie folgt an ein HTML-Eingabefeld an:
<input id="myInput" onblur="function() { ... }"></input>
Gibt es eine Möglichkeit, die ID des Elements, das das blur
Ereignis ausgelöst hat (das Element, auf das geklickt wurde), innerhalb der Funktion abzurufen? Wie?
Angenommen, ich habe eine Zeitspanne wie diese:
<span id="mySpan">Hello World</span>
Wenn ich direkt nach dem Fokus des Eingabeelements auf die Spanne klicke, verliert das Eingabeelement seinen Fokus. Woher weiß die Funktion, dass darauf mySpan
geklickt wurde?
PS: Wenn das Onclick-Ereignis des Bereichs vor dem Onblur-Ereignis des Eingabeelements auftreten würde, wäre mein Problem gelöst, da ich einen Statuswert festlegen könnte, der angibt, dass auf ein bestimmtes Element geklickt wurde.
PPS: Der Hintergrund dieses Problems ist, dass ich ein AJAX-Autocompleter-Steuerelement extern (von einem anklickbaren Element) auslösen möchte, um seine Vorschläge anzuzeigen, ohne dass die Vorschläge aufgrund des blur
Ereignisses im Eingabeelement sofort verschwinden . Daher möchte ich die blur
Funktion überprüfen, ob auf ein bestimmtes Element geklickt wurde, und in diesem Fall das Unschärfeereignis ignorieren.
quelle
Antworten:
Hmm ... In Firefox können Sie
explicitOriginalTarget
das Element ziehen, auf das geklickt wurde. Ich hatte erwartettoElement
, dasselbe für den IE zu tun, aber es scheint nicht zu funktionieren ... Sie können jedoch das neu fokussierte Element aus dem Dokument ziehen:Vorsichtsmaßnahme: Diese Technik funktioniert nicht bei Fokusänderungen, die durch das Durchblättern von Feldern mit der Tastatur verursacht werden, und funktioniert überhaupt nicht in Chrome oder Safari. Das große Problem bei der Verwendung
activeElement
(außer im IE) ist, dass es erst nach derblur
Verarbeitung des Ereignisses konsistent aktualisiert wird und während der Verarbeitung möglicherweise überhaupt keinen gültigen Wert hat! Dies kann durch eine Variation der Technik gemildert werden, die Michiel letztendlich verwendet hat :Dies sollte in den meisten modernen Browsern (getestet in Chrome, IE und Firefox) funktionieren, mit der Einschränkung, dass Chrome den Fokus nicht auf Schaltflächen legt, auf die geklickt wird (im Gegensatz zu Registerkarten).
quelle
blur
Ereignis ausgelöst wird. Ich habe die Antwort mit Details aktualisiert. Haben Sie versucht, activeElement in Chrome oder Firefox dafür zu verwenden? Es gibt Ihnen das Element, das verwischt wird ...Antwort 2015 : Laut UI-Ereignissen können Sie die
relatedTarget
Eigenschaft des Ereignisses verwenden:Für
blur
Veranstaltungen,Beispiel:
Hinweis Firefox wird erst
relatedTarget
ab Version 48 unterstützt ( Fehler 962251 , MDN ).quelle
relatedTarget
Wird leider zurückgegeben,null
wenn der Zielempfangsfokus kein Eingabeelement ist.tabIndex="0"
Attribut hinzu, und es funktioniertIch habe es schließlich mit einer Zeitüberschreitung beim Onblur-Ereignis gelöst (dank des Ratschlags eines Freundes, der nicht StackOverflow ist):
Funktioniert sowohl in FF als auch in IE.
quelle
Es ist möglich, das Mousedown-Ereignis des Dokuments anstelle von Unschärfe zu verwenden:
quelle
Die
FocusEvent
Typinstanzen haben einrelatedTarget
Attribut, jedoch bis zur Version 47 des FF, insbesondere gibt dieses Attribut null zurück, von 48 funktioniert bereits.Mehr können Sie hier sehen .
quelle
Ich versuche auch, Autocompleter dazu zu bringen, Unschärfen zu ignorieren, wenn ein bestimmtes Element angeklickt hat und eine funktionierende Lösung hat, aber nur für Firefox aufgrund von explizitOriginalTarget
Dieser Code umschließt die Standardmethode onBlur von Autocompleter und prüft, ob die Parameter ignoreBlurEventElement festgelegt sind. Wenn es festgelegt ist, wird jedes Mal überprüft, ob das angeklickte Element ignoreBlurEventElement ist oder nicht. Wenn dies der Fall ist, ruft Autocompleter onBlur nicht an, andernfalls ruft es onBlur auf. Das einzige Problem dabei ist, dass es nur in Firefox funktioniert, da die Eigenschaft explizitOriginalTarget Mozilla-spezifisch ist. Jetzt versuche ich einen anderen Weg zu finden als mit explizitOriginalTarget. Bei der von Ihnen erwähnten Lösung müssen Sie dem Element das Verhalten beim Klicken manuell hinzufügen. Wenn es mir nicht gelingt, das explizite OriginalTarget-Problem zu lösen, werde ich Ihrer Lösung folgen.
quelle
Können Sie rückgängig machen, was Sie wann überprüfen? Das heißt, wenn Sie sich daran erinnern, was zuletzt verschwommen war:
Rufen Sie dann im onClick für Ihre Spanne function () mit beiden Objekten auf:
Ihre Funktion könnte dann entscheiden, ob das Ajax.AutoCompleter-Steuerelement ausgelöst werden soll oder nicht. Die Funktion hat das angeklickte Objekt und das unscharfe Objekt. Das onBlur ist bereits aufgetreten, sodass die Vorschläge nicht verschwinden.
quelle
Verwenden Sie so etwas:
Und dann in Ihrer Funktion:
Und dann:
Und dann:
Endgültiger Code:
quelle
Ich denke, es ist nicht möglich, mit IE können Sie versuchen, zu verwenden
window.event.toElement
, aber es funktioniert nicht mit Firefox!quelle
Wie in dieser Antwort angegeben , können Sie den Wert von überprüfen
document.activeElement
.document
ist eine globale Variable, sodass Sie keine Magie ausführen müssen, um sie in Ihrem onBlur-Handler zu verwenden:quelle
Der beste Weg ist also, onclick on body event zu verwenden, um indirekt zu verstehen, dass Ihr Knoten (event.target) unscharf ist
quelle
Funktioniert in Google Chrome v66.x, Mozilla v59.x und Microsoft Edge ... Lösung mit jQuery.
Kommentieren Sie Ihren Test in anderen Internet Explorer-Versionen.
quelle
Bearbeiten: Eine hackige Möglichkeit wäre, eine Variable zu erstellen, die den Fokus für jedes Element verfolgt, das Sie interessiert. Wenn es Ihnen also wichtig ist, dass 'myInput' den Fokus verloren hat, setzen Sie eine Variable auf den Fokus.
Ursprüngliche Antwort: Sie können 'dies' an die Funktion übergeben.
quelle
Ich schlage vor, globale Variablen blurfrom und blurto zu verwenden. Konfigurieren Sie dann alle Elemente, die Sie interessieren, so, dass ihre Position im DOM der Variablen Unschärfe zugewiesen wird, wenn sie den Fokus verlieren. Konfigurieren Sie sie außerdem so, dass durch das Erzielen des Fokus die Variable blurto auf ihre Position im DOM gesetzt wird. Dann können Sie eine andere Funktion verwenden, um die Unschärfe- und Blurtodaten zu analysieren.
quelle
Beachten Sie, dass die Lösung mit explizitOriginalTarget nicht für Sprünge von Texteingabe zu Texteingabe funktioniert.
Versuchen Sie, die Schaltflächen durch die folgenden Texteingaben zu ersetzen, und Sie werden den Unterschied sehen:
quelle
Ich habe mit derselben Funktion gespielt und festgestellt, dass FF, IE, Chrome und Opera das Quellelement eines Ereignisses bereitstellen können. Ich habe Safari noch nicht getestet, aber ich vermute, dass es etwas Ähnliches gibt.
quelle
Ich mag es nicht, Timeout beim Codieren von Javascript zu verwenden, also würde ich es anders machen als Michiel Borkent. (Habe den Code dahinter nicht ausprobiert, aber du solltest auf die Idee kommen).
Im Kopf so etwas
quelle
Sie können den IE reparieren mit:
Es sieht aus wie "explizitOriginalTarget" für FF.
Antoine und J.
quelle
Ich habe eine alternative Lösung geschrieben wie man jedes Element fokussierbar und "unscharf" macht.
Es basiert darauf, ein Element als zu
contentEditable
erstellen und visuell auszublenden und den Bearbeitungsmodus selbst zu deaktivieren:DEMO
Hinweis: Getestet in Chrome, Firefox und Safari (OS X). Ich bin mir nicht sicher über IE.
Verwandte Themen: Ich habe nach einer Lösung für VueJs gesucht. Wer also interessiert / neugierig ist, wie solche Funktionen mithilfe der Vue Focusable-Direktive implementiert werden können, sollte einen Blick darauf werfen .
quelle
Diesen Weg:
Oder wenn Sie den Listener über JavaScript anhängen (in diesem Beispiel jQuery):
Edit : sorry. Ich habe die Frage falsch verstanden.
quelle
Ich denke, es ist leicht über jquery möglich, indem die Referenz des Feldes übergeben wird, das das Unschärfeereignis in "this" verursacht.
Zum Beispiel
Danke
Monika
quelle
Sie könnten es so machen:
quelle
Ich sehe nur Hacks in den Antworten, aber es gibt tatsächlich eine sehr einfach zu verwendende integrierte Lösung: Grundsätzlich können Sie das Fokuselement folgendermaßen erfassen:
https://developer.mozilla.org/en-US/docs/Web/API/DocumentOrShadowRoot/activeElement
quelle