2012-03-17 8 views
8

Dopo una lunga lotta, ho finalmente trovato l'unico modo per cancellare il riempimento automatico styling in tutti i browser:rilevare quando il riempimento automatico è stato riempito

$('input').each(function() { 
    var $this = $(this); 

    $this.after($this.clone()).remove(); 
}); 

Il problema è, non può essere eseguito in load, perché il riempimento automatico dei campi avviene dopo il fatto. In questo momento sto in esecuzione su un timeout di 100 millisecondi dopo load:

// Kill autofill styles 
$(window).on({ 
    load: function() { 
     setTimeout(function() { 
      $('.text').each(function() { 
       var $this = $(this); 

       $this.after($this.clone()).remove(); 
      }); 
     }, 100); 
    } 
}); 

e che sembra sicura su anche il più lento dei sistemi, ma non è molto elegante. C'è qualche tipo di evento affidabile o controllo che posso fare per vedere se la compilazione automatica è completa?

MODIFICA: si tratta del riempimento automatico.

autofill http://dl.dropbox.com/u/2463964/autofill.png

+0

Solo curioso, perché vuoi cancellare i campi dei moduli autofilled? – j08691

+0

@ j08691: Non voglio cancellare i campi compilati automaticamente (non è quello che fa), voglio cancellare il brutto sfondo giallo che è anche immutabile nei CSS. – Ryan

+1

cos'è "riempimento automatico"? –

risposta

2

C'è un bug aperto su a http://code.google.com/p/chromium/issues/detail?id=46543#c22 relative a questo, sembra che potrebbe (dovrebbe) alla fine sarà possibile scrivere poco più lo stile di default con un selettore !important, che sarebbe la soluzione più elegante. Il codice sarebbe qualcosa di simile:

input { 
    background-color: #FFF !important; 
} 

Per ora però il bug è ancora aperta e sembra che la soluzione hacker è l'unica soluzione per Chrome, ma a) la soluzione per Chrome non ha bisogno setTimeout e B) Sembra che Firefox potrebbe essere rispetto al flag !important o una sorta di selettore CSS con priorità elevata come descritto in Override browser form-filling and input highlighting with HTML/CSS. questo aiuta?

+0

Sfortunatamente, ha effettivamente bisogno di 'setTimeout', e Firefox ha lo stesso problema. Credetemi, sto continuando a provare variazioni di entrambi mentre parliamo :) – Ryan

+0

Il thread che ho aggiunto alla fine ha anche una soluzione che è stata notata come funzionante, che è quella di utilizzare l'input: selettore di focus e uso onload javascript per mettere a fuoco ogni elemento della forma a sua volta. – conartist6

+0

L'ho visto, ma stranamente, non sembra funzionare per me. Sto usando Chrome Canary, quindi forse * che * "bug" è stato risolto :) – Ryan

12

Se si utilizza Chrome o Safari, è possibile utilizzare il selettore input:-webkit-autofill CSS per ottenere i campi autofilled.

codice di rilevamento

Esempio:

setInterval(function() { 
    var autofilled = document.querySelectorAll('input:-webkit-autofill'); 
    // do something with the elements... 
}, 500); 
+0

Sono consapevole di questo selettore. Tuttavia, non voglio alcun 'setInterval' né' setTimeout' nel mio codice. – Ryan

+1

Questo è di gran lunga la soluzione migliore che ho visto per il problema degli ingressi di caricamento automatico e di Chrome. input: -webkit-autofill è molto meglio di polling e setTimeout(), ecc. GRAZIE per aver davvero dato una risposta a questo problema di vecchia data! – ChrisN

+3

@ChrisN, questa risposta usa 'setInterval'. – Ryan

1

propongo si evitando il riempimento automatico al primo posto, invece di cercare di ingannare il browser

<form autocomplete="off"> 

Maggiori informazioni: http://www.whatwg.org/specs/web-forms/current-work/#the-autocomplete

Se si vuole mantenere il comportamento di riempimento automatico ma il cambiamento lo stile, forse si può fare qualcosa di simile (jQuery):

$(document).ready(function() { 
    $("input[type='text']").css('background-color', 'white'); 
}); 
+1

Si prega di leggere i commenti. Abbiamo stabilito che * non voglio disattivare il completamento automatico *. Per quanto riguarda l'impostazione di 'background-color' su' white', non funziona. Questo è esattamente il motivo per cui ho bisogno di soluzioni alternative. – Ryan

+0

Basta leggere, scusa @minitech mi dispiace, penso davvero che avrai bisogno del timeout, poiché i moduli vengono riempiti dal browser stesso dopo un po ', non il DOM –

-1
$(window).load(function() 
{ 
    if ($('input:-webkit-autofill')) 
    { 
     $('input:-webkit-autofill').each(function() 
     { 
      $(this).replaceWith($(this).clone(true,true)); 
     }); 
     // RE-INITIALIZE VARIABLES HERE IF YOU SET JQUERY OBJECT'S TO VAR FOR FASTER PROCESSING 
    } 
}); 

Ho notato che la soluzione jQuery che hai pubblicato non copiava eventi collegati. Il metodo che ho pubblicato funziona per jQuery 1.5+ e dovrebbe essere la soluzione preferita in quanto conserva gli eventi collegati per ciascun oggetto. Se si dispone di una soluzione per eseguire il ciclo di tutte le variabili inizializzate e inizializzarle nuovamente, sarà disponibile una soluzione jQuery completa al 100%, altrimenti sarà necessario inizializzare nuovamente le variabili impostate in base alle esigenze.

ad esempio: var foo = $ ('# foo');

quindi dovresti chiamare: foo = $ ('# foo');

perché l'elemento originale è stato rimosso e un clone ora esiste al suo posto.

+0

Non è sicuramente la mia soluzione preferita, però, perché a) usa lo sniffing del browser, che è sbagliato perché Firefox ha lo stesso bug eb) non funziona ancora, perché non c'è timeout. – Ryan

+0

Quale versione di Firefox ha il bug? Quindi posso modificare il mio commento di conseguenza, perché la mia versione attuale non mostra questo comportamento. Se non ti piace sfogliare lo sniffing basta eseguire un'istruzione if per vedere se quell'elemento esiste. Il motivo principale per cui è necessario un controllo di qualche tipo è perché alcune variabili potrebbero dover essere reinizializzate poiché le copie originali non sono più presenti. Inoltre, se hai bisogno di un timeout è facile da collegare, ma il mio ha funzionato perfettamente senza che uno sia presente, motivo per cui l'ho lasciato fuori dalla mia risposta. –

Problemi correlati