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

发布于 2024-10-18 20:41:26 字数 804 浏览 3 评论 0原文

我正在将 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。不久之后,我就运行了 100 个相同的 .js 文件,当然,浏览器会锁定向上。非常感谢您的任何见解。

I am delivering ajax content to a page and I need to reattach Drupal behaviors to that content. I am using the following jquery. The code polls the server every 5 seconds for data and displays it.

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.

When I try to add Drupal.attachBehaviors(), it appears to be relaunching new instances of my JS file. When I look in firebug, I see a new instance of my js file running, then 4, then 8, then 16, then 32. Before long, I have 100's of if the same .js file running and of course, the browser locks up. Thank you greatly for any insights.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

听闻余生 2024-10-25 20:41:26

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

旁注(对于评论来说太混乱了):请不要将字符串传递给 setTimeoutsetInterval;它是伪装的eval。传递函数本身:

setInterval(god_geo_event, 5000);

或传递匿名函数:

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

It looks like you've solved your own problem.

Side note (too messy for a comment): please don't pass strings to setTimeout and setInterval; it's eval in disguise. Pass the function itself:

setInterval(god_geo_event, 5000);

or pass an anonymous function:

setInterval(function ()
{
    god_geo_event();
}, 5000); 
徒留西风 2024-10-25 20:41:26

很确定答案是 setInterval 调用的函数有 (),而它不应该有。
setInterval("god_geo_event()", 5000);

应该是。

setInterval("god_geo_event", 5000);  

我们没有将结果传递给 setInterval,而是传递函数调用。仍然需要测试,但我认为这个问题已经在 3 个不同的板上困扰了数百人三个月了……太棒了。

Pretty sure the answer will be that the function called by setInterval has (), when it should not.
setInterval("god_geo_event()", 5000);

should be.

setInterval("god_geo_event", 5000);  

We are not passing the results to setInterval, we are passing the function call. Still need to test but I think this is the problem that has eluded hundreds on 3 different boards for thre three months.. Amazing.

懒的傷心 2024-10-25 20:41:26

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

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

Check that you call your function in the #document context.

Drupal.behaviors.god_geo = function(context) {
  setInterval(function () {
    if ($(context).length && $(context)[0].nodeName == '#document') {
      god_geo_event();
    }
  }, 5000); 
};
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文