Supposons que j'attache une blur
fonction à une zone de saisie HTML comme celle-ci:
<input id="myInput" onblur="function() { ... }"></input>
Existe-t-il un moyen d'obtenir l'ID de l'élément qui a provoqué le déclenchement de l' blur
événement (l'élément sur lequel on a cliqué) à l'intérieur de la fonction? Comment?
Par exemple, supposons que j'ai une envergure comme celle-ci:
<span id="mySpan">Hello World</span>
Si je clique sur la plage juste après que l'élément d'entrée a le focus, l'élément d'entrée perdra son focus. Comment la fonction sait-elle que c'est ce mySpan
qui a été cliqué?
PS: Si l'événement onclick de la plage se produisait avant l'événement onblur de l'élément d'entrée, mon problème serait résolu, car je pourrais définir une valeur de statut indiquant qu'un élément spécifique a été cliqué.
PPS: Le fond de ce problème est que je veux déclencher un contrôle de saisie semi-automatique AJAX en externe (à partir d'un élément cliquable) pour afficher ses suggestions, sans que les suggestions ne disparaissent immédiatement à cause de l' blur
événement sur l'élément d'entrée. Je veux donc vérifier dans la blur
fonction si un élément spécifique a été cliqué, et si c'est le cas, ignorer l'événement de flou.
la source
Réponses:
Hmm ... Dans Firefox, vous pouvez utiliser
explicitOriginalTarget
pour tirer l'élément sur lequel vous avez cliqué. Je m'attendaistoElement
à faire de même pour IE, mais cela ne semble pas fonctionner ... Cependant, vous pouvez extraire l'élément nouvellement ciblé du document:Attention: cette technique ne fonctionne pas pour les changements de focus provoqués par la tabulation dans les champs avec le clavier, et ne fonctionne pas du tout dans Chrome ou Safari. Le gros problème avec l'utilisation
activeElement
(sauf dans IE) est qu'il n'est mis à jour de manière cohérente qu'après leblur
traitement de l' événement, et peut n'avoir aucune valeur valide pendant le traitement! Cela peut être atténué par une variation de la technique que Michiel a finalement utilisée :Cela devrait fonctionner dans la plupart des navigateurs modernes (testés dans Chrome, IE et Firefox), avec l'avertissement que Chrome ne met pas l'accent sur les boutons sur lesquels on clique (par rapport aux onglets).
la source
blur
événement se déclenche. J'ai mis à jour la réponse avec des détails. Avez-vous essayé d'utiliser activeElement pour cela dans Chrome ou Firefox? Cela vous donne l'élément flou ...Réponse 2015 : selon UI Events , vous pouvez utiliser la
relatedTarget
propriété de l'événement:Pour les
blur
événements,Exemple:
Remarque Firefox ne supportera pas
relatedTarget
avant la version 48 ( bogue 962251 , MDN ).la source
relatedTarget
retourneranull
si la cible recevant le focus n'est pas un élément d'entrée.tabIndex="0"
attribut et cela fonctionneraJe l'ai finalement résolu avec un timeout sur l'événement onblur (grâce aux conseils d'un ami qui n'est pas StackOverflow):
Fonctionne à la fois dans FF et IE.
la source
Il est possible d'utiliser l'événement mousedown du document au lieu du flou:
la source
Les
FocusEvent
instances de type ont unrelatedTarget
attribut, cependant, jusqu'à la version 47 du FF, spécifiquement, cet attribut renvoie null, à partir de 48 fonctionne déjà.Vous pouvez en voir plus ici .
la source
J'essaie également de faire en sorte que la saisie semi-automatique ignore le flou si un élément spécifique a cliqué et a une solution fonctionnelle, mais uniquement pour Firefox en raison de explicitOriginalTarget
Ce code encapsule la méthode onBlur par défaut de la saisie semi-automatique et vérifie si les paramètres ignoreBlurEventElement sont définis. s'il est défini, il vérifie à chaque fois si l'élément cliqué est ignoreBlurEventElement ou non. Si tel est le cas, la saisie semi-automatique n'appelle pas onBlur, sinon il appelle onBlur. Le seul problème avec ceci est que cela ne fonctionne que dans Firefox car la propriété explicitOriginalTarget est spécifique à Mozilla. Maintenant, j'essaie de trouver une manière différente d'utiliser explicitOriginalTarget. La solution que vous avez mentionnée nécessite que vous ajoutiez manuellement le comportement onclick à l'élément. Si je ne parviens pas à résoudre le problème explicitOriginalTarget, je suppose que je suivrai votre solution.
la source
Pouvez-vous inverser ce que vous vérifiez et quand? C'est si vous vous souvenez de ce qui était flou en dernier:
puis dans le onClick pour votre span, appelez function () avec les deux objets:
Votre fonction pourrait alors décider de déclencher ou non le contrôle Ajax.AutoCompleter. La fonction a l'objet cliqué et l'objet flou. Le onBlur est déjà arrivé, donc il ne fera pas disparaître les suggestions.
la source
Utilisez quelque chose comme ceci:
Et puis à l'intérieur de votre fonction:
Puis:
Puis:
Code final:
la source
Je pense que ce n'est pas possible, avec IE, vous pouvez essayer d'utiliser
window.event.toElement
, mais cela ne fonctionne pas avec Firefox!la source
Comme indiqué dans cette réponse , vous pouvez vérifier la valeur de
document.activeElement
.document
est une variable globale, vous n'avez donc pas besoin de faire de magie pour l'utiliser dans votre gestionnaire onBlur:la source
Le meilleur moyen est donc d'utiliser onclick on body event pour comprendre indirectement que votre nœud (event.target) est sur le flou
la source
Fonctionne sous Google Chrome v66.x, Mozilla v59.x et Microsoft Edge ... Solution avec jQuery.
Commentez votre test dans d'autres versions d'Internet Explorer.
la source
Edit: Une manière piratée de le faire serait de créer une variable qui garde la trace de la mise au point pour chaque élément qui vous tient à cœur. Donc, si vous vous souciez que «myInput» ait perdu le focus, définissez-lui une variable sur focus.
Réponse originale: vous pouvez transmettre «ceci» à la fonction.
la source
Je suggère d'utiliser des variables globales blurfrom et blurto. Ensuite, configurez tous les éléments qui vous intéressent pour affecter leur position dans le DOM à la variable blurfrom lorsqu'ils perdent le focus. De plus, configurez-les de manière à ce que la mise en évidence définisse la variable blurto à sa position dans le DOM. Ensuite, vous pouvez utiliser une autre fonction pour analyser les données floufrom et blurto.
la source
gardez à l'esprit que la solution avec explicitOriginalTarget ne fonctionne pas pour les sauts de saisie de texte à saisie de texte.
essayez de remplacer les boutons par les entrées de texte suivantes et vous verrez la différence:
la source
J'ai joué avec cette même fonctionnalité et j'ai découvert que FF, IE, Chrome et Opera ont la capacité de fournir l'élément source d'un événement. Je n'ai pas testé Safari, mais je suppose qu'il pourrait avoir quelque chose de similaire.
la source
Je n'aime pas utiliser timeout lors du codage de javascript, donc je le ferais à l'opposé de Michiel Borkent. (Je n'ai pas essayé le code derrière mais vous devriez avoir l'idée).
Dans la tête quelque chose comme ça
la source
Vous pouvez réparer IE avec:
Cela ressemble à "explicitOriginalTarget" pour FF.
Antoine et J
la source
J'ai écrit une solution alternative pour rendre n'importe quel élément focalisable et "flou".
Il est basé sur la création d'un élément en tant que
contentEditable
, son masquage visuel et la désactivation du mode d'édition lui-même:DEMO
Remarque: testé dans Chrome, Firefox et Safari (OS X). Pas sûr d'IE.
En relation: Je cherchais une solution pour VueJs, donc pour ceux qui sont intéressés / curieux de savoir comment implémenter une telle fonctionnalité à l'aide de la directive Vue Focusable, veuillez jeter un coup d'œil .
la source
Par ici:
Ou si vous attachez l'écouteur via JavaScript (jQuery dans cet exemple):
Edit : désolé. J'ai mal lu la question.
la source
Je pense que c'est facilement possible via jquery en passant la référence du champ provoquant l'événement onblur dans "this".
Pour par exemple
Merci
Monika
la source
Vous pourriez faire comme ceci:
la source
Je ne vois que des hacks dans les réponses, mais il existe en fait une solution intégrée très facile à utiliser: En gros, vous pouvez capturer l'élément de focus comme ceci:
https://developer.mozilla.org/en-US/docs/Web/API/DocumentOrShadowRoot/activeElement
la source