#javascript #jquery
#javascript #jquery
Вопрос:
Я пытаюсь загрузить Cocoen через AJAX с помощью jQuery. Это работает, но только некоторое время.
У меня есть эта функция для загрузки ajax файла javascript, когда это необходимо:
jQuery.cachedScript = function( url, options )
{
// Allow user to set any option except for dataType, cache, and url
options = $.extend( options || {}, {
dataType: "script",
cache: true,
url: url
});
// Use $.ajax() since it is more flexible than $.getScript
// Return the jqXHR object so we can chain callbacks
return jQuery.ajax( options );
};
Затем, когда я обнаруживаю что-то с классом «cocoen», он загружает его по мере необходимости вот так:
if ($('.cocoen').length)
{
$.when(
$.cachedScript( "/includes/jscripts/cocoen/js/cocoen.min.js"),
$.cachedScript( "/includes/jscripts/cocoen/js/cocoen-jquery.min.js"),
$.Deferred(function( deferred ){
$( deferred.resolve );
})
).done(function(){
$('.cocoen').cocoen(); // image comparison slider
});
}
Я не знаю, что это вызывает, но иногда кажется, что функция «готово» выполняется до ее правильной загрузки? Как и в Chrome tools, в нем говорится:
«Неперехваченная ошибка типа: $(…).cocoen не является функцией». Это несмотря на то, что на вкладке сеть четко отображаются оба загружаемых JS-файла для cocoen.
Что я здесь делаю не так? Если я обновлю, это сработает. Кажется случайным, но должно быть что-то, что я здесь не принимаю во внимание.
Комментарии:
1. Вам нужно поддерживать IE11 или вы можете использовать
Promise.all()
вместоjQuery.when()
?2. Нет, меня вообще не волнует IE. Есть пример этого?
3. Вы могли бы попробовать
Promise.all([Promise.resolve($.cachedScript(/* cocoen.min.js */)), Promise.resolve($.cachedScript(/* cocoen-jquery.min.js */))].done(() => $('.cocoen').cocoen())
, но я не уверен, что это сработает, еслиjQuery.when()
произойдет сбой.4. Это не работает, говорит мне, что это не функция?
5. Тогда не беспокойся об этом. Кто-то, кто знает jQuery больше, вероятно, может оказать больше помощи.