jQuery «не является функцией» после загрузки ajax

#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 больше, вероятно, может оказать больше помощи.