【问题标题】:How to run a block of code in background in JqueryJquery如何在后台运行一段代码
【发布时间】:2014-04-26 20:11:41
【问题描述】:

我正在使用 Jquery Mobile 和 PhoneGap 构建一个移动应用程序。我正在使用单页模型,其中我有类似 index.html、login.html 等的东西

我编写了一个 javascript,它始终使用 setInterval() 每 5 分钟与服务器端联系一次以获取新消息,并且在后台运行良好,而不会干扰用户正在做的事情。

我想问一下是否可以在全局范围内声明和运行这段代码,而不必在每个 html 页面中重新声明它。

注意:我在 jQuery Mobile 的链接中使用了rel="external",这会在用户导航到某个页面时导致每个页面刷新。

【问题讨论】:

  • 每个文档都必须引用您运行的脚本。如果您没有将代码放在 js 文件中并使用<sctipt type="text/javascript" src="file.js"></script>。我似乎找不到其他解决方案。
  • @Michał 确实如此,我目前正在这样做。我真正想要的是一个可以在后台运行的代码块,无论用户导航到哪个页面。
  • 那恐怕是使用多页系统时唯一的解决方案了。每次页面都会重新加载,JavaScript 也会如此。
  • 当您使用rel=external 导航到不同的HTML 文件时,页面将完全重新加载,因此setInterval() 将重置。如果您通过 Ajax (w/o rel=external) 加载页面,setInterval() 将继续在后台运行。
  • 是的,我需要设置 rel="external" 因为我在页面中嵌入了自定义 CSS 样式,并且没有重新加载整个页面,该样式将无法实现。

标签: javascript jquery jquery-mobile cordova


【解决方案1】:

我相信您主要担心的是,当另一个脚本被加载时,它会覆盖前一个计时器,所以如果距离下一次调用还有一分钟,现在有 5 分钟。为了克服这个障碍,您可以在您的脚本中添加一种逻辑间隔以便在一天中的特定时间运行,例如 9.00、9.05、9.10... 这样,您应该在每次执行脚本时清除Interval 并重置它,以便下次执行代码时是计算的标准时间根据浏览器的日期时间。

【讨论】:

  • 我觉得你在这方面有所作为,我会考虑的
【解决方案2】:

我想你可以为此目的使用网络工作者,它们在全局上下文中独立工作,就像线程一样,而且它们非常高效,甚至可以让你执行 I/O。

请查看此链接,希望对您有所帮助

https://developer.mozilla.org/en-US/docs/Web/Guide/Performance/Using_web_workers

https://groups.google.com/forum/#!topic/phonegap/SMMEwYXUjCU

【讨论】:

  • 我已经检查过了,似乎每当我从一个页面移动到另一个页面时,它都会停止执行
【解决方案3】:

如果你在你的项目中使用MVC的概念会更可行。尝试创建一个其他类使用的基类。你也可以使用jquery widget的概念

【讨论】:

    【解决方案4】:

    我认为这应该可行...

    1. 创建一个页面(母版页),它的唯一工作就是运行计时器...
    2. 在母版页上添加一个 iframe(设置为 100% 可见性)并将 iframe 指向您的其他页面...

    这样做的作用是,每次您的一个页面(在 iframe 中)回发时,母版页都将保存在内存中,并且计时器不会重新加载...

    页面示例。

    <html>
     <head>
      <script>
       function checkMessages() {
        // check messages here
        setInterval(...);
        }
      </script>
     </head>
     <body onload="checkMessages();">
         <iframe id="iframe1" src="subpage.aspx" width="100%" scrolling="auto" frameborder="no" marginheight="0" marginwidth="0" height="100%"></iframe>
     </body>
    </html>
    

    【讨论】:

    • 我之前没有在Jquery Mobile中使用过iframe,可以吗?
    • 所有现代浏览器都支持 iframe(包括the android browser)...
    【解决方案5】:

    我能够使用 Android 后台服务来实现我想要的。我在 PhoneGap 中使用了一个插件。对于那些想要使用类似技术的人,您可以在phonegap-service-tutorial-part-1获取有关插件的信息

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-14
      • 2021-02-13
      • 2012-07-08
      • 2014-02-19
      相关资源
      最近更新 更多