Cancella il campo del modulo dopo la selezione per il completamento automatico dell'interfaccia utente jQuery


97

Sto sviluppando un modulo e utilizzo il completamento automatico dell'interfaccia utente jQuery. Quando l'utente seleziona un'opzione, desidero che la selezione venga visualizzata in un intervallo aggiunto al <p>tag principale . Quindi voglio che il campo si cancelli piuttosto che essere popolato con la selezione.

Ho la durata che sembra a posto, ma non riesco a liberare il campo.

Come si annulla l'azione di selezione predefinita del completamento automatico dell'interfaccia utente di jQuery?

Ecco il mio codice:

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>");
    }
});

Il semplice fatto $(this).val("");non funziona. Ciò che è esasperante è che quasi la funzione esatta funziona bene se ignoro il completamento automatico e agisco solo quando l'utente digita una virgola come tale:

$('[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>");
    }
});

Il vero risultato finale è ottenere il completamento automatico per lavorare con più selezioni. Se qualcuno ha qualche suggerimento in merito, sarebbe il benvenuto.

Risposte:


182

Aggiungi $(this).val(''); return false; alla fine della tua selectfunzione per cancellare il campo e annullare l'evento :)

Ciò impedirà l'aggiornamento del valore. Puoi vedere come funziona intorno alla riga 109 qui .

Il codice in là controlla per falso in particolare:

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

Fantastico! Però mi sento sciocco. Ora lo so, e conoscere è metà della battaglia.
Jon F Hancock

Lo ha risolto. Ho provato ad accettare, ma mi ha detto che non potevo farlo per altri 7 minuti. Accettato. Grazie.
Jon F Hancock

1
Vorrei solo aggiungere che una volta restituito false non è più necessario impostare il valore da soli (ovvero non è necessario $(this).val('');)
Uri

9
Se si desidera che il campo di input sia privo di qualsiasi valore, credo che .val('')debba comunque verificarsi una chiamata a . Il return false;solo impedirà il testo della voce selezionata di apparire nel campo di input.
Ryan

1
Uri non è corretto e Ryan ha ragione. È necessario restituire false per evitare che si aggiorni con la selezione e inoltre è necessario $ (this) .val ('') se si desidera cancellarlo.
mynameistechno

19

Invece di return false puoi anche usare event.preventDefault ().

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

Sospetto che questo metodo sia più efficiente della risposta accettata.
dlsso

6

return false è necessario all'interno del callback select, per svuotare il campo. ma se vuoi controllare di nuovo il campo, cioè impostare il valore, devi chiamare una nuova funzione per uscire dall'UI.

Forse hai un valore prompt come:

var promptText = "Enter a grocery item here."

Impostalo come val dell'elemento. (sul focus ci siamo impostati su '').

$("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
}

Ciao, avevo una domanda diversa, sul salvataggio del prompt, non posso utilizzare i segnaposto per motivi tecnici. Questo è stato perfetto, GRAZIE!
hgolov

5

Funziona bene per me.

Dopo aver selezionato l'evento, ho utilizzato la modifica dell'evento.

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

Sono un principiante!


0

Prova questo

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

0

L'ho appena risolto costringendo a perdere la concentrazione:

$('#select_id').blur();
printResult();
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.