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 "Кроме того, похоже, что ошибка не возникает, если не указывать на балансировщик нагрузки". Это говорит о том, что ваше решение не будет в коде. Пожалуйста, попробуйте использовать "постоянные соединения" / "липкие сессии". Это, вероятно, происходит потому, что у вас недостаточно "разрешения" для извлечения содержимого файла с другого сервера, на котором вы находитесь, так как они оба находятся за балансировщиком нагрузки

Другие вопросы по тегам