2011-05-03 9 views
1

J'ai un peu de code qui fonctionne bien s'il est ajouté à une balise de script sur une page. Je l'ai déplacé dans un fichier JS séparé (dans le même dossier que la page HTML) mais j'obtiens une erreur "Object expected" à chaque fois que j'essaie de l'appeler.'Objet attendu' en utilisant JS externe

C'est ma page HTML:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
    <title>Untitled Page</title> 
    <script type="text/javascript" src="Jscript1.js" /> 
    <script type="text/javascript"> 
     function t() 
     { 
      nsTest.test(); 
     } 

     function t2() 
     { 
      nsTest.test2(); 
     } 
    </script> 
</head> 
<body> 
    <input type="button" value="test" onclick="t()" /> 
    <input type="button" value="test2" onclick="t2()" /> 
</body> 
</html> 

et ceci est mon fichier JS:

var nsTest = function() 
{ 
    var test = function() 
    { 
     alert('nsTest.test'); 
    } 

    var test2 = function() 
    { 
     alert('nsTest.test2'); 
    } 

    return { 
     test: test, 
     test2: test2 
    } 
}(); 

Je suis sûr que je manque quelque chose de vraiment simple et évident, mais je suis assez nouveau à JS et j'ai tourné en rond pendant quelques heures à ce stade. Est-ce que quelqu'un peut me faire savoir ce que je fais mal?

Merci,

David

+0

Jscript1.js ne se charge probablement pas. Vérifiez l'onglet réseau firebug, ou essayez simplement de le charger à partir du même emplacement dans le navigateur. – itsadok

+0

Si vous utilisez une fermeture comme celle-ci (ce n'est pas une classe), vous n'avez pas à le nommer. Il est inutile de nommer 'nsTest'. – Rudie

+0

@Rudie: La fonction n'est pas nommée. La valeur de retour de la fonction est affectée à 'nsTest'. –

Répondre

4
<script type="text/javascript" src="Jscript1.js" /> 

XML est pas HTML.

Vous n'avez donc pas de balise de script complète, ce qui peut bousiller les définitions de la balise de script suivante.

Modifier à

<script type="text/javascript" src="Jscript1.js"></script> 

Si cela ne résout pas le problème (à savoir si cette DTD est un véritable DTD XHTML), puis « JScript1.js » n'est pas servi correctement. Peut-être essayer de le charger dans votre navigateur pour vérifier qu'il est servi, et servi avec un type mime comme le texte/javascript.

+0

+1 '

2
(function nsTest(){ 
    var test = function(){ 
     alert('nsTest.test'); 
    } 

    var test2 = function(){ 
     alert('nsTest.test2'); 
    } 

return { 
    test: test, 
    test2: test2 
} 
})(); 

Vous devez entourer votre fonction entre parenthèses lors d'un appel immédiat.

+0

[Vous n'avez pas à] (http://jsfiddle.net/fkling/CFzuy/) mais c'est mieux pour la compatibilité. –

+0

D'habitude, je ne nomme pas non plus mes fermetures, mais cela devrait être possible. – Rudie

+0

Les fermetures nommées peuvent provoquer des fuites dans la portée globale de IE6 en raison de violations de spécifications dans ce navigateur. E.g.dans IE6, 'var x; (fonction x() {})(); alert (typeof x); 'apparaîtra" function "au lieu de" undefined ". Je n'ai pas testé cela dans des versions plus modernes de IE. –

0

J'ai trouvé cette recherche d'aide pour le même problème. Dans mon cas, le problème était que mon tag avait type = "application/javascript" au lieu de type = "text/javascript".

Cela a fonctionné dans la plupart des navigateurs, mais a fait l'erreur IE 8 avec "Object Expected".

type = "text/javascript" est l'attribut correct.

Espérons que cela aide quelqu'un.

Questions connexes