Подтвердить что ты не робот

Jquery.getcript(), когда script полностью загружен и выполнен

Как и на странице jquery api http://api.jquery.com/jQuery.getScript/

Успешный обратный вызов

Обратный вызов запускается после загрузки script, но не обязательно выполняется.

$.getScript("test.js", function() {
    foo();
});

если функция foo() зависит от test.js, она не может быть выполнена успешно.

Я видел подобную вещь с google map api, но в этом случае вы можете указать функцию обратного вызова в URL-адресе ajax script. Но в целом есть ли очевидный способ дождаться выполнения ajax script для выполнения обратного вызова?

4b9b3361

Ответ 1

Я знаю, что это старый вопрос, но я думаю, что оба ответа, содержащие "готово", не объясняются их владельцами, и на самом деле они являются лучшими ответами.

Ответы с наибольшим количеством голосов требуют использования "async: false", что, в свою очередь, создает вызов синхронизации, который не является оптимальным. с другой стороны, в jquery были введены обещания и обработчики обещаний начиная с версии 1.5 (может, раньше?), в этом случае мы пытаемся загрузить скрипт асинхронно и дождаться его завершения.

Обратный вызов по определению документации getScript

Обратный вызов запускается после загрузки скрипта, но не обязательно выполняется.

вместо этого нужно искать, как действуют обещания. В этом случае, когда вы ищете скрипт для асинхронной загрузки, вы можете использовать "затем" или "готово", взгляните на этот поток, который хорошо объясняет разницу.

В основном сделанное будет вызвано только тогда, когда обещание будет выполнено. в нашем случае, когда скрипт был успешно загружен и завершен. Так что в основном в вашем коде это будет означать:

$.getScript("test.js", function() {
    foo();
});

следует изменить на:

$.getScript("test.js").done(function(script, textStatus) {
    console.log("finished loading and running test.js. with a status of" + textStatus);
});

Ответ 2

Вы можете использовать ajax

jQuery.ajax({
        async:false,
        type:'GET',
        url:script,
        data:null,
        success:callback,
        dataType:'script'
    });

Async является ложным, потому что вы хотите загрузить и выполнить script, после этого при успешном обратном вызове вы можете вызвать вашу функцию foo()

Ответ 3

$.getScript(...) + setInterval(...) работал для меня:

$.getScript('https://www.google.com/recaptcha/api.js')
  .done(function() {
    var setIntervalID = setInterval(function() {
      if (window.grecaptcha) {
        clearInterval(setIntervalID);
        console.log(window.grecaptcha);
        letsWorkWithWindowDotGreptcha();
      };
    }, 300);
  });


  function letsWorkWithWindowDotGreptcha() {
    // window.greptcha is available here....
  }

Как только variable мы ищем, определена (в моем случае window.grecaptcha, я могу вызвать функцию closure function которую можно abstracted out.

Удачи...

Ответ 4

$.getScript( "ajaxFile/myjs.js" )
.done(function( s, Status ) {
    console.warn( Status );
})
.fail(function( jqxhr, settings, exception ) {
    console.warn( "Something went wrong"+exception );
});

Ответ 5

Я боюсь, что решение требует опроса для зависимости. В качестве альтернативы script необходимо обернуть в предопределенный обратный вызов, например AMD.

Ответ 6

Сегодня я столкнулся с той же проблемой и придумал решение на основе promises и таймер интервала:

$.getScript("test.js", function() {
    var $def = $.Deferred();
    if (typeof foo === 'undefined') { // "foo" isn't available
        var attempts = 0;
        // create an interval
        // that will check each 100ms if the "foo" function
        // was loaded
        var interval = setInterval(function() {
            if (typeof foo !== 'undefined') { // loaded
                window.clearInterval(interval);
                $def.resolve();
            }
            // after X unsuccessfull attempts, abort the operation
            else if (attempts >= 100) {
                window.clearInterval(interval);
                $def.reject('Something went wrong');
            }

            attempts++;
        }, 100);
    }
    else { // "foo" is available
        $def.resolve();
    }
    return $def.promise();
}).then(function() {
    // at this point "foo()" is definitely available.
}).fail(function() {
    // deal with the failure
});

Идея заключается в том, что вы загружаете данный script, который будет выставлять некоторую переменную (функция foo в вашем примере вопроса), которая все еще не существует, поэтому после того, как script загружается getScript, вы проверьте, существует ли эта переменная, если вы не создаете интервал, который будет постоянно проверять, доступна ли эта переменная, и только когда это условие выполнено, вы разрешите обещание.

Ответ 7

$getScript, как это сделать

$.getScript( "js/jquery.raty.min.js" )
    .done(function( script, textStatus ) {
          console.log( textStatus );
         }
          });

это отлично работает для меня