2010-05-30 9 views
25

Sto utilizzando il seguente codice HTML per autoselect del testo in un campo modulo quando un utente fa clic sul campo:problema con Chrome movimentazione forma: onfocus input = "this.select()"

<input onfocus="this.select()" type="text" value="Search"> 

Funziona bene con Firefox e Internet Explorer (lo scopo è usare il testo predefinito per descrivere il campo all'utente, ma evidenziarlo in modo che al clic possano iniziare a digitare), ma ho problemi a farlo funzionare Cromo. Quando faccio clic sul campo modulo in Chrome, il testo viene evidenziato per una frazione di secondo, quindi il cursore salta alla fine del testo predefinito e l'evidenziazione scompare.

Qualche idea su come farlo funzionare anche in Chrome?

risposta

22

Invece di collegarsi all'evento onfocus è necessario associare questa azione all'evento onclick e funzionerà come desiderato.

<input onclick="this.select()" id="txt1" name="txt1" type="text" value="Search"> 
+1

Che gestirà il mouse, ma non la tastiera. Sarebbe molto meglio mantenere la concentrazione. Sospetto che il problema abbia a che fare con la chiamata a .select() piuttosto che quale evento venga attivato. –

+3

@Dan, ma la tabulazione nei campi utilizzando la tastiera seleziona automaticamente il loro contenuto comunque. –

+0

@Lee, non riesco a pensare a nessuno che non lo faccia, ma questo comportamento dipende dal browser che lo implementa. –

16

Se proprio insisti a attaccare con onfocus, allora avrete bisogno di aggiungere onmouseup="return false" troppo.

+0

Buona risposta. Funziona perfettamente su Chrome, Firefox e Safari. onfocus = "this.select()" onmouseup = "return false" – elMarquis

3

Il modo in cui ho risolto questo problema era creando una funzione wrapper che utilizza setTimeout() per ritardare la chiamata effettiva a select(). Quindi chiamo quella funzione nell'evento focus della casella di testo. L'utilizzo di setTimeout rimuove l'esecuzione fino a quando lo stack delle chiamate è nuovamente vuoto, ovvero quando il browser ha completato l'elaborazione di tutti gli eventi verificatisi quando si fa clic (mouse, mouse, clic, focus, ecc.). È un po 'un trucco, ma funziona.

function selectTextboxContent(textbox) 
{ 
    setTimeout(function() { textbox.select(); }, 10); 
} 

allora si può fare qualcosa di simile per fare la selezione a fuoco:

<input onfocus="selectTextboxContent(this);" type="text" value="Search"> 
+0

Questo era un buon uomo – Perseus

+0

Questa soluzione non funziona se ci sono più di 10 millisecondi tra il mouse premuto e il clic (l'utente tiene premuto il pulsante del mouse per più di 10 millisecondi). –

3

Sulla risposta di Jason, qui è una funzione che sostituisce la funzione "select" di nodi di input DOM con una versione aggiornata che ha il timeout costruito in:

if (/chrome/i.test(navigator.userAgent)) { 
    HTMLInputElement.prototype.brokenSelectFunction = 
     HTMLInputElement.prototype.select; 

    HTMLInputElement.prototype.select = function() { 
     setTimeout(function(closureThis) { return function() { 
      closureThis.brokenSelectFunction(); 
     }; }(this), 10); 
    }; 
} 

in sostanza, (in Chrome solo) abbiamo appena rinominato la funzione built-in, ma spezzato select() per brokenSelectFunction() e poi ha aggiunto un nuovo functio n a tutti gli ingressi chiamati select() che chiama brokenSelectFunction() dopo un ritardo. Ora chiamate semplicemente select() normalmente, poiché la funzione di selezione integrata è stata sostituita dalla funzione fissa con il suggerimento di delay di Jason.

In questo modo, non è necessario modificare le chiamate esistenti per utilizzare una funzione wrapper (e una volta risolto in Chrome, è sufficiente rimuovere lo shim precedente e tornare alla normalità).

textbox.select(); // now runs select with setTimeout built-in (in Chrome only) 

Edit: si potrebbe desiderare di cambiare la partita user-agent da "cromo" a "WebKit", in quanto questo problema si verifica in tutte le Webkit browser tra cui Safari, e questa correzione funziona per qualsiasi di loro.

+0

È fantastico! Funziona perfettamente. Sono stato infastidito da come Webkit ha rotto questo per anni! –

5

Questo funziona meglio per me ...

<input type="text" onfocus="this.searchfocus = true;" onmouseup="if(this.searchfocus) {this.select(); this.searchfocus = false;}" /> 

L'evento mouseup dopo onfocus.

+0

Working gr8 !!!! – Cyril

+1

Funziona male se lo stato attivo viene acquisito dalla tastiera. Il prossimo clic seleziona l'input invece di spostare il cursore. –

2

Basta usare <input onmouseup=select()>. Funziona su tutti i browser.

4

Questa è una soluzione che funziona in Firefox, Chrome e IE, entrambi con focus tastiera e mouse focus. Gestisce inoltre scatta correttamente dopo la messa a fuoco (si muove il cursore e non riselezionare il testo):

<input 
onmousedown="this.clicked = 1;" 
onfocus="if (!this.clicked) this.select(); else this.clicked = 2;" 
onclick="if (this.clicked == 2) this.select(); this.clicked = 0;" 
> 

Con il fuoco della tastiera, solo onfocus trigger che seleziona il testo perché this.clicked non è impostato. Con il focus del mouse, trigger onmousedown, quindi onfocus e quindi onclick che seleziona il testo in onclick ma non in onfocus (Chrome richiede questo).

I clic del mouse quando il campo è già a fuoco non si attivano onfocus che non determina la selezione.

1
onfocus="setTimeout(function(){select(this)})" 

o onfocus="setTimeout(function(){select(this)},118)" per Firefox.

2

Questa domanda è stata pubblicata cinque anni fa, ma con HTML5, è possibile rendere questa funzione con l'attributo segnaposto.

<input type="text" name="fname" placeholder="First name">