source script remove dynamically con cargar attribute jquery ajax

remove - jquery.getscript() de devolución de llamada cuando el script está completamente cargado y ejecutado



load script javascript (7)

$.getScript(...) + setInterval(...) funcionó para mí:

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

Una vez que la variable que estamos buscando está definida (en mi caso, window.grecaptcha , puedo llamar a una closure function que puede ser abstracted out .

Buena suerte...

A partir de la página de jquery api http://api.jquery.com/jQuery.getScript/

Retrollamada de éxito

La devolución de llamada se activa una vez que la secuencia de comandos se ha cargado pero no necesariamente se ha ejecutado.

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

si la función foo() depende de test.js, no se puede ejecutar con éxito.

Vi algo similar con la API de google api, pero en ese caso puedes especificar la función de devolución de llamada en la URL de scripts ajax. Pero, en general, ¿hay una manera obvia de esperar hasta que se ejecute el script ajax para hacer la devolución de llamada?


$ getScript usa así

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

esto está funcionando bien para mí


Estaba enfrentando el mismo problema hoy y se me ocurrió una solución basada en promesas y un temporizador de intervalo:

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

La idea es que cargue una secuencia de comandos determinada que exponga alguna variable (la función foo en su ejemplo de pregunta) que aún no existe, por lo que después de que getScript cargue la secuencia de getScript , compruebe si esta variable existe, si no, cree una intervalo que verificará continuamente si la variable está disponible, y solo cuando se cumpla esta condición, usted resolverá la promesa.


Me temo que la solución requiere sondeo para la dependencia. Alternativamente, el script debe estar envuelto en una devolución de llamada predefinida como AMD.


Puedes usar ajax

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

Async es falso, porque quieres cargar y ejecutar el script, luego de eso en la devolución de llamada exitosa puedes llamar a tu función foo ()


Sé que es una vieja pregunta, pero creo que las respuestas que contienen "hecho" no son explicadas por sus propietarios y, de hecho, son las mejores respuestas.

La respuesta más votada exige el uso de "async: falso", que a su vez creará una llamada de sincronización que no es óptima. por otro lado, las promesas y los handlers prometedores se introdujeron en jquery desde la versión 1.5 (¿quizás antes?) en este caso estamos intentando cargar un script de forma asíncrona y esperar a que termine de ejecutarse.

La devolución de llamada por definición getScript documentation

La devolución de llamada se activa una vez que la secuencia de comandos se ha cargado pero no necesariamente se ha ejecutado.

lo que debes buscar es cómo actúan las promesas. En este caso, como está buscando una secuencia de comandos para cargar de forma asíncrona, puede utilizar "a continuación" o "hecho" eche un vistazo a este hilo que explica la diferencia muy bien.

Básicamente se llamará solo cuando se resuelva una promesa. en nuestro caso, cuando el script se cargó con éxito y terminó de ejecutarse. Así que básicamente en tu código significaría:

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

debe cambiarse a:

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


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