2010-09-14 5 views
2

Nous incluons un fichier javascript provenant d'un autre fichier javascript à l'aide de document.write. Dans le premier fichier javascript est un appel à une fonction dans le deuxième fichier javascript. Par conséquent, nous recevons un message d'erreur: 'gMunchkin' n'est pas défini lorsque je débogue le code. Qu'est-ce que je fais de mal, et comment 'gMunchkin' peut-il être appelé de cette manière?exécution d'une fonction javascript à partir d'un fichier inclus dans un autre fichier

J'utilisé IE7 pour voir la démo: http://www.apus.edu/bin/r/u/test.htm

+1

* "J'ai utilisé IE7 pour voir le" * Je suppose que vous avez voulu mettre plus sur cette ligne. Re la démo, avec Chrome sur Ubuntu, je vois deux alertes, "a" et "b". Vous devriez indiquer dans votre question ce que vous attendez de voir et ce que vous voyez à la place. –

+1

Je ne suis pas sûr de la meilleure façon de réviser le titre, mais je suggérerais ... quelque chose ... – Feanor

+0

Je pensais que c'était un message de spam: P Evan, écoutes-tu un événement onload avant de faire quoi que ce soit? Cela ne résoudra pas tous vos problèmes, mais il vous suffira peut-être d'attendre que le document soit entièrement chargé avant de passer des appels à des fichiers js partiellement téléchargés. – danjah

Répondre

6

Il est très possible, le navigateur n'a pas fini de télécharger munchkin.js lorsque vous faites l'appel à mktoMunchkin().

Vous pouvez utiliser jQuery to load muchkin.js.

$.getScript('http://munchkin.marketo.net/munchkin.js', function() { 
    //The code inside this anonymous function is executed by $.getScript() when the script has finished 
    //downloading.It is called a Callback function. It is required because 
    //getScript() does not block and will return before the javascript file is 
    //downloaded by the client 
    //If the call to getScript was blocking, the client would be frozen until the 
    //js file was downloaded, which could be seconds and could lead the user 
    //to think the browser has crashed 
    alert('Muchkin loaded. We can now use the Munchkin library.'); 
    mktoMunchkin("476-IFP-265"); 
}); 
//any code placed here will execute immediately. When this code is executed, 
// munchkin.js may not have finished downloading. Hopefully you can see why 
//there is a need for the callback function in $.getScript(). 

De cette façon, vous êtes assuré munchkin.js est entièrement téléchargé avant d'essayer d'utiliser ses fonctions.

+0

Salut - J'ai mis à jour le code un peu différemment, mais j'ai quand même une autre erreur. http://www.apus.edu/bin/r/u/test.htm – Evan

+0

Vous aurez toujours le même problème. Lorsqu'un script est ajouté à la page, le client doit toujours télécharger le fichier à partir du serveur. Cela pourrait prendre n'importe quoi de 10millisecondes à 10 secondes! La solution que j'ai fournie ci-dessus fonctionnera. Le code à l'intérieur de function() {} ne sera exécuté que lorsque le client aura fini de télécharger le fichier javascript. –

+0

Evan, j'ai également ajouté quelques commentaires supplémentaires à l'extrait de code dans ma réponse. J'espère que cela vous aidera à comprendre pourquoi la méthode $ .getScript() est nécessaire. Si vous n'avez pas déjà jQuery, vous pouvez le télécharger ici: http://code.jquery.com/jquery-1.4.2.min.js –

3

Lorsque vous incluez un autre script à l'aide de document.write, votre script principal continue à s'exécuter, avant même que l'autre script ait été récupéré et inclus. Cela étant dit, document.write est également déconseillé et vous ne devriez pas l'utiliser à des fins quelconques.

Y a-t-il une raison pour laquelle vous ne pouvez pas ajouter directement la balise <script> à votre code HTML?

0

Vous pourriez avoir la page parente faire quelque chose comme

var doAllThisStuff = function() { 
    mktoMunchkin(); 
}; 
var stillNeedToDoThis = null; 
if (typeof mktoMunchkin == "function") { 
    doAllThisStuff(); // Yay, we can do it right away! 
} else { 
    stillNeedToDoThis = doAllThisStuff; // We don't have mktoMunchkin yet. Better wait. 
} 

Puis au bas de la nouvelle page faire quelque chose comme ça

function mktoMunchkin() { 
    // All kinds of code 
} 
if (typeof stillNeedToDoThis == "function") { // is anybody waiting for mktoMunchkin? 
    stillNeedToDoThis(); 
    stillNeedToDoThis = null; 
} 
Questions connexes