2010-12-27 15 views
13

ho spesso bisogno di caricare altri file JavaScript tramite la tecnologia AJAX, quindi all'inizio ho usato la funzione standard jQuery prevede lo script di carico:Come si carica in modo sincrono uno script da un'altra directory tramite una chiamata ajax?

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

Ma questo non ha funzionato, dal momento che $ .getScript è asincrona (l'API jQuery per $ .ajax dice che 'async' è impostato su true per impostazione predefinita; l'argomento è discusso nei commenti dell'API per $ .getScript: http://api.jquery.com/jQuery.getScript/. Così ho scritto questa funzione, come previsto da qualcuno nei commenti della pagina API legate sopra:

load:function(script,callback){ 

    jQuery.ajax({ 

     async:false, 

     type:'GET', 

     url:script, 

     data:null, 

     success:callback, 

     dataType:'script' 

    }); 

}, 

Questo sembrava funzionare bene, così sono andato via, ma di recente ho notato, che questo funziona solo per gli script in la stessa directory, ad es. chiamare myObj.load ('test.js') funziona bene, ma chiamare myObj.load ('test/test.js') non funziona affatto.

Sembra che manchi qualcosa di ovvio, ma non sono riuscito a trovare il problema. Qualche idea?

risposta

12

Aggiornamento: vedere il flusso di commenti qui sotto, non ha nulla a che fare con jQuery, si tratta di un problema di permessi sui file sul server.


risposta originale:

si fa a ottenere eventuali errori dal browser? Ad esempio, in Chrome o Safari, se apri Strumenti di sviluppo e guardi la scheda Console, mostra errori? O in Firefox, installa Firebug e controlla la console di Firebug. O in IE, usa la versione gratuita di VS.Net ... Qualcosa dovrebbe esserti lamentato per te.

È inoltre possibile ottenere ulteriori informazioni dal codice stesso, fornendo una funzione error piuttosto che assumere il successo:

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

Aggiornamento: Hai detto che si vede textStatus = 'errore' e errorThrown = undefined . Molto strano. Lo stesso script funziona se lo sposti in modo che non si trovi in ​​un sottotracciato? Mi chiedo se il sottotracciato sia un'aringa rossa e il vero problema è un errore di sintassi nello script.


Off-topic: Ha davvero deve essere sincrono? Non puoi semplicemente sondare l'apparizione di un simbolo? È solo che l'ajax sincrono richiede davvero trash all'esperienza utente. In molti browser, non solo la tua pagina ma tutte le pagine si bloccano durante la richiesta.

Ecco cosa intendo per polling: Supponiamo che io volevo caricare jQuery in modo asincrono da 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); 
     } 
    } 
} 

Usage:

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

La funzione di errore non ha aiutato - textStatus è impostato su 'errore' e errorThrown è non definito. – Alex

+1

@Alex: davvero molto strano. A proposito, ho aggiunto un enorme commento off-topic. :-) Re il tuo problema attuale, ** lo stesso script ** funziona se lo sposti in modo che non sia su un sottotracciato? Mi chiedo se il sottotracciato sia un'aringa rossa e il vero problema è un errore di sintassi nello script. –

+0

Firebug ha aiutato comunque, le richieste falliscono a causa di un errore 403! Sono su un server locale che ho installato su Ubuntu, non so come risolverlo? Per quanto riguarda la domanda fuori programma: beh, voglio eseguire le funzioni dallo script caricato una volta caricato, e con $ .getScript (script_url, function_from_the_loaded_script()); non ha funzionato – Alex

16

È possibile impostare le chiamate AJAX per essere sincrona di default utilizzando ajaxSetup.Questo è come sembra:

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

Se avete bisogno di nuovo le chiamate asincrone, basta attivarlo con:

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

questo non funziona ... – Raghav

+6

Impostare la modalità Ajax per la sincronizzazione funziona per me, ma importante: se si passa una funzione di callback 'callback_function()', lasciare fuori le parentesi. Altrimenti viene passato il valore di ritorno della funzione e 'callback_function' ins eseguito * prima *' getScript() ' – DerVO

+2

L'uso di' $ .ajaxSetup' non è raccomandato - consultare https://api.jquery.com/jquery.ajaxsetup/. Non è una buona idea cambiare l'attributo "async" delle chiamate ajax. '$ .Getscript' è una scorciatoia per' $ .ajax', quindi puoi fare: '$ .ajax ({url: url, dataType:" script ", async: true})' - Funziona per me. –

Problemi correlati