我有准备就绪的函数Start()
。当我点击.ExampleClick
时,我想停止运行Start()
功能。这是我的例子......
$(document).ready(function(){
$(function Start(){
// Do Stuff on Ready
});
$(document).on("click",".ExampleClick",function() {
// When this is fired, function Start() should stop running
});
});
实现我想做的最好的方法是什么?
答案 0 :(得分:7)
如果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;
});
});
答案 1 :(得分: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);
});
});
答案 2 :(得分: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 :(得分: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);
});
});