2010-08-11 17 views
14

Sto utilizzando il widget UI completamento automatico per un modulo per consentire agli utenti di digitare un nome cliente. L'idea è che possono selezionare un cliente esistente e compilare altri campi nel modulo oppure possono liberare un nuovo cliente da creare. Quando un utente seleziona un cliente esistente, utilizzo l'evento select per popolare un input nascosto per memorizzare l'ID associato a tale cliente.Evento di modifica automatica UI JQuery - azzeramento dell'ID selezione

Il problema che sto riscontrando è se un utente seleziona prima un cliente dalla lista ma poi entra e modifica il testo, in effetti creando un nuovo cliente, devo essere in grado di cancellare quel valore dell'ID di input nascosto .

ho fatto riferimento alla this SO question e ha creato il seguente codice:

$(function() { 
      $("#customerName").autocomplete({ 
       source: "/Customers/CustomerListJSON", 
       minLength: 2, 
       select: function(event, ui) { 
        $("#customerId").val(ui.item ? ui.item.Id : ""); 
       }, 
       change: function(event, ui) { 
        try { 
         $("#trace").append(document.createTextNode(event.originalEvent.type + ", ")); 
         if (event.originalEvent.type != "menuselected") 
          $("#customerId").val(""); 
        } catch (err) { 
         $("#customerId").val(""); 
        } 
       } 
      }); 
     }); 

Il problema è che l'evento di modifica è sparato su blur, quindi se un utente seleziona un cliente, il valore di input nascosto è popolata, ma come appena spostano il focus dalla casella di input, vengono immediatamente cancellati. Tuttavia, se escludo l'evento blur dal test event.originalEvent.type, il valore del campo nascosto non viene mai ripristinato nello scenario originale in cui un utente modifica un valore precedentemente selezionato.

chiunque ha dovuto affrontare questo prima, e in tal caso è possibile offrire alcune indicazioni su come posso gestire valore di input nascosto in modo che sia popolato solo quando un elemento viene selezionato dalla lista e liquidati con qualsiasi altro valore?

risposta

29

Sembra che l'ho risolto abbastanza rapidamente da solo. Riferendosi alla JQuery UI wiki, la voce ui in caso change è lo stesso in caso select, così posso modificare il mio codice per leggere in questo modo:

$(function() { 
    $("#customerName").autocomplete({ 
     source: "/Customers/CustomerListJSON", 
     minLength: 2, 
     select: function(event, ui) { 
      $("#customerOrganizationId").val(ui.item ? ui.item.Id : ""); 
     }, 
     change: function(event, ui) { 
      $("#customerOrganizationId").val(ui.item ? ui.item.Id : ""); 
     } 
    }); 
}); 

Non c'è bisogno di testare per l'evento, solo per se c'è un elemento nell'argomento ui. L'impostazione dell'ID nell'evento select è probabilmente ridondante, ma per essere sicuro manterrò entrambi.

+0

Cool! Ho lo stesso bisogno ma ora ho bisogno di più autocompletamento, quindi per esempio se seleziono 'cliente1' il suo id verrebbe impostato nel campo nascosto ora digito' abcd' ora di nuovo comando il completamento automatico e seleziono 'cliente2' in modo che il suo id dovrebbe essere spinto, ora se rimuovo 'customer2' solo il suo id dovrebbe essere rimosso dalla lista nascosta, eventuali pensieri rapidi? –

+0

Sembra che tu stia cercando qualcosa come gli strumenti di taggatura. Lo strumento di completamento automatico lo farà, ma non è carino. Preferisco qualcosa del genere: http://webspirited.com/tagit/#demos. Ci sono alcuni controlli come questo là fuori ... Tagit è solo uno che ho usato in passato con successo. –

+0

È utile, ma dovrebbe esserci anche il contenuto, quindi se uso la stringa di trigger dovrebbe attivare il completamento automatico altrimenti non –

0
$(function() { 
$("#customerName").autocomplete({ 
    source: "/Customers/CustomerListJSON", 
    minLength: 2, 
    select: function(event, ui) { 
     $("#customerId").val(ui.item ? ui.item.Id : ""); 
    }, 
    change: function(event, ui) { 
     try { 
      $("#trace").append(document.createTextNode(event.originalEvent.type + ", ")); 
      if (event.originalEvent.type != "menuselected") 
       $("#customerId").val(""); 
     } catch (err) { 
      $("#customerId").val(""); 
     } 
    } 
}); 
}); 
Problemi correlati