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

Đoạn mã trên sẽ in "1" và "2" vì jQuery fadeIn được ngụ ý trên hai đối tượng DOM khác nhau. Có cách nào để nó chỉ chạy một lần mà không vi phạm mã này?jQuery fadeIn chạy hai lần trong lời gọi lại

+0

Bạn có muốn có một bộ đếm cho mỗi phần tử không? Bạn đang cố làm gì vậy ? –

+0

@ dystroy, tôi cần phải làm một số công cụ duy nhất một lần trong chức năng gọi lại – Alon

Trả lời

4

Đó là một giải pháp nhanh chóng nhưng không phải là tốt nhất

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

Hope this helps ... Muhammad.

+0

Giải pháp này có thể là giải pháp tốt nhất cho tôi vì tôi đang sử dụng jQuery v1.4.2 và không thể cập nhật nó – Alon

4

Bạn đang rõ ràng bảo nó chạy hai lần vì bạn đã xác định bộ chọn của hai mục. Nếu bạn muốn nó chạy một lần, hỏi nó để chạy trên một mục:

jQuery("#div1") 
+0

cảm ơn flem đây là câu trả lời đúng, cho câu hỏi này: chỉ chia chúng thành hai câu: jQuery ("# ​​div1"). FadeIn ('300'); jQuery ("# ​​div2"). FadeIn ('300', function() { { truy cập ++; console.log (counter); }) – Anas

17

Một giải pháp đơn giản:

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

Giải pháp sạch nhất là sử dụng jQuery's promise system:

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

demonstration

+0

Không hoạt động khi cài đặt jQueery v1.4.2. – Alon

+0

Cập nhật jQuery. Hiện tại chúng tôi đang ở phiên bản 1.8. –

+0

Nếu tôi có thể cập nhật, tôi đã làm điều đó :) – Alon

2

Xét về trình tự mã của bạn:

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

là giống như

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

SO callback của bạn sẽ cháy cho mỗi phần tử

2

Sử dụng mới .promise() trong jQuery 1.6, nó đã được thực hiện để giải quyết mà nhiều callbacks vấn đề, sử dụng nó như vậy:

var counter = 0; 
jQuery("#div1, #div2").fadeIn('300').promise().done(function() 
{ 
    counter++; 
    console.log(counter); 
}); 
Các vấn đề liên quan