2014-11-19 14 views
7

C'è un modo per modificare il contenuto di uno input o textarea con javascript e fare in modo che tale modifica sia annullata con il comando "annulla" del browser (ad esempio ctrl-Z)?È possibile modificare un input di testo con javascript e aggiungerlo allo stack di annullamento?

Sto cercando di inserire una stringa, come "Foo {0} bar", nel valore della selezione, e se l'utente ha selezionato un intervallo, l'intervallo selezionato viene inserito nella stringa al posto del "{0}".

Ad esempio se la textarea contiene "Esempio 1 2 3" e il cursore si trova su "Esempio 1 | 2 3", la funzione cambierebbe il valore in "Esempio 1Foo blah bar 2 3" (valueIfNothingSelected è "blah" " in questo caso). Se è stato selezionato l'intervallo "1 2", la funzione cambierebbe invece il valore in "Esempio Foo 1 2 bar 3".

In Chrome ho provato questa funzione, e fa quello che si suppone, ma non posso invertire la modifica con undo.

function insertTextAtCursor(text, valueIfNothingSelected) { 
    var field = $('textarea[name="task_log_description"]')[0]; 
    var startPos = field.selectionStart; 
    var endPos = field.selectionEnd; 
    var processedText; 
    if (startPos == endPos) { 
     processedText = text.replace('{0}', valueIfNothingSelected); 
     field.value = field.value.substring(0, startPos) + processedText + field.value.substring(endPos, field.value.length); 
     field.selectionStart = startPos + text.indexOf('{0}'); 
     field.selectionEnd = field.selectionStart + valueIfNothingSelected.length; 
    } else { 
     var selectedText = field.value.substring(startPos, endPos); 
     processedText = text.replace('{0}', selectedText); 
     field.value = field.value.substring(0, startPos) + processedText + field.value.substring(endPos, field.value.length); 
     field.selectionStart = startPos + text.indexOf('{0}'); 
     field.selectionEnd = field.selectionStart + selectedText.length; 
    } 
    field.focus(); 
} 
+1

ctrl-z già funziona per me in Chrome + Firefox su Ubuntu 14.04. Qual è la situazione in cui non funziona per te? – Jack

+0

@Jack Domanda estesa per includere il mio metodo javascript. Per qualsiasi motivo, 'Ctrl-z' non funziona quando si usa questo metodo. –

+0

possibile duplicato di [Javascript textarea undo redo] (http://stackoverflow.com/questions/7553430/javascript-textarea-undo-redo) – Fraser

risposta

6

ho trovato una soluzione che funziona a https://stackoverflow.com/a/10345596/1021426

Sostituendo le righe "field.value = ..." con:

document.execCommand("insertText", false, processedText); 

... e in movimento "campo.Focus() "prima di quella linea, sono stato in grado di ottenere la funzionalità di annullamento/ripristino che desideravo.

+0

Non dimenticare di accettare questa risposta poiché hai risolto il tuo problema. Ciò lo evita di presentarsi come senza risposta. – GregL

+0

Non posso accettare la mia risposta fino a 2 giorni da ora. –

Problemi correlati