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

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

4

5 回答 5

17

一个简单的解决方案:

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

最干净的解决方案是使用jQuery 的承诺系统

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

示范

于 2012-10-21T14:24:25.943 回答
4

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

jQuery("#div1")
于 2012-10-21T14:21:24.877 回答
4

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

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

希望这会有所帮助……穆罕默德。

于 2012-10-21T14:24:14.110 回答
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);
    } );   
})

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

于 2012-10-21T14:25:14.883 回答
2

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

var counter = 0;
jQuery("#div1, #div2").fadeIn('300').promise().done(function()
{
    counter++;
    console.log(counter);
});
于 2012-10-21T14:34:55.727 回答