2010-12-27 18 views
13

a menudo tienen que cargar otros archivos JavaScript a través de AJAX, por lo que al principio he utilizado la función estándar de jQuery proporciona para el script de carga:¿Cómo carga de forma síncrona una secuencia de comandos desde otro directorio mediante una llamada ajax?

$.getScript('script_name.js',callback_function()); 

Pero esto no funcionó, ya que $ .getScript es asíncrona (la API de jQuery para $ .ajax dice que 'async' se establece en true de manera predeterminada; el tema se discute en los comentarios de la API para $ .getScript: http://api.jquery.com/jQuery.getScript/). Así que escribí esta función, conforme a lo dispuesto por alguien en los comentarios de la página de la API vinculados anterior:

load:function(script,callback){ 

    jQuery.ajax({ 

     async:false, 

     type:'GET', 

     url:script, 

     data:null, 

     success:callback, 

     dataType:'script' 

    }); 

}, 

Esto parecía funcionar bien, así que continué, pero recientemente me di cuenta, que esto sólo funciona para las secuencias de comandos en el mismo directorio, ej. Llamar a myObj.load ('test.js') funciona bien, pero llamar a myObj.load ('test/test.js') no funciona en absoluto.

Parece que me falta algo obvio, pero no logré encontrar el problema. ¿Alguna idea?

Respuesta

12

Actualización: Ver el flujo de comentarios a continuación, no tiene nada que ver con jQuery, es un problema de permisos de archivos en el servidor.


Respuesta original:

¿Usted consigue los errores del navegador? Por ejemplo, en Chrome o Safari, si abre las Herramientas de desarrollo y mira la pestaña Consola, ¿muestra errores? O en Firefox, instale Firebug y verifique en la consola de Firebug. O en IE, use la versión gratuita de VS.Net ... Algo debería estarse quejando con usted acerca de algo.

También puede obtener más información de su código en sí mismo mediante el suministro de una función error en lugar de asumir el éxito:

jQuery.ajax({ 
    async:false, 
    type:'GET', 
    url:script, 
    data:null, 
    success:callback, 
    dataType:'script', 
    error: function(xhr, textStatus, errorThrown) { 
     // Look at the `textStatus` and/or `errorThrown` properties. 
    } 
}); 

actualización: Usted ha dicho que se ve textStatus = 'error' y errorThrown = indefinido . Muy extraño. ¿Funciona el mismo script si lo mueve para que no esté en un subpaso? Me pregunto si el sub-camino es una pista falsa, y el verdadero problema es un error de sintaxis en el script.


fuera de tema: ¿se realmente tiene que ser sincronizada? ¿No puedes simplemente buscar un símbolo para que aparezca? Es solo que las solicitudes ajax sincrónicas realmente basura la experiencia del usuario. En muchos navegadores, no solo en su propia página, sino en , todas las páginas se bloquean durante la solicitud.

Esto es lo que quiero decir con el sondeo: Supongamos que yo quería cargar jQuery forma asíncrona desde JavaScript:

function loadScript(url, symbol, callback) { 
    var script, expire; 

    // Already there? 
    if (window[symbol]) { 
     setTimeout(function() { 
      callback('already loaded'); 
     }, 0); 
    } 

    // Determine when to give up 
    expire = new Date().getTime() + 20000; // 20 seconds 

    // Load the script 
    script = document.createElement('script'); 
    script.type = 'text/javascript'; 
    script.src = url; 
    document.body.appendChild(script); 

    // Start looking for the symbol to appear, yielding as 
    // briefly as the browser will let us. 
    setTimeout(lookForSymbol, 0); 

    // Our symbol-checking function 
    function lookForSymbol() { 
     if (window[symbol]) { 
      // There's the symbol, we're done 
      callback('success'); 
     } 
     else if (new Date().getTime() > expire) { 
      // Timed out, tell the callback 
      callback('timeout'); 
     } 
     else { 
      // Schedule the next check 
      setTimeout(lookForSymbol, 100); 
     } 
    } 
} 

Uso:

// Load jQuery: 
loadScript("path/to/jquery.min.js", "jQuery", function(result) { 
    // Look at 'result' 
}); 
+0

La función de error no ayuda - textStatus se establece en 'error' y es errorThrown indefinido – Alex

+1

@Alex: Muy extraño de hecho. Por cierto, he agregado un gran comentario fuera del tema. :-) De acuerdo con su problema real, ** funciona el mismo script ** si lo mueve para que no esté en un subpaso? Me pregunto si el sub-camino es una pista falsa, y el verdadero problema es un error de sintaxis en el script. –

+0

Firebug ayudado, las solicitudes fallan debido a un error 403! Estoy en un servidor local que instalé en mi Ubuntu, no sé cómo resolver esto? En cuanto a la pregunta offtopic: Bueno, quiero ejecutar funciones desde el script cargado una vez que está cargado, y con $ .getScript (script_url, function_from_the_loaded_script()); no funcionó – Alex

16

Puede establecer llamadas Ajax a ser sincrónica por defecto usando ajaxSetup.Esta es la forma en que parece:

$.ajaxSetup({async:false}); 
$.getScript('script_name.js', callback_function); 

Si necesita llamadas asíncronas de nuevo, sólo permitirá con:

$.ajaxSetup({async:true}); 
+0

esto no funciona ... – Raghav

+6

Configurar el modo ajax para sincronizar funciona para mí, pero importante: si pasa una función de devolución de llamada 'callback_function()', omita los corchetes. De lo contrario, se pasa el valor de retorno de la función y se ejecuta 'callback_function' ins * before *' getScript() ' – DerVO

+2

No se recomienda el uso de' $ .ajaxSetup'; consulte https://api.jquery.com/jquery.ajaxsetup/. No es una buena idea cambiar las llamadas ajax '' async' attribute default. '$ .Getscript' es la abreviatura de' $ .ajax', por lo que puede hacer: '$ .ajax ({url: url, dataType:" script ", async: true})' - funciona para mí. –

Cuestiones relacionadas