优化jQueryMobile的代码:仅在需要时选择性地包含外部JS文件的问题

时间:2011-05-23 17:59:54

标签: jquery ajax google-maps-api-3 jquery-mobile google-maps-markers

我正在将jQueryMobile用于移动应用程序。显然我希望UI能够非常快速地加载,但是应用程序有多个工具,所以我只想在导航到'页面'时加载相关的外部JS库。对于主应用程序(90%的页面),我只想要jQueryMobile核心文件(即来自Google AJAX库和jQueryMobile JS& CSS的最新jquery核心)。但是,对于剩余的10%,我需要启用地理定位的Google Maps v3(因此Google Gears外部库)和MarkerClusterer库(我只有必要时才会绘制400个标记)。

据我了解jQueryMobile是如何工作的(所有这些都是通过内部AJAX请求),必须在应用程序初始化时为整个应用程序加载所有库。当用户首次请求移动站点(所有核心文件以及所有地图/ gelocation / marker群集文件)时,这使我的应用程序真的很重。我希望避免这种情况发生,因为它会吓跑许多潜在用户(特别是当我的用户中只有一部分需要地理定位时)。

我尝试在相关页面的末尾(在页脚div之前)加载Google地图组件,并尝试将它们放入< head>标签在相关页面中。但是这两个都无法初始化(使用附加到函数的console.log()输出进行检查)。

是的,在您提出之前,我正在使用“pagecreate”live()函数并正在寻找正确的div(如果我将与Google地图相关的所有内容放入根页头标记中,一切正常就可以了)

我觉得这一定是一个非常常见的问题:使用jQueryMobile选择性加载页面组件。我在网上找不到任何东西 - 大多数jQueryMobile教程都是常见的花园'Hello World!'多种多样,所以如果你有什么可以提供我的全部耳朵!有选择性加载教程的链接也欢迎!

提前致谢!

3 个答案:

答案 0 :(得分:3)

  

所有这些页面都会在每个页面上初始化所有必需的库。

是的,这是默认的方式,所以无论用户首先调用哪个页面/子页面 - 一切正常。所有库工作正常,只加载一次。但你可能知道。

假设您想稍后加载某些库,以便即使用户不需要它们也不会减慢整个应用程序的速度,您应该强制它们仅使用正确的页面加载。

这可以通过某些不同的方式实现:

  1. 最简单的方法:将它放在头部,如果要打开最后页面并将rel="external"放在该子页面的所有链接中。它显然会重新加载页面并让你失去JQM缓存页面的一些优点,但是及时加载库可能是值得的
  2. 建议:当JQM放入page div时,它应该加载并运行JS。它无法为您工作的原因可能是lib依赖于domready事件,您可能必须为库触发它。但是如果你只是触发事件,它将使一切(包括JQM)处理它。你必须让它只触发库。要做到这一点,你需要:
    • 编辑代码并找到事件处理函数
    • 更改代码,以便该函数具有全局可访问的名称
    • pagesomething处理程序
    • 中调用该函数
  3. 另外:如果您遇到网页问题,请尝试绑定pageshow而不是pagecreate,看看是否需要首先看到元素。

答案 1 :(得分:1)

好问题!我还没有在jQuery Mobile文档中看到过这个。关注naugtur我会在你的页面div中说出类似的内容

<script>
if(typeof MyFunction == "undefined") {
    $.getScript('myfunction.js', function() {
        // initialize if necessary
    });
}
</script>

如果您正在加载Google所服务的内容,特别是如果有多个文件,则jsload是一个不错的选择。

答案 2 :(得分:0)

问题,您是否尝试使用head.js方法解决问题?他们将js文件设置为加载为未阻止的请求,如图像在浏览器中加载的方式,而不是默认浏览器方式一次加载一个js文件并阻止其他js加载