2009-11-24 4 views
1

Я пытаюсь увеличиваем значение каждый второй на стороне клиента с JQuery
это то, что сделал:SetTimeout рекурсии с Jquery

<script type="text/javascript"> 
     $(document).ready(function increment(){ 
      $("#counter").text(parseInt($("#counter").text())+1); 
      setTimeout(increment(),1000) 
     }) 
    </script> 

это не работает, как ожидалось, и я получаю «слишком много рекурсия ".
любые идеи по этому вопросу?

ответ

12

Попробуйте

$(document).ready(function() {  
    function increment(){ 
     $("#counter").text(parseInt($("#counter").text())+1); 
     setTimeout(increment,1000); 
    };    
    increment(); 
}); 

Кстати, есть setInterval() для вызова функции повторно с заданным интервалом, rathering чем рекурсивного вызова функции с setTimeout()

$(document).ready(function() {  
    var interval = setInterval(increment,1000);  
}); 

function increment(){ 
    $("#counter").text(parseInt($("#counter").text())+1);    
} 
7

increment() является вызов для увеличения, а не для ссылки на него. Когда вы пытаетесь настроить его для повторного вызова приращения, вы на самом деле вызываете его снова сразу. Если он когда-либо вернется, его возвращаемое значение будет передано setTimeout, но оно никогда не будет, потому что оно просто вызывает себя снова и снова, пока вы не получите ошибку глубокой рекурсии.

Решение - это просто удалить круглые скобки, так что вы должны указать приращение функции и не вызывать ее.

3

setTimeout(increment, 1000) должен быть правильным синтаксисом, так как вы передаете ссылку на функцию.

Рекурсивно вызывать setTimeout() без критериев остановки не рекомендуется. Стек ударит в конце концов. Использование setInterval() должно быть безопасным.

0

Более простой способ: «Функция, которая вызывается, как только создается и повторяется в 1000 интервалов мс, если„что-то“не так»

(function(){ 
    if (something) { 
     doSomething(); 
    } else { 
     setTimeout(arguments.callee, 1000); 
    } 
})();