2008-08-20 14 views
28

Sto lavorando con entrambi amq.js (ActiveMQ) e Google Maps. Io carico i miei script in questo ordineJavaScript Load Order

<head> 
    <meta http-equiv="content-type" content="text/html;charset=UTF-8" /> 
    <title>AMQ & Maps Demo</title> 

    <!-- Stylesheet --> 
    <link rel="stylesheet" type="text/css" href="style.css"></link> 

    <!-- Google APIs --> 
    <script type="text/javascript" src="http://www.google.com/jsapi?key=abcdefg"></script> 

    <!-- Active MQ --> 
    <script type="text/javascript" src="amq/amq.js"></script> 
    <script type="text/javascript">amq.uri='amq';</script> 

    <!-- Application --> 
    <script type="text/javascript" src="application.js"></script> 
</head> 

tuttavia a mio application.js carica mappe bene, ma ottengo un errore quando si cerca di iscriversi a un argomento con AMQ. AMQ dipende dal prototipo che la console di errore in Firefox dice che l'oggetto non è definito. Penso di avere un problema con l'utilizzo dell'oggetto amq prima che il caricamento dello script sia terminato. C'è un modo per assicurarsi che entrambi gli script vengano caricati prima di usarli nel mio file application.js?

Google ha questa bella funzione chiamata google.setOnLoadCallback(initialize); che funziona benissimo. Non sono sicuro che amq.js abbia qualcosa del genere.

risposta

27

Esiste un modo per assicurarsi che il carico sia gli script prima che io li uso nel mio application.js?

file JavaScript dovrebbe caricare in sequenza e bloccare così a meno che gli script si sta a seconda stanno facendo qualcosa di insolito tutto cio che dovrete fare è carico application.js dopo gli altri file.

Non-blocking JavaScript Downloads ha alcune informazioni su come vengono caricati gli script (e discute alcune tecniche per sovvertire il blocco).

+0

Vale anche la pena guardare l'API [Asynchronous Module Definition] (http://en.wikipedia.org/wiki/Asynchronous_module_definition) e altri che fanno la stessa cosa per caricare file JavaScript e altre risorse in parallelo. – Vimes

3

C'è un modo per assicurarsi che entrambi gli script vengano caricati prima di usarli?

Sì.

Inserire il codice che si desidera caricare per ultimo (il materiale application.js) nel prototipo document.observe. Questo dovrebbe garantire che il codice verrà caricato solo dopo il prototipo + altre cose sono finite e pronte. (Se si ha familiarità con jQuery, questa funzione è simile a jQuery di $(document).ready)

10

in jQuery è possibile utilizzare:

$(document).ready(function(){/*do stuff here*/}); 

che si assicura il javascript viene caricato e il DOM è pronto prima di fare le tue cose.

nel prototipo sembra che questo potrebbe funzionare

document.observe("dom:loaded", function() {/*do stuff here*/}); 

Se ho capito bene il problema .. Credo che possa aiutare ..

Se non si vuole fare affidamento su un lib fare questo ... Penso che questo potrebbe funzionare:

<script> 
    function doIt() {/*do stuff here*/} 
</script> 
<body onLoad="doIt();"></body> 
+0

Fa sì che javascript sia caricato e il dom, o solo il dom? – Gattster

+0

dom e javascript – danb

2

AMQ dipende prototipo della console errore di FireFox dice oggetto non è defi Ned.

Vuoi dire che AMQ dipende dallo Prototype library? Non riesco a vedere un'importazione per quella libreria nel codice che hai fornito.

2

Vuoi dire che AMQ dipende dalla libreria di Prototipi ? Non riesco a vedere un'importazione per quella libreria nel codice che hai fornito.

Sì per javascript di ActiveMQ (amq.js) dipende da Prototipo. In amq.js carica 3 script, _amq.js, behaviour.js e prototype.js.

Grazie per l'aiuto sull'ordine di caricamento di JavaScript wrumsby. Questo mi dice che il mio bug è in un altro castello :(

Immagino di avere un problema diverso Ho anche controllato i file js da ActiveMQ 5.0 a 5.1 e ho notato che erano uguali. 5.1 che richiede un aggiornamento per gli argomenti da sottoscrivere. Continuerò a cercare, ma grazie per aver eliminato questa possibile causa

7

Ho avuto un problema simile a questo, solo con un singolo script. per utilizzare in un oggetto script creato utilizzando document.createElement('script') Ecco la funzione finale che carica qualsiasi file JS standard e consente di aggiungere uno script "post carico".

function addJavaScript(js, onload) { 
    var head, ref; 
    head = document.getElementsByTagName('head')[0]; 
    if (!head) { return; } 
    script = document.createElement('script'); 
    script.type = 'text/javascript'; 
    script.src = js; 
    script.addEventListener("load", onload, false); 
    head.appendChild(script); 
} 

Spero che questo possa aiutare qualcuno in futuro.

+0

Grazie, questo è utile. –

43

Gli script tra domini vengono caricati dopo gli script del sito stesso, ecco perché si verificano errori. è interessante notare che nessuno lo sa qui.

+2

Grazie per questo commento. Dopo aver spostato i miei script nello stesso dominio, non ci sono più problemi. – BradH

+2

C'è un errore qui (http://stackoverflow.com/questions/1307929/javascript-dom-load-events-execution-sequence-and-document-ready) alla "buona risposta del valutatore": "Javascript è garantito per esegui nell'ordine in cui appare nel tuo codice HTML, quindi assicurati che la tua funzione sia definita prima di provare a collegarla a un evento. "? –

+14

Questo non sembra possibile, dal momento che è prassi comune caricare, ad esempio, jQuery dal CDN di Google, e quindi avere i propri script locali che richiedono jQuery – spinn

0

È inoltre possibile utilizzare il metodo javascript di SharePoint incorporato per controllare l'esecuzione degli script;

_spBodyOnLoadFunctionNames.push("yourFunction");