API-интерфейс jQuery не загружается должным образом с помощью LABjs
Я недавно перешел на использование LABjs
загрузить скрипты в SharePoint Webparts (2010). Основной причиной этого было избежать загрузки одной и той же библиотеки (например, jquery
а также jquery.ui
) на страницу более одного раза, если на одной странице было добавлено несколько веб-частей. Таким образом, каждый из них может указывать свои зависимости индивидуально, без необходимости отслеживать, какие другие веб-части были или могут быть добавлены.
И то и другое LABjs
и другой файл, содержащий цепочки скриптов, загружаются через <script>
теги в нижней части разметки веб-части.
9 раз из 10 Javascript выполняется без проблем. Время от времени, однако, будет выдано исключение, заявив, TypeError: $(...).button is not a function
,
Это происходит даже в том случае, если на странице есть только одна веб-часть, и кажется, что она не зависит от браузера (протестировано в 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
});
});
Вот что выводит отладчик (также отредактированный для ясности):
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
...
Эта ошибка почти всегда сопровождается длительным временем загрузки jquery.ui
библиотека.
В то же время, однако, из вывода отладчика ясно, что он уже завершил выполнение до .button()
вызов.
Я боролся с этим некоторое время сейчас, и любая помощь / понимание того, что может быть проблемой и как ее исправить, будет принята с благодарностью. Я ползал LABjs
документация для подсказки о том, что я могу делать не так, но, кажется, ничего не выскакивает на меня.
Примечание: существует <script>
ссылка на jquery
в шапке, однако эту ссылку удалить нельзя (у меня нет доступа к главной странице) и я уже пытался удалить jquery
из цепи, безрезультатно.
Изменить. Кто-то предположил, что проблема может быть связана с тем, что сервер SharePoint находится за балансировщиком нагрузки, что может быть причиной исключительно длительного времени загрузки на jquery.ui
библиотека. Хотя это возможно, я не понимаю, как или почему это повлияет LABjs
Загрузите / выполните функциональность.
---
Обновить
После нескольких копаний я обнаружил, что по какой-то причине, которая мне до сих пор неизвестна, jquery.ui
библиотека была привязана к jquery
и не $
как мой код ожидал. Чтобы попытаться это исправить, в core.js я создал переменную core.$
который был создан с jQuery.noConflict()
, завернул мой DOM-зависимый код с
(function ($) {
...
})(core.$);
и переместил .script(".../js/core.js")
вызов до конца цепочки (чтобы убедиться, что все плагины были откачены правильно.)
Хотя это не решило проблему, количество случаев снизилось до 1 из 50.
1 ответ
@LdTrigger "Кроме того, похоже, что ошибка не возникает, если не указывать на балансировщик нагрузки". Это говорит о том, что ваше решение не будет в коде. Пожалуйста, попробуйте использовать "постоянные соединения" / "липкие сессии". Это, вероятно, происходит потому, что у вас недостаточно "разрешения" для извлечения содержимого файла с другого сервера, на котором вы находитесь, так как они оба находятся за балансировщиком нагрузки