46

从 jquery api 页面 http://api.jquery.com/jQuery.getScript/

成功回调

一旦脚本被加载但不一定执行,回调就会被触发。

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

如果foo()函数依赖于test.js,则无法成功执行。

我在 google map api 中看到了类似的东西,但在这种情况下,您可以在 ajax 脚本 url 中指定回调函数。但总的来说,有没有一种明显的方法可以等到 ajax 脚本执行后再进行回调?

4

8 回答 8

15

我知道这是一个老问题,但我认为包含“完成”的两个答案都没有被他们的所有者解释,它们实际上是最好的答案。

投票最多的答案要求使用“async:false”,这反过来会创建一个不是最佳的同步调用。另一方面,自 1.5 版(可能更早?)以来,jquery 引入了 promise 和 promise 处理程序,在这种情况下,我们尝试异步加载脚本并等待它完成运行。

定义的回调getScript 文档

一旦脚本被加载但不一定执行,回调就会被触发。

相反,您需要寻找的是承诺的行为方式。在这种情况下,当您正在寻找一个异步加载的脚本时,您可以使用“then”或“done”看看这个线程,它很好地解释了差异。

只有当一个承诺被解决时才会调用基本完成。在我们的例子中,当脚本成功加载并完成运行时。所以基本上在你的代码中这意味着:

$.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);
});
于 2016-09-16T08:15:54.477 回答
5

$.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,我可以调用 a closure functionwhich can be abstracted out

祝你好运...

于 2017-11-22T03:32:10.260 回答
3
$.getScript( "ajaxFile/myjs.js" )
.done(function( s, Status ) {
    console.warn( Status );
})
.fail(function( jqxhr, settings, exception ) {
    console.warn( "Something went wrong"+exception );
});
于 2014-07-06T09:59:37.117 回答
3

你可以使用ajax

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

异步是假的,因为你想加载和执行脚本,在成功回调之后你可以调用你的函数 foo()

于 2013-01-28T15:37:45.770 回答
2

我今天面临同样的问题,并提出了一个基于承诺和间隔计时器的解决方案:

$.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
});

想法是您加载一个给定的脚本,该脚本将公开一些foo仍然不存在的变量(您的问题示例中的函数),因此在getScript您加载脚本后检查该变量是否存在,如果不存在,则创建一个间隔将不断检查变量是否可用,并且只有当满足此条件时,您才会解决承诺。

于 2016-08-18T17:32:44.653 回答
1

如前所述then,当脚本加载但未执行done$.getScript回调触发可能是早期......间隔可能是解决这个问题的一种方式,但在我看来它似乎不是很优雅。

我的解决方案是在异步加载的脚本中触发一个事件,例如:

jQuery( document ).trigger( 'loadedeventsjs' );

在我的主脚本中,我可以绑定到该事件,例如:

jQuery( document ).on( 'loadedeventsjs', function() {

    jQuery( '#mainmenu_wrapper' ).on( 'swiperight', menuout );

} );
于 2020-08-06T06:42:38.483 回答
0

恐怕该解决方案需要轮询依赖项。或者,脚本需要包装在像 AMD 这样的预定义回调中。

于 2016-07-13T13:32:18.913 回答
-1

$getScript 像这样使用

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

这对我来说很好用

于 2014-04-08T07:42:20.173 回答