Effacer le champ du formulaire après la sélection pour la saisie semi-automatique de l'interface utilisateur jQuery


97

Je développe un formulaire et j'utilise jQuery UI Autocomplete. Lorsque l'utilisateur sélectionne une option, je souhaite que la sélection apparaisse dans une plage ajoutée à la <p>balise parent . Ensuite, je veux que le champ soit effacé plutôt que rempli avec la sélection.

J'ai le span qui semble très bien, mais je ne parviens pas à dégager le champ.

Comment annuler l'action de sélection par défaut de jQuery UI Autocomplete?

Voici mon code:

var availableTags = ["cheese", "milk", "dairy", "meat", "vegetables", "fruit", "grains"];
$("[id^=item-tag-]").autocomplete({
    source: availableTags,

    select: function(){
        var newTag = $(this).val();
        $(this).val("");
        $(this).parent().append("<span>" + newTag + "<a href=\"#\">[x]</a> </span>");
    }
});

Faire simplement ne $(this).val("");fonctionne pas. Ce qui est exaspérant, c'est que presque la fonction exacte fonctionne bien si j'ignore la saisie semi-automatique et que je prends simplement des mesures lorsque l'utilisateur tape une virgule en tant que telle:

$('[id^=item-tag-]').keyup(function(e) {
    if(e.keyCode == 188) {
        var newTag = $(this).val().slice(0,-1);
        $(this).val('');
        $(this).parent().append("<span>" + newTag + "<a href=\"#\">[x]</a> </span>");
    }
});

Le véritable résultat final est d'obtenir la saisie semi-automatique pour travailler avec plusieurs sélections. Si quelqu'un a des suggestions à ce sujet, il sera le bienvenu.

Réponses:


182

Ajoutez $(this).val(''); return false; à la fin de votre selectfonction pour effacer le champ et annuler l'événement :)

Cela empêchera la mise à jour de la valeur. Vous pouvez voir comment cela fonctionne autour de la ligne 109 ici .

Le code qui s'y trouve vérifie spécifiquement faux:

if ( false !== self._trigger( "select", event, { item: item } ) ) {
  self.element.val( item.value );
}

Fantastique! Je me sens idiot cependant. Maintenant je sais, et savoir est la moitié de la bataille.
Jon F Hancock

Il l'a résolu. J'ai essayé d'accepter, mais cela m'a dit que je ne pouvais pas pendant 7 minutes de plus. Accepté. Merci.
Jon F Hancock

1
Permettez-moi simplement d'ajouter qu'une fois que vous retournez false, vous n'avez plus besoin de définir la valeur vous-même (c'est-à-dire pas besoin de $(this).val('');)
Uri

9
Si l'on veut que le champ d'entrée soit clair de toute valeur, je crois qu'un appel à .val('')doit toujours se produire. Le return false;empêchera uniquement le texte de l'élément sélectionné d'apparaître dans le champ de saisie.
Ryan

1
Uri est incorrect et Ryan a raison. Vous devez retourner false pour l'empêcher de se mettre à jour avec votre sélection, et vous avez également besoin de $ (this) .val ('') si vous voulez l'effacer.
mynameistechno

19

Au lieu de renvoyer false, vous pouvez également utiliser event.preventDefault ().

select: function(event, ui){
    var newTag = $(this).val();
    $(this).val("");
    $(this).parent().append("<span>" + newTag + "<a href=\"#\">[x]</a> </span>");
    event.preventDefault();
}

Je soupçonne que cette méthode est plus efficace que la réponse acceptée.
dlsso

6

return false est nécessaire dans le callback select, pour vider le champ. mais si vous voulez à nouveau contrôler le champ, c'est-à-dire définir la valeur, vous devez appeler une nouvelle fonction pour sortir de l'interface utilisateur.

Peut-être avez-vous une valeur d'invite telle que:

var promptText = "Enter a grocery item here."

Définissez-le comme valeur de l'élément. (sur focus, nous nous sommes mis à '').

$("selector").val(promptText).focus(function() { $(this).val(''); }).autocomplete({
    source: availableTags,
    select: function(){
        $(this).parent().append("<span>" + ui.item.value + "<a href=\"#\">[x]</a> </span>");
     foo.resetter(); // break out //
    return false;  //gives an empty input field // 
    }
});

foo.resetter = function() {
  $("selector").val(promptText);  //returns to original val
}

Bonjour, j'avais une question différente, à propos de l'enregistrement de l'invite, je ne peux pas utiliser d'espaces réservés pour des raisons techniques. C'était parfait, MERCI!
hgolov

5

Cela fonctionne bien pour moi.

Après avoir sélectionné l'événement, j'ai utilisé le changement d'événement.

 change:function(event){
   $("#selector").val("");  
   return false;
 }

Je suis un débutant!


0

Essaye ça

select: function (event, ui) {
    $(this).val('');
    return false;       
}

0

Je viens de le résoudre en forçant à perdre la concentration:

$('#select_id').blur();
printResult();
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.