Comment obtenir Bootstrap typeahead cliquez sur le résultat avant de l'entrée d'événement de changement de
Je suis en train d'utiliser bottes typeahead de la souplesse de sélectionner pour les utilisateurs. Donc, si l'élément est connu, ils choisir si elle n'est pas un dialogue s'ouvre laissant entrer dans un nouvel article.
Je fais cela par l'observation de l'événement de modification de l'entrée, si les entrées val n'est pas dans le tableau source (pour la typeahead) puis sur "ajouter un élément" le dialogue est affichée à l'utilisateur. Le problème est que si l'utilisateur clique sur l'une des options d'un événement de modification est envoyée avant le typeahead a une chance de régler le val. C'est comme le clic va provoquer un flou sur le texte.
Je voulais vérifier l'élément actif pour contourner ce problème, donc dans l'événement de changement de regarder le document.activeElement et voir si c'est de la typeahead options, cela n'a pas fonctionné et a renvoyé l'ensemble de l'élément de corps.
Ici est une version tronquée en bas du code:
Html
<div id="contactModal" class="modal hide fade" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
<h3 id="myModalLabel">Unknown Contact</h3>
</div>
<div class="modal-body">
<p>The contact you have entered is unknown. Press cancel to enter a different contact or fill out the details below to create a new contact</p>
<label>Name</label>
<input id="modal_contact" type="text" placeholder="dealership contact" value=""/>
<label>Email</label>
<input id="modal_contact_email" type="text" placeholder="dealership contact" value=""/>
</div>
<div class="modal-footer">
<button class="btn" data-dismiss="modal" aria-hidden="true">Close</button>
<button id="save" class="btn btn-primary">Save changes</button>
</div>
</div>
Javascript
var contacts = ['pete','geoff'];
$('.typeahead').typeahead({source:contacts, updater : function(item){
console.log('updater fired'); //fires after first change event
return item;
}});
$('input').change(function(ev){
console.log($(ev.target).val());
if ($.inArray($(ev.target).val(), contacts) < 0)
$('#contactModal').modal();
})
Et un JSFiddle version http://jsfiddle.net/k39vM/
Ce que quelqu'un sait comment je peux tester si l'utilisateur a cliqué sur un typeahead pour savoir si qui ont provoqué le changement de l'événement?
OriginalL'auteur Dan Walmsley | 2013-04-03
Vous devez vous connecter pour publier un commentaire.
Ma suggestion précédente n'a pas fait de travail parce que, comme vous l'avez mentionné, il y a un peu inattendu
blur
événement à l'origine de lachange
avant événement leclick
sur le menu. J'avais supposé que c'était lié à lathis.hide()
appeler à l'intérieur de laTypeahead.prototype.select
méthode.Cependant, après un peu d'essais et d'erreurs, je pense que j'ai peut-être trouvé un solution de contournement. Ce n'est pas vraiment le
this.hide()
appel à l'intérieur de laselect
méthode qui est à l'origine du problème. Sachant qu'il y a deux façons que l'utilisateur peut déclencher de sélection permet de comprendre l'espérons-le, de travail d'une solution (j'ai testé uniquement dans Chrome): à l'aide du clavier, comme en appuyant sur entrée ou en cliquant sur l'élément. En conséquence, sachant que le clic est le problème de l'enfant de les deux, j'ai remarqué que lemousedover
événement est maintenu lorsque l'utilisateur passe la souris sur le menu déroulant.Comme un résultat, le comportement étrange peut être manuellement ignoré dans un
change
événement. Pour simplifier le processus de détermination de ce qui cause réellement la prochainechange
cas j'ai utilisé un autre (personnalisé) événement appelé "selected
" pour désigner l'utilisateur a modifié la valeur plutôt que d'une normechange
. Malheureusement, vous devez manuellement ignorerchange
événements lorsque lemousedover
propriété esttrue
:Simplifié en HTML (j'ai utilisé le
p
balise parce que je trouve que Chrome a de la difficulté avec le débogage JSFiddle du JavaScript, et en les combinant avec la console de conduire à un mauvais moment):JavaScript (texte peut être remplacé par
console.log
pour ceux qui s'intéressent à l'aise):Pour la référence, c'est la valeur par défaut
select
méthode:if (typeahead.mousedover && typeahead.shown)
mousedover
n'est pas mis à jour à false lorsque la typeover menu est fermé... mais affichée est mise à jour.OriginalL'auteur pickypg
Un peu plus simple solution au problème consiste à inclure les éléments suivants dans votre cliquez sur l'événement:
La première ligne permet de récupérer la typeahead si elle est attachée. La deuxième sera de s'assurer que la valeur actuelle correspond à la valeur sélectionnée.
Vous pouvez aussi faire un chèque pour
typeahead.mousedover
au sein du si afin de permettre non valide (ce qui signifie pas un typeahead option) entrée pour encore déclencher le défaut de changement de comportement lorsque le contrôle perd le focus sans faire de sélection.OriginalL'auteur Daniel