【问题标题】:YepNope - Waiting until dependencies loadedYepNope - 等待加载依赖项
【发布时间】:2013-02-17 17:05:33
【问题描述】:

在 ASP.NET 母版页中,我使用 YepNope 无条件地异步加载 jQuery(来自 Google CDN,具有本地回退)和网站所有页面上使用的一些脚本。在 MasterPage 中,我在结束正文标记之前创建了一个 ContentPlaceHolder(以及在加载所有页面上使用的那些的 YepNope 脚本下方),用于单个页面上使用的脚本。由于 jQuery 应该在站点中的每个页面上都可用,因此不应在有特定脚本使用它的页面上单独加载它。

我遇到的问题是我无法在加载 jQuery 的 yepnope 脚本中使用回调或完成函数,因为这是在 MasterPage 上,这些是仅在该页面上使用或添加的单独页面脚本,但是我需要能够延迟单个页面脚本的执行,直到 yepnope(出现在页面脚本上方)完成加载其中使用的任何依赖项(例如 jQuery)。

我能想到两个选择-

1- 使页面上使用的脚本成为外部文件并使用语法加载该脚本-

yepnope('/url/to/your/script.js'); 

yepnope({ load: '/url/to/your/script.js' });

我不确定我是否喜欢这个想法,因为它引入了对几行 JavaScript 的额外 HTTP 请求,不会在任何其他页面上使用。

2- 在另一个 yepnope 测试对象块中再次加载 jQuery,使用完整的函数包装页面脚本(在没有测试的情况下调用 complete 似乎会在加载之前的脚本之前立即执行该函数)并依赖于以下内容 -

我请求一个文件两次,它只加载一次?按人气 需求,在 yepnope 1.5+ 中,我们添加了脚本具有的功能 已经被请求的,在被请求时不会被重新执行 第二次。当您处理较少时,这可能会有所帮助 复杂的服务器端模板系统,你真正关心的是 您的所有依赖项都可用。

在页面中,我大概可以从 Google CDN 加载相同版本的 jQuery,基于上述内容实际上不会加载两次,然后在 yepnope 的完整函数调用的匿名函数中加载页面脚本测试对象。

从好的方面来说,这意味着页面不再依赖于从 MasterPage 加载的 jQuery,但不利的是(即使假设 YepNope 现在没有加载脚本两次)我们将加载多个版本的jQuery 应该更改 MasterPage 中的版本,而将来页面中不会发生同样的情况。从维护的角度来看,我认为这不是一个好主意,尤其是假设(我认为您应该始终这样做)另一位开发人员将进行更改。

看起来也不是特别优雅。

总的来说,我几乎肯定会使用第一个选项,但我想知道是否有办法延迟或推迟页面上的脚本直到异步加载完成,这不能作为 YepNope 测试对象的一部分来完成加载资源。

其他开发人员如何解决这个问题?

【问题讨论】:

    标签: javascript asp.net asynchronous master-pages yepnope


    【解决方案1】:

    我想出了这个作为我比较喜欢的解决方案。

    在 MasterPage YepNope 测试对象中添加代码-

    complete: function() {
                    if (window.pageFunctions !== null && typeof (window.pageFunctions) === "function") {
                        window.pageFunctions();
                    }
                }
    

    如果我想添加依赖于 MasterPage 中加载的依赖项的任何 JavaScript 代码或函数,我只需将它们包装在一个名为“pageFunctions”的函数中,就像这样-

    <script type="text/javascript">
        function pageFunctions() {
            $(document).ready(function () {
                ...
            });
        }
    </script>
    

    我仍然对其他(可能更好的)解决方案感兴趣,所以我将把这个问题留几天。

    我也很感谢 cmets 将其作为解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-07-21
      • 1970-01-01
      • 2016-08-17
      • 2018-08-06
      • 1970-01-01
      • 2015-09-01
      • 1970-01-01
      相关资源
      最近更新 更多