2013-02-13 2 views
4

Salut, je suis un novice Javascript. J'ai programmé un script qui tape automatiquement une phrase sur une page, fait une pause pendant un moment, efface la div, tape automatiquement la phrase suivante et ainsi de suite. Il devrait continuellement boucle.Comment "attendre" sans bloquer (attendre occupé) en JavaScript?

J'ai trouvé un problème lors de l'utilisation d'une solution JavaScript wait() trouvée. Lorsque chaque phrase est dans sa période de pause, tous les autres JavaScript sont désactivés sur la page. J'ai recherché et constaté que ceci est dû à un problème de blocage dans JavaScript, car les multi-threads n'existent pas? Compte tenu de ma situation, je n'ai pas été en mesure de trouver une solution pour permettre à la phrase de rester avant d'être effacée, tout en n'entraînant pas de blocage.

Voici mon code. Aucun conseil ?

var index = 0; 
var phrases = new Array(); 

//add a new variable to the array to add new phrases 
phrases[0] = "Type the first phrase."; 
phrases[1] = "Type the second..."; 
phrases[2] = "Type the third..."; 

var split_chars = phrases[index].split(""); 

function type_phrases() 
{ 
    if(split_chars.length > 0) { 
     document.getElementById('matrix_typer').innerHTML += split_chars.shift(); 
     } 
     else { 
     clearTimeout(loopTimer); 
     wait(10000);//add a delay before the next phrase is typed 
     document.getElementById('matrix_typer').innerHTML = " "; 
     index += 1; 

     if(index >= phrases.length) 
     { 
     index = 0; 
     } 
     split_chars = phrases[index].split("");  
     } 
    loopTimer = setTimeout('type_phrases()',400); 

} 

function wait(ms) { 
    var start = +(new Date()); 
    while (new Date() - start < ms); 
} 
+3

En outre, vous devriez éviter le setTimeout avec string, qui doit utiliser eval, il suffit d'utiliser 'setTimeout (type_phrases, 400)' –

+1

FYI ce n'est pas vraiment un problème spécifique à javascript. Si vous [attendez] (http://en.wikipedia.org/wiki/Busy_waiting) dans la plupart des langues cela arrivera. –

Répondre

2

utilisent deux fonctions et ajouter un autre délai d'attente au lieu de votre fonction de retard

var phrases = new Array(); 

//add a new variable to the array to add new phrases 
phrases[0] = "Type the first phrase."; 
phrases[1] = "Type the second..."; 
phrases[2] = "Type the third..."; 

var index = 0; 
var split_chars = phrases[index].split(""); 

function type_phrase() 
{ 
    document.getElementById('matrix_typer').innerHTML = "&nbsp;"; 
    split_chars = phrases[index].split(""); 

    return type_char(); 
} 

function type_char() 
{ 
    if(split_chars.length > 0) 
    { 
     document.getElementById('matrix_typer').innerHTML += split_chars.shift(); 
    } 
    else 
    { 
     clearTimeout(charloopTimer); 
     phraseloopTimer = setTimeout('type_phrases()',1000); //set a timeout instead of a delay 
     index += 1; 
     if(index >= matrix_phrases.length) 
      index = 0; 
    } 
    charloopTimer = setTimeout('type_char()',400); 
} 
4

utilisation SetTimeOut

setTimeout(function() { 
    // do something 1000ms later here. 

}, 1000); 

se réfèrent à JavaScript.setTimeout

+1

Bien que la réponse soit techniquement correcte, il existe des ressources _far_ mieux à fournir que W3Schools. –

+0

sûr! c'était le meilleur résultat dans google ... Que diriez-vous de celui-ci à la place: http://stackoverflow.com/questions/10312963/javascript-settimeout –

+2

Sérieusement, google devrait bloquer w3Schools :) –

Questions connexes