Вопрос: API-интерфейс jQuery UI не может правильно загрузиться с помощью LABjs


Недавно я переключился на использование LABjs для загрузки сценариев в SharePoint Webparts (2010). Основная причина этого заключалась в том, чтобы не загружать одну и ту же библиотеку (например, jquery а также jquery.ui) на страницу более одного раза, если несколько веб-страниц были добавлены на одну страницу. Таким образом, каждый из них может определять свои зависимости индивидуально, без необходимости полиции, какие другие веб-сайты были или могут быть добавлены.

И то и другое LABjs и другой файл, содержащий цепочку скриптов, загружается через <script> теги в нижней части разметки Webpart.

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.


13


источник


Ответы:


@LdTrigger "Кроме того, ошибка не возникает, если не указывать на балансировщик нагрузки" Это говорит вам, что ваше решение не будет в коде. Попробуйте использовать «постоянные соединения» / «липкие сеансы». Вероятно, это происходит потому, что у вас недостаточно «разрешения» для извлечения содержимого файла с другого сервера, после чего вы находитесь, поскольку они находятся за балансировщиком нагрузки


1