jQuery fadeIn在其回调中运行两次

时间:2012-10-21 14:18:47

标签: javascript jquery

var counter = 0;
jQuery("#div1, #div2").fadeIn('300',function(){
{
    counter++;
    console.log(counter);
}

上面的代码将打印“1”和“2”,因为jQuery fadeIn隐含在两个不同的DOM对象上。 反正有没有让它只运行一次而不破坏这段代码?

5 个答案:

答案 0 :(得分:17)

一个简单的解决方案:

$("#div1").fadeIn(300);
$("#div2").fadeIn(300,function(){
   // do something only once
});

最干净的解决方案是使用jQuery's promise system

$.when($("#div1, #div2").fadeIn('300')).done(function(){
   // do something only once
});

demonstration

答案 1 :(得分:4)

您明确告诉它要运行两次,因为您已经定义了两个项目的选择器。如果您希望它运行一次,请让它在一个项目上运行:

jQuery("#div1")

答案 2 :(得分:4)

这是一个快速的解决方案,但不是最好的

var myFlag = true;
jQuery("#div1, #div2").fadeIn('300',function(){
{
    if(myFlag == true)
    {
        // write the code here
        myFlag = false;
    }
}

希望这有帮助......穆罕默德。

答案 3 :(得分:2)

在对代码进行排序方面:

jQuery("#div1, #div2").fadeIn('300',function(){
    counter++;
    console.log(counteR);
});

相同
jQuery("#div1, #div2").each(function(){
   jQuery(this).fadeIn('300',function(){
        counter++;
        console.log(counteR);
    } );   
})

所以你的回调会为每个元素触发

答案 4 :(得分:2)

在jQuery 1.6中使用新的.promise(),它是为了解决多个回调问题,使用它如下:

var counter = 0;
jQuery("#div1, #div2").fadeIn('300').promise().done(function()
{
    counter++;
    console.log(counter);
});