LdT*_*ger 13 javascript jquery jquery-ui sharepoint-2010 labjs
我最近改用了LABjs在SharePoint Webparts(2010)中加载脚本.这样做的主要原因是,如果将多个Web部件添加到同一页面,则不要多次向页面加载相同的库(如jquery和jquery.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分之一.
@LdTrigger“此外,当不指向负载均衡器时,似乎不会发生错误”这告诉您您的解决方案不会在代码中。请尝试使用“持久连接”/“粘性会话”,这可能是因为您没有足够的“权限”从您所在的另一台服务器获取文件内容,因为它们都位于负载均衡器后面