2014-05-15 2 views
5

Sto cercando di scrivere una semplice funzione che far sembrare come se qualcuno sta scrivendo in un textareaSimulare l'aspetto di battitura a macchina, non i tasti premuti effettivi, in javascript

- Questa è la mia funzione (perdonate me se la sua atroce, ma che normalmente non usiamo javascript) --- la parte console.log() funziona bene, ma per qualche motivo non può ottenere questo script per aggiornare il DOM il modo in cui mi aspetterei ...

 function type(string) { 
      value = ""; 

      el = document.getElementById("typeArea"); 
      for (var i = 0; i < string.length; i++) { 
       value += string[i]; 
       //$("#fbw > textarea").val(value); 
       el.textContent = value; 
       console.log(value); 
       sleep(160); 
      } 
      sleep(2000); 
     } 

Apprezzo ogni idea che mi puoi dare.

+0

Perché avete etichettato questo jQuery, se non si sta usando jQuery? – meagar

+0

Cosa * succede * succede? Inoltre, jsfiddle/etc è bello per cose come questa. –

+0

jQuery è un'opzione che sono disposto a utilizzare. In effetti, ho provato prima jQuery. Buon punto, lancio un jsfiddle, momentaneamente. Tutto funziona, eccetto per la parte nel ciclo che dovrebbe aggiornare il contenuto dell'area di testo .... anche console.log mostra ogni aggiornamento ... –

risposta

9

jsFiddle Demo

Tutto ti mancava era un costrutto invece di Sleep. L'approccio js per la realizzazione di questo è quello di utilizzare un timeout e una chiamata ricorsiva per scorrere la stringa

function type(string,element){ 
(function writer(i){ 
    if(string.length <= i++){ 
    element.value = string; 
    return; 
    } 
    element.value = string.substring(0,i); 
    if(element.value[element.value.length-1] != " ")element.focus(); 
    var rand = Math.floor(Math.random() * (100)) + 140; 
    setTimeout(function(){writer(i);},rand); 
})(0) 
} 
+0

Ah, questo è esattamente quello che stavo cercando, e molto elegante -! Grazie, ha funzionato come un incantesimo, e questo spiega molto bene perché il mio codice non funzionava. –

+0

L'unico inconveniente di questo codice è che in IE ottiene lo stato attivo per ogni lettera che scrive in modo che la pagina diventi inutile. Alla ricerca di una soluzione ma al momento non valido per IE. – Javiere

+0

Perché questo non funziona con 'getElementsByClassName'? –

3

Si può fare qualcosa di simile usando la funzione setTimeout. Codepen

$(function(){ 
    simulateTyping('looks like someone is typing...', '#txt') 

    function simulateTyping(str, textAreaId) { 
    var textArea = $(textAreaId); 

    var currentCharIndex = 0; 
    function typeChar(){ 
     if (currentCharIndex >= str.length) 
     return; 
     var char = str[currentCharIndex]; 
     textArea.val(textArea.val() + char); 
     currentCharIndex ++; 
     setTimeout(typeChar, 500); 
    } 

    typeChar(); 

    } 
}) 
+0

Proverò quello momentaneamente, ma qualche idea del perché il codice I già scritto non funziona? –

+0

Beh, non hai un violino o una codepen, quindi è difficile dirlo. – milagvoniduak