2011-11-18 12 views
6

Eventuali duplicati:
Set cursor at a length of 14 onfocus of a textboxVoglio mettere cursore all'inizio del testo-box onfocus

io sono in grado di farlo in Firefox e IE. Ma per qualche motivo non il suo lavoro in Chrome e Safari :(

Sto semplicemente usando sotto la linea onfocus

$('input:text').focus(
function(){ 
     document.getElementById('id').setSelectionRange(0, 0); 
    }); 

Qualcuno può dirmi come fare cosa simile in Chrome e Safari?

+0

ho già provato prima di inviare questa domanda. Ci sono altre domande simili, ma sia createTextRange che setSelectionRange non funzionano per me sul mio safari n chrome .. qualche suggerimento perché? –

+0

Questo non dovrebbe essere chiuso come duplicato in quanto non ci sono risposte alla domanda di cui sopra che risolvono questo problema - che fallisce in Webkit. – gilly3

risposta

12

Il problema è che Chrome (non ho sentito parlare di Safari fare questo pure, ma ti porterà sulla parola) uccide la selezione dopo l'evento attenzione si è sparato, quindi è necessario aggiungere un timer. Quanto segue è adattato da mia risposta qui:

How to place cursor at end of text in textarea when tabbed into

Tuttavia, questo genere non è una buona usabilità: è in contrasto con ciò che l'utente si aspetta e rimuove la funzionalità utile quando si utilizza il mouse (vale a dire il punto di inserimento andando al posizione in cui l'utente fa clic). Probabilmente è possibile aggirare il problema con un po 'di gestione degli eventi mousedown e mouseup.

demo dal vivo: http://jsfiddle.net/timdown/z9DhX/1/

Codice:

function moveCaretToStart(el) { 
    if (typeof el.selectionStart == "number") { 
     el.selectionStart = el.selectionEnd = 0; 
    } else if (typeof el.createTextRange != "undefined") { 
     el.focus(); 
     var range = el.createTextRange(); 
     range.collapse(true); 
     range.select(); 
    } 
} 

var textBox = document.getElementById("id"); 

textBox.onfocus = function() { 
    moveCaretToStart(textBox); 

    // Work around Chrome's little problem 
    window.setTimeout(function() { 
     moveCaretToStart(textBox); 
    }, 1); 
}; 
+0

Grazie mille per la spiegazione! il suo funzionamento in tutti i browser ora con timeout fn :) –

+0

Grazie Tim. Di gran lunga la risposta più utile che ho visto su SO. – mwrf

5

.. Webkit sta reimpostando la posizione del cursore come parte della manifestazione messa a fuoco, è necessario rinviare l'esecuzione dello script fino a dopo l'evento è completamente sparato Utilizzando setTimeout con un ritardo di 0 è abbastanza buono:

$(":text").focus(function() { 
    var input = this; 
    setTimeout(function() { 
     input.setSelectionRange(0, 0); 
    }, 0); 
}); 

demo di lavoro: http://jsfiddle.net/ZkqGH/1/

+0

grazie per la risposta, ma la sua non ancora lavorando :(.. il mio cursore va alla fine del valore di testo quando si fa clic al suo interno (solo in Chrome e Safari) in Firefox funziona bene come previsto –

+1

@Deepak -.. I' ve riscritto la mia risposta. 'setSelectionRange()' funziona bene, non vi resta che ritardare l'esecuzione per evitare che Chrome di reimpostare la posizione del punto di inserimento. – gilly3

Problemi correlati