J'ai un champ de saisie dans lequel j'essaye de faire une suggestion de saisie semi-automatique. Le code ressemble à
<input type="text" id="myinput">
<div id="myresults"></div>
Lors de l' blur()
événement d'entrée, je veux masquer le div des résultats:
$("#myinput").live('blur',function(){
$("#myresults").hide();
});
Lorsque j'écris quelque chose dans mon entrée, j'envoie une requête au serveur et j'obtiens une réponse json, je l'analyse dans la structure ul-> li et je mets cet ul dans mon #myresults
div.
Lorsque je clique sur cet élément li analysé, je veux définir la valeur de li à l'entrée et masquer #myresults
div
$("#myresults ul li").live('click',function(){
$("#myinput").val($(this).html());
$("#myresults").hide();
});
Tout va bien, mais lorsque je clique sur mon blur()
événement li se déclenche avant click()
et que la valeur d'entrée n'obtient pas le html de li.
Comment puis-je organiser un click()
événement avant blur()
?
blur
est vraiment déclenché après avoir cliqué sur unli
, vous n'avez probablement pas besoin d'exécuter$("#myresults").hide()
dans le gestionnaire de clics. Il semble que ce soit en train de$(this).html()
renvoyer une chaîne vide. Pourriez-vouslog
oualert
$(this).html()
pour vous en assurer?blur()
et lesclick()
gestionnaires, il n'y a pas d'action après lablur()
finRéponses:
Solution 1
Écoutez
mousedown
plutôt queclick
.Les événements
mousedown
etblur
se produisent l'un après l'autre lorsque vous appuyez sur le bouton de la souris, maisclick
uniquement lorsque vous le relâchez.Solution 2
Vous pouvez
preventDefault()
enmousedown
bloquer le menu déroulant de voler le focus. Le léger avantage est que la valeur sera sélectionnée lorsque le bouton de la souris sera relâché, ce qui correspond au fonctionnement des composants de sélection natifs. JSFiddlela source
VIOLON
la source
J'ai rencontré ce problème et l'utilisation
mousedown
n'est pas une option pour moi.J'ai résolu cela en utilisant
setTimeout
la fonction de gestionnairela source
Je viens de répondre à une question similaire: https://stackoverflow.com/a/46676463/227578
Une alternative aux solutions mousedown est de lui faire ignorer les événements de flou provoqués en cliquant sur des éléments spécifiques (c'est-à-dire, dans votre gestionnaire de flou, ignorez l'exécution si c'est le résultat d'un clic sur un élément spécifique).
la source
Les solutions Mousedown ne fonctionnent pas pour moi, lorsque je clique sur des éléments non bouton. Voici donc ce que j'ai fait avec la fonction de flou dans mon code:
la source