我收到未定义“ txtname”的错误。
let i = 0;
let txtOne = 'Hi';
let txtTwo = 'My name is Sarah';
let txtThree = "and I'm learning web development";
let speed = 200;
let firstdiv = document.querySelector(".firstOne");
let nextdiv = document.querySelector(".nextOne");
let lastdiv = document.querySelector(".lastOne");
function typeWriter(txtname, divname) {
if (i < txtname.length) {
divname.innerHTML += txtname.charAt(i);
i++;
setTimeout(typeWriter, speed);
}
}
window.onload = typeWriter(txtOne, firstdiv);
firstdiv.addEventListener("animationend", typeWriter(txtTwo, nextdiv));
nextdiv.addEventListener("animationend", typeWriter(txtThree, lastdiv));
为什么txtname出现为undefined?它不应该被我在typeWriter函数中作为参数传递的内容所取代吗? 为什么typeWriter函数不查看txtOne.length或txtTwo.length等?
我仍在学习javascript,因此,如果这是一个基本错误,请原谅。
答案 0 :(得分:4)
setTimeout(typeWriter, speed)
表示在200毫秒内将不带任何参数调用typeWriter
。上一个调用的参数不会自动结转到下一个调用,您需要提供它们。您可以使用匿名函数来做到这一点:
setTimeout(function () { typeWriter(txtname, divname) }, speed)
在解决此问题时,可能还应该将i
之类的状态移入函数中,而不要依赖于全局状态。您可以通过接受i
作为参数,但将其默认值设为0
:
function typeWriter(txtname, divname, i) {
i || (i = 0);
if (i < txtname.length) {
divname.innerHTML += txtname.charAt(i);
setTimeout(function () { typeWriter(txtname, divname, i + 1) }, speed);
}
}
这是带有递归函数的常见模式。
另一个问题是您设置事件处理程序的方式。您实际上是将typeWriter
函数的返回值设置为事件处理程序,而不是函数本身。您应该删除调用运算符,即window.onload = typeWriter
,但是由于要使用特定参数调用该函数,因此需要将代码包装到另一个函数中:
window.onload = function() { typeWriter(txtOne, firstdiv) };
firstdiv.addEventListener("animationend", function() { typeWriter(txtTwo, nextdiv) });
nextdiv.addEventListener("animationend", function() { typeWriter(txtThree, lastdiv) });