J'ai conçu un programme pour taper une chaîne dans un div
.
<!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width, initial-scale=1"> </head> <body> <script> var i, speed, thraot, disp; i = 0; speed = 90; thraot = "Jesus is Lord, Forever..." disp = document.createElement("DIV"); disp.setAttribute('id', 'mytxt'); document.body.appendChild(disp); disp.innerHTML = ""; function myTyping() { if (i < thraot.length) { disp.innerHTML += thraot.charAt(i); i++; } dd = setTimeout(myTyping, speed); } setInterval(function() { myTyping(); }, speed * thraot.length); </script> </body> </html>
Je connais setInterval
qui appelle à plusieurs reprises une fonction à une milliseconde définie, mais cela ne fonctionne pas ici.
S'il vous plaît, j'aimerais que vous m'aidiez à le faire fonctionner encore et encore.
3 Réponses :
Vous pouvez réinitialiser i
et votre contenu div
dans le bloc else.
var i, speed, thraot, disp; i = 0; speed = 90; thraot = "Jesus is Lord, Forever..." disp = document.createElement("DIV"); disp.setAttribute('id', 'mytxt'); document.body.appendChild(disp); function myTyping() { if (i < thraot.length) { disp.innerHTML += thraot.charAt(i); i++; } else { disp.innerHTML = ""; i=0; } dd = setTimeout(myTyping, speed * thraot.length); } myTyping();
UPDATE: Ajout d'un exemple sans les données setInterval()
.
var i, speed, thraot, disp; i = 0; speed = 90; thraot = "Jesus is Lord, Forever..." disp = document.createElement("DIV"); disp.setAttribute('id', 'mytxt'); document.body.appendChild(disp); disp.innerHTML = ""; function myTyping() { if (i < thraot.length) { disp.innerHTML += thraot.charAt(i); i++; } else { disp.innerHTML = ""; i=0; } dd = setTimeout(myTyping, speed); } setInterval(function() { myTyping(); }, speed * thraot.length);
Cet exemple s'exécutera à chaque fois un peu plus vite.
Oui. On ne sait pas si c'est souhaité. Sinon, supprimez l'intervalle et appelez à la place myTypings ()
.
Oooh Merci mec je gat votre logique. Cela a fonctionné pour moi, mais s'accélère de plus en plus en vitesse ...
Voir le deuxième exemple.
Le deuxième exemple a multiplié throat.length et speed, et l'a utilisé contre ma fonction setTimeout (). Donc, ce n'est pas accepté s'il vous plaît.
Il semble que votre problème provienne de la non-réinitialisation du innerHTML
du div et de votre variable i
. Vous pouvez définir le délai comme vous le souhaitez. Si vous ne voulez pas que ce soit speed * thraot.length
, changez-le.
Merci beaucoup. Il a été corrigé ... Je vous félicite.
Il vous manque i = 0
avant d'appeler myTyping
dans setInterval
Si vous souhaitez effacer le texte actuel, réinitialisez également disp.innerHTML = ""
Je dis un grand merci à @ user0103, il a changé mon code en quelque chose d'excellent de bon.
Comment actualiser à plusieurs reprises une fonction d'effet de frappe encore et encore ...
<!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width, initial-scale=1"> </head> <body> <script> var i, speed, thraot, disp; i = 0; speed = 90; thraot = "Jesus is Lord, Forever..." disp = document.createElement("DIV"); disp.setAttribute('id', 'mytxt'); document.body.appendChild(disp); disp.innerHTML = ""; const sleep = ms => new Promise(resolve => setTimeout(resolve, ms)); (async function() { while(true) { for(let i = 0; i < thraot.length; ++i) { disp.innerHTML += thraot.charAt(i); await sleep(speed); } await sleep(speed); disp.innerHTML = ""; } })(); </script> </body> </html>
mais cela fonctionne ..
à plusieurs reprises, en recommençant à partir de J après avoir terminé toute la chaîne ??
J'ai essayé d'ajouter un setInterval pour le faire fonctionner à travers la chaîne encore et encore à plusieurs reprises.
jsfiddle.net/ha0pq4ek
@ user0103 Merci beaucoup ... je ne savais pas trop attendre de dormir.
@Danieluko Pas de problème, il suffit de garder à l'esprit que ce n'est pas vraiment un vrai «sommeil», c'est une promesse avec
attendre code> après tout