2011-09-25 44 views
10

Tôi đang sử dụng JavaScript với jQuery. Tôi có đoạn mã sau để cảnh báo hi cứ 30 giây một lần.JavaScript - Khoảng thời gian jQuery

$(document).ready(function() { 
    alert("hi"); 
setInterval(function() { 
    alert("hi"); 
}, 30000); 
}); 

tôi muốn thông báo với hi khi tải trang (khi tài liệu/trang bị hoàn toàn tải) và trên mỗi khoảng thời gian 30 giây sau đó (như hi (0s) - hi (30s) - hi (60) .. v.v.) Nhưng giải pháp của tôi hoạt động trên hai trường hợp. Một trên DOM sẵn sàng và một trong một vòng lặp. Có cách nào để làm tương tự trong một trường hợp duy nhất?

Bạn có thể xem fiddle here của mình.

+0

Sự cố là gì? Thông báo jsFiddle của bạn ban đầu và sau mỗi 30 giây sau đó chính xác như mã chỉ định. setInterval không gọi hàm của nó cho đến khi hết thời gian. Nếu bạn muốn nó thực hiện ban đầu, sau đó bạn chỉ cần gọi nó như bạn đã làm. Nếu đó là một đoạn logic phức tạp hơn mà bạn muốn gọi ở cả hai nơi, thì chỉ cần đặt nó vào một hàm được đặt tên mà bạn có thể gọi cả hai nơi. – jfriend00

Trả lời

18

Bạn có thể sử dụng setTimeout thay thế và tự động lên lịch lại cuộc gọi lại.

$(function() { 
    sayHi(); 

    function sayHi() { 
     setTimeout(sayHi,30000); 
     alert('hi'); 
    } 
}); 
+0

Tại sao không chỉ sử dụng setInterval? – user2019515

+0

@ user2019515 - Tôi hiểu OP muốn có một lời gọi duy nhất của hàm. '$ (function() {sayHi(); setInterval (sayHi, 30000); hàm sayHi() {alert ('hi');});' cũng sẽ hoạt động nhưng có các cá thể riêng biệt của hàm. – tvanfosson

9

Quấn mã của bạn vào một hàm. Sau đó, thông qua các chức năng như một cuộc tranh luận đầu tiên setInterval, và gọi hàm:

$(document).ready(function() { 
    //Definition of the function (non-global, because of the previous line) 
    function hi(){ 
     alert("hi"); 
    } 

    //set an interval 
    setInterval(hi, 30000); 

    //Call the function 
    hi(); 
}); 
1

Không, đó là không thể với setInterval. Bạn có thể sử dụng setTimeout ví dụ:

function foo() { 
    alert('hi'); 
    setTimeout(foo, 30000); 
} 

$(function() { 
    foo(); 
}); 
1
$(function() { 

    function heythere() { 
     alert('hi'); 
     setTimeout(heythere,30000); 
    } 

    heythere(); 

}); 

Nếu bạn muốn nó chỉ chạy một lần sau 30 giây, bạn đang tìm kiếm để sử dụng setTimeout không setInterval.

3

Vâng, có lẽ là một cách để làm việc đó chỉ trong một cuộc gọi ..

setInterval(
    (function x() { 
     alert('hi'); 
     return x; 
    })(), 30000); 

Một giải pháp sẽ được sử dụng arguments.callee, nhưng như bây giờ bị phản đối, nó thường không được khuyến khích để sử dụng nó.

setInterval(
    (function() { 
     alert('hi'); 
     return arguments.callee; 
    })(), 30000); 
Các vấn đề liên quan