【问题标题】:Using Lab.js in master page to load jQuery asynchronously and then using jQuery code in child files在母版页中使用 Lab.js 异步加载 jQuery,然后在子文件中使用 jQuery 代码
【发布时间】:2015-05-11 22:07:22
【问题描述】:

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

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

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

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

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

【问题讨论】:

标签: jquery asp.net asynchronous master-pages labjs


【解决方案1】:

注意:不要像许多人那样错误地将$.ready(..) 与“jquery 已准备好”混为一谈。 $.ready(..) 告诉您 document 本身何时准备就绪(完全解析),而脚本加载(尤其是像 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。这超出了我们将在此处介绍的内容,但是如果您有兴趣了解它们,那么还有很多关于 Promise 的内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 2013-05-12
    • 2021-10-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多