0

我使用 LAB.js 在 asp.net 母版页中异步加载 JQuery。问题是我使用

$( document ).ready(function() {
    //something
}); 

以及几乎所有子页面中的其他 JQuery 相关代码,这会导致脚本错误:($ 未定义),因为 JQuery 正在母版页中异步加载。

如何推迟解析子页面中的 jQuery 代码,直到在母版页中完成 jQuery 的异步加载?

问题是从主页面异步加载 JQuery 并在子页面中使用一些 JQuery 代码。怎么可能呢?

4

1 回答 1

1

注意:不要误将$.ready(..)“jquery is ready”混为一谈,很多人都会这样做。$.ready(..)告诉您文档本身何时准备就绪(完全解析),而脚本加载(尤其是带有像 LABjs 这样的库的动态类型)是完全独立的。在这里,您真的在寻找“jquery 是否已加载/准备好”,如果可能的话,它应该由您的脚本加载器处理。您可能需要等待文档准备好,在这种情况下,您还应该使用$.ready(..). 但不要用一个代替另一个!


最简单的方法(但不一定是最好的)是在母版页中声明一个全局变量,该变量包含加载主 jquery 文件的 LAB 链,然后在子页面中将其链接。所以在母版页中:

var $jqLoading = $LAB.script("jquery.js");

在子页面中:

$jqLoading.wait(function(){
   // my jquery code goes here
});

另一种选择是依赖 LABjs 重复数据删除脚本请求(默认行为),因此只需尝试在每个子项中加载 jquery,但使用与父项相同的 URL,并且 LABjs 将确保仅加载一个 jquery 副本,但是一旦加载完成,所有等待它的链都会收到通知。因此,在子页面中:

$LAB.script("jquery.js").wait(function(){
   // my jquery code goes here
});

这可能效率稍低,但它避免了需要全局变量,这是更好的设计 IMO。


最复杂的解决方案是使用类似 Promise 的东西来表示 jQuery 脚本的加载,然后在每个子页面中链接该 Promise。这超出了我们将在这里介绍的内容,但是如果您有兴趣了解它们,那里有很多关于承诺的内容。

于 2015-05-26T23:31:15.387 回答