Javascript 带for循环、样式和setInterval的js淡入式加载不工作?

Javascript 带for循环、样式和setInterval的js淡入式加载不工作?,javascript,animation,opacity,fadein,setinterval,Javascript,Animation,Opacity,Fadein,Setinterval,为什么在调用fadeIn()onLoad时,浏览器会立即通过循环运行。换句话说,setInterval或Opacityto()存在问题 我想有人会告诉我,使用jQuery可以最容易地做到这一点,但我对使用javascript很感兴趣 谢谢!救命啊 我猜setInterval中有一个讨厌的逗号,弄乱了参数列表: "Opacityto("+elem,i+")" ^^^ here 你可以试着引用逗号 + "," + 但是eval是邪

为什么在调用fadeIn()onLoad时,浏览器会立即通过循环运行。换句话说,setInterval或Opacityto()存在问题

我想有人会告诉我,使用jQuery可以最容易地做到这一点,但我对使用javascript很感兴趣


谢谢!救命啊

我猜setInterval中有一个讨厌的逗号,弄乱了参数列表:

"Opacityto("+elem,i+")"
                ^^^
                here
你可以试着引用逗号

+ "," + 
但是eval是邪恶的,所以不要这样做。最好的方法是传递一个真正的回调函数:

function make_opacity_setter(elem, i){
    return function(){
        OpacityTo(elem, i);
    };
}

...

setTimeout( make_opacity_setter(elem, i), 1000);
请注意,需要使用中间函数生成函数来避免闭包和for循环之间令人讨厌的交互


顺便说一句,当你这样做

setInterval(func(), 1000)

您自己调用func一次,然后将其返回值传递给setInterval。由于setInterval接收到的是垃圾值而不是回调,因此它将无法正常工作。

您的
fadeIn()
函数有几个问题:

function make_opacity_setter(elem, i){
    return function(){
        OpacityTo(elem, i);
    };
}

...

setTimeout( make_opacity_setter(elem, i), 1000);

A.for循环条件是
i==100
,这在第一次迭代时不是真的,因此for循环的主体将永远不会执行(不会发生
i++
)。也许你的意思是
我为什么不看看github上的JQuery源代码,看看他们是怎么做的?@AlienWebguy这是个好主意,我会去看看。谢塞瓦尔是邪恶的,兄弟。将实函数传递给setInterval,而不是字符串。@missingno当我第一次去掉引号时,它工作过一次。但随后每次重新加载都停止工作。我想你让我靠近了一点,谢谢!谢谢,你的回复中有太多信息,我需要仔细考虑一下。我还是一个新手,编码和循环结构是神秘的。setInteval vs.setTimeout,谁知道呢!可能有很多人。谢谢你传授知识。小心点,不客气。是的,
setInterval()
setTimeout()
一开始会让很多人绊倒,尤其是当涉及到循环时。很抱歉回答得太长,但我想我唯一能把它缩短的方法就是删除所有的解释,只给出我建议的新代码——说到这一点,我希望我的
fadeIn()
版本能帮到你。它做到了,再次感谢(如果我有声望,我会投票支持你的答案!)
"Opacityto("+elem,i+")"
"Opacityto(elem," + i + ")"
function fadeIn(i){
    // if called with no i parameter value initialise i
    if (typeof i === "undefined") {
       i = -1;
    }

    if (++i <= 100) {
       Opacityto(document.getElementById('nav'), i);
       setTimeout(function() { fadeIn(i); }, 100);
    }
}

// kick it off:
fadeIn();