2010-07-07 75 views
6

我们想知道是否有可能使用jQuery检查多个元素,并根据通过单击指定给他们的类型执行其他功能。基本上,一个可以永久运行的功能,而用户不会刷新页面。jQuery无限函数执行

这个想法不是依赖事件点击来执行一个函数,而是依赖于分配给特定元素的类。

例如:

$("td.gantt").each(function() { 
    if($(this).hasClass("oper")) { 
     //execute a serie of functions 
    } 
    if($(this).hasClass("preop")) { 
     //execute a serie of functions 
    } 
}); 

上述被执行一次,我们需要运行所有的时间。

回答

17
// define a function... 
function ganttEach() { 
    $("td.gantt").each(function() { 
    // ... 
    }); 
} 

// ...repeat it once every second 
window.setInterval(ganttEach, 1000); 

你不能“让它运行所有的时间”(如,在while(true)循环),因为JavaScript是单线程和阻塞线程意味着你其他代码永远不会运行。 setInterval()确保其他代码执行时有必要的“空白”。

setInterval()返回一个ID,您可以将其存储在一个变量中,并在某个点处反馈给clearInterval()以使其再次停止。


如果你想确保你的函数的每一个新的迭代开始只后的前一个已经真正完成,使用setTimeout()代替:

// define a self-repeating function... 
function ganttEach() { 
    $("td.gantt").each(function() { 
    // ... 
    }); 
    window.setTimeout(ganttEach, 1000); // calls itself again in one second 
} 

// ...initiate self-repeating function 
ganttEach(); 

你或许应该包括某种方式在这里停止无尽的重复,就像引入一个在setTimeout()调用之前检查的标志。

+0

+1 for setTimeout() – 2010-07-07 16:33:00

+0

+1 yeah站点超时可以避免轮询 – galambalazs 2010-07-07 16:45:17

+0

带宽消耗如何?在IE下性能如何? – betacar 2010-07-07 18:54:33

0

我不确定你想要做什么,但你有没有尝试setInterval?如果这是你真正想要的,它将继续运行。

3

这是可能的,与setInterval。我的建议是选择重复功能以外的元素,以便最小化开销

无限循环将锁定浏览器UI,因为它是一个单线程环境。设置时间间隔,但是您可以将操作添加到用户界面堆栈,这些操作将在给定的时间段后执行。您可以在setInterval第二个参数中指定此期间。

// select the element outside 
// to minimize overhead 
$gantt = $("td.gantt"); 

// define a repeating action 
setInterval(function() { 
    $gantt.each(function() { 
     if($(this).hasClass("oper")) { 
      //execute a serie of functions 
     } 
     if($(this).hasClass("preop")) { 
      //execute a serie of functions 
     } 
    }); 
}, 100); // repeat interval: 100ms 
+2

提及在函数之外定义'$ gannt'变量的好处。 – Tomalak 2010-07-07 16:26:45

+0

@galambalazs:我喜欢我的“+1”评论如何吸引两张选票(其中一张是你自己的,我猜),但你的答案本身仍然只有+1。 ;-)如果我碰巧同意“+1”的评论,我是否也应该投票回答?嗯... :-) – Tomalak 2010-07-07 16:50:34

+0

@Tomalak我upvoted,因为它有一个有效点(setTimeout),我想过但后来忽略。但是,在给了我另一个想法之后,我意识到即使我永远不会做这样的事情,如果函数聚集在UI堆栈中,长的jQuery代码库可能会导致浏览器挂起。而且,既然你写了它,我给你+1,因为它应该突出显示。 :) – galambalazs 2010-07-07 16:54:24

3

你可以运行你的支票每隔几毫秒,50毫秒说,使用的setInterval

window.setInterval (function() { 
    // do checks here 
}, 50); 

也许最终你会使用大量的CPU处理能力,如果你的检查过于频繁,或太复杂。

+0

该解决方案具有可以从身体运行的优点。 – 2015-06-12 22:49:30