2012-03-20 3 views
2

У меня есть функция Start(), которая увольняется наготове. Когда я нажимаю на .ExampleClick, я хочу остановить функцию Start(). Вот мой пример ...Возврат False/Stop jQuery Функция при нажатии

$(document).ready(function(){ 

    $(function Start(){ 
     // Do Stuff on Ready 
    }); 

    $(document).on("click",".ExampleClick",function() { 
    // When this is fired, function Start() should stop running 
    }); 

}); 

Какой лучший способ достичь того, что я пытаюсь сделать?

+2

Вы не можете это сделать. По крайней мере, не здраво. –

+0

Как часто запускается запуск? @ Даниэль, это не совсем так. :) –

+0

@ElliotBonneville - выполняется, когда пользователь загружает документ. Довольно часто – Joe

ответ

6

Start Если зацикливается навсегда, ваш браузер будет висеть. Функции JavaScript не могут работать параллельно. Предполагая, что Start действительно представляет собой какой-то фоновый процесс, который предназначен для цикла навсегда, вам нужно будет переосмыслить все так, чтобы он выполнялся один раз, а затем планировал, чтобы он снова выполнял какой-то момент в будущем, позволяя обрабатывать другие события.

Каждый раз, когда Start выполняется, он может исследовать какое-то состояние поддерживается обработчиком на клик, чтобы решить, следует ли его запустить и епдиеие себя снова:

$(document).ready(function(){ 

    var clicked = false; 

    var Start = function() { 
     if (clicked) return; 

     // Do Stuff on Ready 

     setTimeout(Start, 100); 
    }; 

    Start(); 

    $(document).on("click",".ExampleClick",function() { 
    // When this is fired, function Start() should stop running 

    clicked = true; 
    }); 

}); 
+0

+1 за то, что я сумел сформулировать то, о чем я думал. =) –

+0

Спасибо @meagar. Это полезно, хотя у меня есть setTimeout для перепланирования, но я не упоминал об этом в этом сообщении. – Joe

0

Обновление: как указывали другие, мое предыдущее решение было совершенно неправильным. Я заменив его подходом setInterval/clearInterval (ради справедливости - другие уже указывали лучшие/аналогичные решения):

$(document).ready(function(){ 

    var start = setInterval(
     function Start(){ 
      // Do Stuff on Ready 
     }, 
     someReasonableTimeFrame 
    ); 

    $(document).on("click",".ExampleClick",function() { 
     // When this is fired, function Start() should stop running 
     clearInterval(start); 
    }); 

}); 
+3

Обработчик события click никогда не будет выполнен (или даже подключен), потому что 'Start' никогда не заканчивается. –

+1

Это неправда! вы не можете запустить два метода одновременно, он никогда не «выйдет» из 'while'! – gdoron

+0

Спасибо, что указали это, я уже заметил это и исправил его. – mgibsonbr

2

Вы могли фальсифицировать что-то с setinterval() :

$(document).ready(function(){ 

    var intervalHolder;  

    $(function Start(){ 
     // Do Stuff on Ready 
     intervalHolder = setInterval("myTimedFunction()",1000); 
     // This runs "myTimedFunction()" every second 
    }); 

    $(document).on("click",".ExampleClick",function() { 
    // When this is fired, function Start() should stop running 
    clearInterval(intervalHolder); 
    }); 

}); 

function myTimedFunction() { 
    // Do groovy things every second 
}; 

Это немного приматно, но может быть сработано, чтобы добиться аналогичного эффекта.

3

Похоже, у вас есть функция, вы хотите запустить несколько раз, а затем остановить его при нажатии кнопки:

doStuff = function() { 
    // stuff to do regularly 
} 

$(document).ready(function(){ 

    // run doStuff every 2 seconds 
    var jobId = window.setInterval(doStuff, 2000); 

    // store the job id in a jquery data object 
    $('body').data("doStuffJobId", jobId); 

    // set up click hander for css class Example Click 
    $(".ExampleClick").click(function() { 
     // get the job id 
     var jobId = $('body').data("doStuffJobId"); 
     window.clearInterval(jobId); 
    }); 

}); 
+0

+1 'setInterval' - лучший способ сделать это, чем моя версия' setTimeout'. – meagar

Смежные вопросы