【问题标题】:Dynamically loading jQuery and extensions动态加载 jQuery 和扩展
【发布时间】:2009-12-27 17:25:04
【问题描述】:

我正在尝试封装我使用 jQuery、jQuery UI、jQuery Form 和 xmlDom 构建的 javascript。

我希望能够仅向我的客户发送一个引用其他 javascript 的 javascript,包括仅用于选项设置的一小段 js。

在下面找到一个例子:

<script language="javascript">
var myOptions = {
   shop: 1,
   style: "gold"
}
load();
</script>
<script src="http://myServer/myScript.js" type="text/javascript"></script>

动态加载 jQuery 和插件对我来说几乎是不可能的。我阅读了很多示例,当我动态加载 jQuery 时,它可以正常工作,但其余的扩展从未正常工作。以下序列是加载至少几个插件的唯一序列:

设置动态加载jQuery的加载函数:

load = function() {
    load.getScript(url_base + "/js/jquery-1.3.2.js");
    load.tryReady(0); 
}
load.getScript = function(filename) {
  var script = document.createElement('script')
  script.setAttribute("type","text/javascript")
  script.setAttribute("src", filename)
  if (typeof script!="undefined")
  document.getElementsByTagName("head")[0].appendChild(script)
}
load.tryReady = function(time_elapsed) {
  // Continually polls to see if jQuery is loaded.
  if (typeof $ == "undefined") { // if jQuery isn't loaded yet...
    if (time_elapsed <= 5000) { // and we havn't given up trying...
      setTimeout("load.tryReady(" + (time_elapsed + 200) + ")", 200); // set a timer to check again in 200 ms.
    } else {
      alert("Timed out while loading jQuery.")
    }
  } else {
    ...
  }

之后加载每个插件,jQueryForm、jQuery UI、xmlDom

当我检查 jQuery 表单时,它是可用的:

if (jQuery().ajaxForm)

当我检查 xmlDom 时,它可以工作。

当我检查 jQuery UI 时,它永远不可用。

if(jQuery().ui)

如果我设置了等待 UI 的超时时间也没关系,它永远不会加载。似乎是 jQuery 在加载之前执行了我的 UI 功能。

谁能给我一个链接来帮助解决这个问题?

【问题讨论】:

  • 查看html的时候是不是头部的ui脚本标签?当你测试 if (jQuery.fn.ajaxForm) 时会发生什么?
  • 你提到的那行有效,我的意思是,表达是正确的。我需要在我的脚本之前加载所有扩展。我可以为 IE 找到一个解决方案,但它在 Chrome 和 Firefox 中不起作用,它会在一段时间内测试这些条件,直到它变为 true 或超时返回。

标签: javascript jquery jquery-ui jquery-plugins


【解决方案1】:

也许,this might help。来自dive.into.javascript 网站:

SidJS 是一个轻量级的 JavaScript 用于加载 JavaScript 的库 按需提供脚本和 CSS 样式表。 它增加了 AJAX 应用程序 通过加载资源时的性能 他们是需要的。

使用Google Closure Compiler 缩小后,大小为 1.12KB(GZipped 时为 625 字节)。

如果你绝对不能包含另一个 javascript 库,你可以看一下代码(真的不多);有了那里的想法,您应该能够修复您的脚本。

编辑
如果您使用 Google Closure Compiler 来缩小脚本,则需要添加回 node.sheet.cssRules 行。它似乎用于 Gecko 和 Webkit 浏览器中,用于测试延迟加载样式表是否已完全下载(当然,如果您不会延迟加载样式表,则可以完全删除该部分)。

【讨论】:

  • 当我第一次实现这个时,我在尝试添加一个 js 文件时遇到了 appendChild 错误。但是css可以正常工作。原因是在body 在DOM 中可用之前,我将它包含在head 标记中。所以你需要用$(document).ready(); 包裹它才能让它工作。
【解决方案2】:

正如 Python 之禅所说,“简单胜于复杂”。所有这些与超时的混乱是否值得?正如我所假设的,浏览器必须以任何方式加载所有 js 库(以执行您的“myScript.js”文件),所以“正常”包含它们不是更容易吗?

【讨论】:

  • 感谢您的评论,但我需要以其他方式进行。
  • 那你有没有试过让你的'加载'函数没有任何超时?这应该会有所帮助(我已经这样做了,而且效果很好)。如果没有,您也可以尝试将包含的“myScript.js”从文档的头部移到正文。
猜你喜欢
  • 1970-01-01
  • 2011-04-20
  • 2020-05-25
  • 1970-01-01
  • 2011-02-08
  • 2017-03-17
  • 1970-01-01
  • 1970-01-01
  • 2019-08-12
相关资源
最近更新 更多