2010-07-20 75 views
8

Tôi đang sử dụng jQuery để thiết lập một bộ đếm thời gian hoặc khoảng thời gian trên một vài yếu tố để kiểm tra chúng mỗi vài giây. Tôi đã thử thiết lập một bộ đếm thời gian và kiểm tra nếu tôi nên khởi động lại nó, hoặc thiết lập và khoảng thời gian và kiểm tra xem tôi nên dừng nó.javascript hẹn giờ hoặc khoảng thời gian tạo ra trong vòng lặp bằng cách sử dụng đóng cửa

Mặc dù đơn giản, điều này về cơ bản là những gì tôi cần:

var mytimers = new Array(); 
$('div.items').each(function() { 
    myID = $(this).attr('id'); 
    mytimers[myID] = setInterval(function() { myFunction(myID) } , 3000) 
}); 
function myFunction(param) { 
    alert(param); 
    if (something()) { 
     clearInterval(mytimers[param]); 
    } 
} 

của ID cho các hạng mục lớp là ID_1, ID_2, id_3. Nhưng tôi chỉ nhận được 3 cảnh báo cho tất cả id_3. Trong mã của tôi, tôi bắt đầu cố gắng để vượt qua 'điều này', nhưng vẫn đơn giản hóa nó để tìm ra vấn đề.

Tôi làm cách nào để sao chép biến này sang địa chỉ mới mỗi lần? Tôi biết tôi cần phải sử dụng bao đóng. Nó có vẻ là tham khảo var khác không có mater gì.

tôi đã cố gắng đơn giản hóa nó vào một vòng lặp với giờ như vậy:

function tester(item) { 
    return function() { 
     alert(item); 
    }; 
} 
for(x=1;x<=3;x++) { 
    setTimeout('(function() { tester(x) })(x)' , 3000); 
} 

Nhưng tôi nghĩ rằng tôi chỉ làm cho vấn đề của tôi tồi tệ hơn và điều đó dường như không làm gì cả.

Tôi đã tìm kiếm các câu hỏi trước, nhưng hầu hết được lấp đầy với hàng tấn mã phụ thay vì cắt giảm vấn đề cụ thể và được giải quyết theo cách khác. Tôi muốn hiểu cách thức hoạt động tốt hơn bằng cách làm ví dụ này hoạt động. Tôi đã quản lý, trong khi viết này, để tìm ra tôi có thể thiết lập các bộ đếm thời gian với một chức năng giúp đỡ.

function tester(item) 
    alert(item); 
function myTimer(item) 
    setInterval(function() { tester(item); }, 3000); 
for(x=1;x<=3;x++) 
    myTimer(item); 

Làm cách nào để thực hiện điều này nếu không có điều đó? Có cách nào tốt hơn không?

+3

Bạn thực sự cần khai báo * tất cả * biến cục bộ của bạn bằng 'var', bao gồm các chỉ mục vòng lặp. – Pointy

Trả lời

3

Bạn đang ở trong một đóng cửa khi bạn sử dụng mỗi, bạn chỉ cần quên để làm cho biến riêng của bạn trong phạm vi chức năng

var mytimers = new Array(); 
$('div.items').each(function() { 
    **var** myID = $(this).attr('id'); 
    mytimers[myID] = setInterval(function() { myFunction(myID) } , 3000) 
}); 
function myFunction(param) { 
    alert(param); 
    if (something()) { 
     clearInterval(mytimers[param]); 
    } 
} 
+0

* trán giả * Tôi thực sự đã thử var ở mọi nơi, ngoại trừ một, ha. – phazei

4

Có biến 'myid' địa phương để các chức năng ẩn danh, var

var myID = $(this).attr('id'); 
1

Vì vậy, bạn muốn chạy myFunction trên từng yếu tố được kết hợp sau mỗi ba giây?

Hãy thử điều này:

$('div.items').each(myFunction(this)); 

var myFunction = function(elem) { 
    return function() { 
     if (something(elem)) { 
      //return or do something with elem 
     } else { 
      window.setTimeout(myFunction(elem), 3000); 
     } 
    } 
}; 

Nếu điều kiện trong something() được đáp ứng bạn đã hoàn tất, nếu không phải là lịch trình chức năng tự chạy lại trong 3 giây với các yếu tố tương tự như trước. Bạn có thể gọi nó bao nhiêu lần tùy ý trên các phần tử khác nhau, mỗi cuộc gọi có số elem riêng.

Tôi thích chuyển các đối tượng như elem xung quanh và trì hoãn làm việc với nội bộ của chúng cho đến giây phút cuối cùng có thể. Hãy để something() lo lắng về id hoặc bất kỳ điều gì.

Không có môn thể dục nào khác với mảng kết hợp (thay vì new Array() bạn chỉ có thể sử dụng {}) hoặc clearInterval hoặc ID là cần thiết.

Để thực sự giải quyết giải pháp của bạn, như Marimuthu đã nói, bạn để lại var khỏi tuyên bố myID, có nghĩa là toàn cầu và nó sẽ bị ghi đè mỗi lần lặp lại.Kết quả là khi setInterval gọi số myFunction thay vì nhận được số myID địa phương duy nhất thông qua việc đóng, bạn sẽ nhận được số tiền toàn cầu đã bị ghi đè vào thời gian umpty.

Các vấn đề liên quan