Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
脚本完全加载并执行时的jquery.getscript()回调_Jquery_Ajax - Fatal编程技术网

脚本完全加载并执行时的jquery.getscript()回调

脚本完全加载并执行时的jquery.getscript()回调,jquery,ajax,Jquery,Ajax,从jQueryAPI页面开始 成功回调 一旦加载脚本但不一定执行,就会触发回调 $.getScript("test.js", function() { foo(); }); 如果foo()函数依赖于test.js,则无法成功执行 我在GoogleMapAPI中看到了类似的情况,但在这种情况下,您可以在ajax脚本url中指定回调函数。但是,一般来说,有没有一种明显的方法可以等待ajax脚本执行回调?您可以使用ajax jQuery.ajax({ async:false

从jQueryAPI页面开始

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

$.getScript("test.js", function() {
    foo();
});
如果
foo()
函数依赖于test.js,则无法成功执行

我在GoogleMapAPI中看到了类似的情况,但在这种情况下,您可以在ajax脚本url中指定回调函数。但是,一般来说,有没有一种明显的方法可以等待ajax脚本执行回调?

您可以使用ajax

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

Async为false,因为您希望加载并执行脚本,在成功回调之后,您可以像这样调用函数foo()

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

这对我来说很好

恐怕解决方案需要对依赖项进行轮询。或者,脚本需要包装在一个预定义的回调中,比如AMD。

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

$.getScript( "ajaxFile/myjs.js" )
.done(function( s, Status ) {
    console.warn( Status );
})
.fail(function( jqxhr, settings, exception ) {
    console.warn( "Something went wrong"+exception );
});
$.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
加载脚本后,您将检查该变量是否存在,如果不存在,您将创建一个间隔,持续检查该变量是否可用,只有在满足此条件时,您才能解决承诺。

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

投票最多的回答是使用“async:false”,这将反过来创建一个非最佳的同步调用。另一方面,从版本1.5(可能更早?)起,承诺和承诺处理程序就被引入到jquery中。在本例中,我们尝试异步加载脚本并等待它完成运行

根据定义的回调

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

$.getScript("test.js", function() {
    foo();
});
相反,你需要寻找的是承诺的行动方式。在本例中,当您正在寻找异步加载的脚本时,可以使用“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);
});
$.getScript(…)
+
setInterval(…)
对我有用: 一旦定义了我们要查找的
变量
(在我的例子中是
window.grecaptcha
),我就可以调用一个
闭包函数
,它可以
抽象出来


祝你好运…

正如前面提到的那样,
然后
完成
$.getScript
回调会在脚本加载且未执行时触发,时间间隔可能是解决此问题的一种方法,但在我看来它似乎不是很优雅

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

jQuery( document ).trigger( 'loadedeventsjs' );
在我的主脚本中,我可以绑定到该事件,如:

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

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

} );

您收到错误消息了吗?函数未定义。如果您使用的是chrome或firefox,“未定义的不是函数”;如果您将
console.log('xxxx');
放入回调函数而不是
foo(),它是否会回显到控制台
实际上,在大多数情况下,回调在脚本执行后会触发-请参阅和。您需要了解您的情况的独特之处。另外@richb01,您的站点已关闭。这仍然表明脚本中的必备函数尚未执行:(我使用这段代码并为我工作,我遇到了与您相同的问题。但这是因为get脚本有一个回调函数,在请求成功时执行该函数,但代码还不可用。非常感谢,我在文档中也看到了这一点“从jQuery 1.8开始,在jqXHR($.Deferred)中使用async:false)已弃用;您必须使用success/error/complete回调选项,而不是jqXHR对象的相应方法,如jqXHR.done()或弃用的jqXHR.success()不确定它是否相关。无法解决问题。它使HTTP调用异步,但脚本仍然没有加载到success/。那么,请尝试解释一下您的代码。堆栈溢出不是一个获得“解决方案”的站点,其目的也是为了积累知识。这就是为什么我认为只有代码的答案很少值得投票。回调方法在jQuery中不受欢迎,延迟处理程序是用于将行为附加到异步加载的经过测试和支持的方法。也就是说,我不确定它们是否能保证在调用脚本时执行脚本。请请尝试解释一下您的代码。Stack Overflow不是一个获取“只是解决方案”的站点,其目的也是构建知识。我认为您没有抓住要点。回调需要使用您刚才加载的脚本中定义的内容。我认为这是可能的最佳解决方案,而我不喜欢处理
setInterval(…)
在我的脚本中。问题是,成功、.then、和.done等都是在HTTP调用完成时调用的,而不是在获取的脚本可供执行时调用的。异步问题的问题是,它们对某些人有效,而对其他人无效,因此结果主要是“对我有效,显然你不理解承诺”答案,这就是我们这里的答案。嗯,这对我不起作用。:)