2012-11-10 18 views
5

Il Google autocomplete API non sembra attivarsi incollando il contenuto in un input di testo con il mouse. Funziona bene se coinvolge la tastiera, ma non con il mouse.Completamento automatico di Google non attivato incollando con il mouse

Ho notato, tuttavia, che dopo aver incollato il contenuto nell'input di testo si attiverà da quasi tutti i tasti (tasto freccia destra testato, tasto finale, spazio).

È possibile riproporlo qui sul proprio sito autocomplete demo.

È un bug? o come progettato? Se è come progettato, come applicare la soluzione alternativa? Finora ho risolto il problema, ma non sembra che gli eventi di keypress simulati funzionino.

$('.txtLocation').bind("paste", function (e) 
{ 
    $('.txtLocation').focus(); 
    var e = jQuery.Event("keydown"); 
    e.keyCode = 39; //39=Arrow Right 
    $('.txtLocation').trigger(e); 
}); 

risposta

5

Sembra che questo impatto non solo la pasta menu contestuale, ma anche quella di Modifica | Incolla dalla barra dei menu del browser, così come la funzionalità di pasta di iOS. Ho aperto un bug with Google. Si potrebbe desiderare di "Star" quel bug report per rilevare gli aggiornamenti.

ho trovato una soluzione che, mentre un po 'di un hack, sembra risolvere il problema. Se si memorizza il valore incollato, si passa a un campo diverso, si imposta il valore nel campo di completamento automatico e infine si concentra nuovamente sul campo di completamento automatico, le operazioni funzionano più o meno come previsto. Inoltre, devi farlo in un callback setTimeout() - il tempo di ritardo non sembra avere alcuna importanza, ma se lo fai solo in linea non vedrai i risultati previsti.

Ecco un esempio di codice di quello che sto descrivendo sopra:

$("#address_field").on("paste", googleMapsAutocompletePasteBugFix); 

googleMapsAutocompletePasteBugFix = function() { 
    return setTimeout(function() { 
     var field, val; 
     field = $("#address_field"); 
     val = field.val(); 
     $("#price").focus(); 
     field.val(val); 
     return field.focus(); 
    }, 1); 
}; 

L'ultima focus() è facoltativo, ma l'interfaccia utente è un po 'meno sorprendente che se hai appena saltato automaticamente al campo successivo.

+0

Non male. Questa correzione funziona in Opera, FF, Chrome e Safari, ma non in IE, in quanto la sta ancora risolvendo. Avvolto in .ready() e ha dovuto spostare la funzione sopra il riferimento ad esso in modo che potesse funzionare senza errori. Suppongo che lascerò questo mentre corregge tutti i browser ma IE, ma ancora non completa la soluzione. Bel tentativo però, +1 per lo sforzo. Qualche altra idea per IE? – johntrepreneur

+0

Ti dirò ... strano IE man ... E ovviamente, se c'è un browser in cui gli utenti hanno maggiori probabilità di utilizzare il menu del tasto destro, è quello! Hai provato ad aumentare il ritardo setTimeout per vedere se questo cambia le cose in IE? –

+0

Hm ... La modifica del ritardo di timeout non risolve il problema di IE. Giocato un po 'ma senza dadi - iniziando a pensare che la "soluzione" per IE è mostrare un DIV che contiene un messaggio che consiglia agli utenti di IE il bug e suggerisce di usare CTRL + V per incollare. –

0

seguente soluzione sembra funzionare per me (esistenza di campo che termina con "Indirizzo_2" si presume). Testato su IE8, IE9, IE10, Chrome, FF e Safari

if document.addEventListener 
     $(document).on("paste", "[name*=address_1]", @googleMapsAutocompletePasteBugFix) 
     $(document).on("onpaste", "[name*=address_1]", @googleMapsAutocompletePasteBugFix) 
    else 
     for element in $("input[name*=address_1]") 
     document.getElementById($(element).attr('id')).onpaste = @googleMapsAutocompletePasteBugFix 

    googleMapsAutocompletePasteBugFix: (e) -> 
    unless e 
     e = window.event 

    if e.srcElement 
     target = e.srcElement 
    else 
     target = e.target 

    field = $(target) 
    fieldId = field.attr('id') 
    focusSwitchFieldId = fieldId.replace(/(\d)$/, '2') 

    setTimeout(-> 
     if window.chrome || /Safari/.test(navigator.userAgent) 
     val = field.val() 
     $("##{focusSwitchFieldId}").focus() 
     field.val(val) 
     field.focus() 
     else 
     field = document.getElementById(fieldId) 
     val = field.value 
     document.getElementById(focusSwitchFieldId).focus() 
     setTimeout(-> 
      field.value = val 
      field.focus() 
      field.focus() 
     , 50) 
    , 10) 
Problemi correlati