.setInterval()和Drupal.attachBehaviors导致我的js文件运行多个实例

时间:2011-02-22 20:29:35

标签: jquery drupal-6

我正在向页面提供ajax内容,我需要将Drupal行为重新附加到该内容。我正在使用以下jquery。代码每隔5秒轮询一次服务器以获取数据并显示它。

Drupal.behaviors.god_geo = function(context) {
setInterval("god_geo_event()", 5000);  // call god_geo_event() every 5 seconds
};

/**
* A Function to fetch quotes from the server and display in the designated
* area.
*/
function god_geo_event(){
$.getJSON(Drupal.settings.god_geo.json_url, function(data)  {
  if(!data.status || data.status == 0)  {
      $("#god_geo_occupants-text").html(data.event.occupants);
      Drupal.attachBehaviors("#god_geo_occupants-text");   //THIS CRASHES BROWSER.
  }
}); //end inline function.

当我尝试添加Drupal.attachBehaviors()时,它似乎重新启动了我的JS文件的新实例。当我查看firebug时,我看到我的js文件的一个新实例正在运行,然后是4,然后是8,然后是16,然后是32.不久之后,如果运行相同的.js文件,那么我有100个,当然,浏览器会锁定起来。非常感谢您的任何见解。

3 个答案:

答案 0 :(得分:1)

看起来你已经解决了自己的问题。

旁注(评论太杂乱):请不要将字符串传递给setTimeoutsetInterval;这是伪装的eval。传递函数本身:

setInterval(god_geo_event, 5000);

或传递匿名函数:

setInterval(function ()
{
    god_geo_event();
}, 5000); 

答案 1 :(得分:0)

非常肯定答案是setInterval调用的函数有(),不应该。     setInterval(“god_geo_event()”,5000);

应该是。

setInterval("god_geo_event", 5000);  

我们没有将结果传递给setInterval,我们正在传递函数调用。还需要测试,但我认为这是三个月内在3个不同主板上数百个问题已经躲过的问题..惊人的。

答案 2 :(得分:0)

检查您是否在#document上下文中调用了您的函数。

Drupal.behaviors.god_geo = function(context) {
  setInterval(function () {
    if ($(context).length && $(context)[0].nodeName == '#document') {
      god_geo_event();
    }
  }, 5000); 
};