Sto avendo un sacco di problemi nel far funzionare il widget di completamento automatico di jQuery per me. Sto usando un elenco di coppie chiave/valore da un server.jQuery UI Completamento automatico con ricerca testo/ID ibrida
Ho i seguenti requisiti:
Se l'utente seleziona un valore dal widget, voglio passare l'ID al server.
Se l'utente non seleziona un valore e immette il testo non elaborato, oppure modifica un valore che è già stato selezionato, voglio che il campo ID venga cancellato e solo il testo non elaborato da inviare al server.
Si supponga che someAjaxFunction
restituisca una matrice di oggetti che il widget di completamento automatico si aspetta: {label:label, value:key}
.
Inizialmente ho impostato il completamento automatico widget di up in questo modo:
$(input).autocomplete({
source: sourceFunction,
minLength: 1
});
Modifica della selezione, anche posizionando il mouse sopra una delle voci cambia il testo nella casella di testo a cui fa riferimento $ (input) al tasto sottostante, piuttosto che l'etichetta. Questo è altamente indesiderabile dal punto di vista dell'interazione dell'utente - anzi, la ragione per cui sto indagando questo è perché gli utenti del sito che sto costruendo sono stati costantemente sconcertati dal testo che hanno inserito apparentemente trasformandosi in numeri casuali!
ho aggiunto un campo nascosto sotto la casella di testo e attuato la select() e messa a fuoco() eventi al fine di mascherare l'ID in questo modo:
$(input).autocomplete({
source: sourceFunction,
minLength: 1
focus: function(event, ui) {
$(idField).val(ui.item.value);
$(this).val(ui.item.label);
return false;
},
select: function(event, ui) {
$(idField).val(ui.item.value);
$(this).val(ui.item.label);
return false;
},
minLength: 1
});
Questo funziona bene quando l'utente è attaccare al script fornito dal menu a discesa del completamento automatico. L'ID è nascosto e correttamente inviato al server. Sfortunatamente, se l'utente vuole inserire del testo a mano libera nella casella e cercare in base a quel valore, il campo ID non viene ripristinato e l'ID precedentemente selezionato viene inviato al server. Anche questo è piuttosto confuso.
La documentazione di completamento automatico dell'interfaccia utente jQuery elenca un evento change
e afferma che la proprietà item
dell'argomento ui
verrà impostata sull'elemento selezionato. Ho immaginato di poter resettare il campo ID nascosto su un tasto premuto e ri-compilare l'ID se il completamento automatico è stato modificato. Sfortunatamente, oltre all'evento keypress che cattura un intero gruppo di pressioni di tasti che non deve resettare l'ID, l'istruzione return false
nell'evento select
necessario per gestire il testo nella casella di testo impedisce l'evento change
dall'avere ui .item correttamente assegnato.
Così ora sono bloccato - Non so davvero cos'altro posso provare per rendere la funzionalità di supporto widget che sembra dovrebbe supportare per impostazione predefinita. O questo processo è molto più complicato di quanto dovrebbe essere, o mi manca qualcosa di veramente ovvio. Ho raccolto tutti gli eventi disponibili e tutti gli esempi e sono venuto a mani vuote. Infatti, anche l'esempio "Dati personalizzati e visualizzazione" sulla pagina dell'interfaccia utente jQuery soffre di questo problema.
Posso aggiungere alcuni hack sul lato server per coprire per questo, ma io preferirei davvero essere in grado di farlo a livello di client.
Preferisco anche attenermi al widget di completamento automatico dell'interfaccia utente di jQuery piuttosto che passare a un altro.
Spiacente, posso chiarire qualcosa? Almeno uno dei tuoi problemi è che desideri che la casella ID venga riempita * * dell'ID associato se l'utente immette un valore che ha un ID corrispondente o qualsiasi cosa l'utente sta digitando se non c'è un valore corrispondente - corretto/errata? – Stephen
Nah, voglio solo che il campo ID nascosto sia vuoto se il testo nella casella di testo è impostato su qualcosa che non corrisponde a una selezione offerta dal completamento automatico. – Shabbyrobe