jQuery UI API无法正确加载LABjs

LdT*_*ger 13 javascript jquery jquery-ui sharepoint-2010 labjs

我最近改用了LABjs在SharePoint Webparts(2010)中加载脚本.这样做的主要原因是,如果将多个Web部件添加到同一页面,则不要多次向页面加载相同的库(如jqueryjquery.ui).这样,他们每个人都可以单独指定其依赖关系,而无需警告已经或可能添加了哪些其他Web部件.

两者LABjs和另一个包含脚本链的文件都是通过<script>Webpart标记底部的标记加载的.

10次​​中有9次,Javascript执行没有任何问题.不过,每隔一段时间,就会抛出一个异常,说明TypeError: $(...).button is not a function.

即使页面上只有一个Webpart并且似乎与浏览器无关(在页面强制使用FireFox 38,Chrome 43和IE 11/IE 8中测试),也会发生这种情况.

链看起来像这样(为清晰起见编辑):

$LAB.setOptions({Debug:true})
.script("../js/jquery-1.11.3.min.js").wait()
.script("../js/jquery-migrate-1.2.1.min.js").wait()
.script("../js/jquery-ui.min.js").wait()
.script("../js/core.js")
.wait(function(){ 
    jQuery(function() {
        init();     // The jQuery UI .button() call
    });
})
.script("../js/jquery.multiselect.min.js").wait()
.script("../js/jquery.multiselect.filter.min.js")
.script("../js/rte/jquery.rte.js").wait()
.script("../js/rte/jquery.rte.tb.js")
.script("../js/rte/jquery.ocupload-1.1.4.js")
.wait(function () {
    jQuery(function() {
        // Some DOM-dependant code lives here
    });
});
Run Code Online (Sandbox Code Playgroud)

这是调试器输出的内容(为清晰起见,也进行了编辑):

start script load (ordered async): ../js/jquery-1.11.3.min.js
start script load (ordered async): ../js/jquery-migrate-1.2.1.min.js
start script load (ordered async): ../js/jquery-ui.min.js
start script load (ordered async): ../js/core.js
start script load (ordered async): ../js/jquery.multiselect.min.js
start script load (ordered async): ../js/jquery.multiselect.filter.min.js
start script load (ordered async): ../js/rte/jquery.rte.js
start script load (ordered async): ../js/rte/jquery.rte.tb.js
start script load (ordered async): ../js/rte/jquery.ocupload-1.1.4.js
script execution finished: ../js/jquery-1.11.3.min.js
script execution finished: ../js/jquery-migrate-1.2.1.min.js
script execution finished: ../js/jquery-ui.min.js
script execution finished: ../js/core.js
$LAB.wait() executing: function (){ jQuery(function() { init(); }); }
$LAB.wait() error caught:  TypeError: $(...).button is not a function
    ...
script execution finished: ../js/jquery.multiselect.min.js
script execution finished: ../js/jquery.multiselect.filter.min.js
script execution finished: ../js/rte/jquery.rte.js
script execution finished: ../js/rte/jquery.rte.tb.js
script execution finished: ../js/rte/jquery.ocupload-1.1.4.js
$LAB.wait() executing: function () {
        jQuery(function() {
            ...
        });
    }
$LAB.wait() error caught:  TypeError: $(...).multiselect is not a function
    ...
Run Code Online (Sandbox Code Playgroud)

此错误几乎总是伴随着jquery.ui库的长加载时间.

但是,同时从调试器的输出中可以清楚地看到它在.button()调用之前已经完成执行.

我一直在与此斗争一段时间,任何帮助/洞察问题可能是什么以及如何解决它将非常感激.我一直在抓LABjs文档以获取一些我可能做错的线索,但似乎没有任何东西突然冒出来.


注意:在标题中确实存在<script>引用jquery,但是此引用无法删除(我无法访问母版页)并且我已经尝试jquery从链中删除,但无济于事.


编辑:有人建议问题可能是由于SharePoint服务器位于负载均衡器之后,这可能是jquery.ui库上特别长的加载时间的原因.虽然这是可能的,但我不知道这将如何或为什么会影响LABjs加载/执行功能.

---

更新

经过一番挖掘,我发现,由于某些原因,我仍然不知道,jquery.ui库是绑定的,jquery而不是$我的代码所期望的.为了尝试解决这个问题,在core.js中我创建了一个变量core.$,它实例化了jQuery.noConflict(),包含了我的DOM依赖代码

(function ($) {
    ...
})(core.$);
Run Code Online (Sandbox Code Playgroud)

并将.script(".../js/core.js")调用移动到链的末尾(以确保所有插件都正确回滚.)

虽然这没有解决问题,但事件已经下降到大约50分之一.

Tob*_*eek 1

@LdTrigger“此外,当不指向负载均衡器时,似乎不会发生错误”这告诉您您的解决方案不会在代码中。请尝试使用“持久连接”/“粘性会话”,这可能是因为您没有足够的“权限”从您所在的另一台服务器获取文件内容,因为它们都位于负载均衡器后面