2011-05-03 33 views
1

我有一些代码可以正常工作,如果它被添加到页面上的脚本标记。我已经将它移动到一个单独的JS文件中(与HTML页面在同一个文件夹中),但是当我尝试调用它时,出现“Object expected”错误。'预期的对象'使用外部JS

这是我的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> 

,这是我的JS文件:

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

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

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

我敢肯定,我失去了一些东西真的很浅显,但我敢对于JS来说是新的,我在这里已经圈了几个小时了。

有人能让我知道我在做什么错吗?

感谢,

大卫

+0

Jscript1.js可能未加载。检查萤火虫网络标签,或只是尝试从相同的位置加载到浏览器。 – itsadok 2011-05-03 13:17:34

+0

如果你使用这样的闭包(它不是一个类),你不需要命名它。命名'nsTest'毫无意义。 – Rudie 2011-05-03 13:33:50

+0

@Rudie:该功能未被命名。函数的返回值分配给'nsTest'。 – 2011-05-03 13:35:53

回答

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

是XML不是HTML。

所以你没有一个完整的脚本标签,它可以搞砸下面的脚本标签中的定义。

将其更改为

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

如果不解决这个问题(即,如果该DTD是一个真正的XHTML DTD),然后在“JScript1.js”没有被正确送达。也许尝试在浏览器中加载它以检查它是否被投放,并且使用像MIME类型的文本/ javascript。

+0

+1'

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

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

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

在进行即时调用时,您必须将函数括在括号中。

+0

[你不必](http://jsfiddle.net/fkling/CFzuy/),但它更好的兼容性。 – 2011-05-03 13:26:31

+0

我通常也不会给我的封闭命名,但这应该是可能的。 – Rudie 2011-05-03 13:32:27

+0

由于该浏览器中的规范违反,命名闭包会导致IE6中的全局范围泄漏。 例如在IE6中,'var x; (function x(){})(); alert(typeof x);'会弹出“功能”而不是“未定义”。我还没有在更现代的IE版本中测试过。 – 2011-05-03 13:44:45

0

我发现这个正在寻找相同问题的帮助。在我的情况下,问题是我的标签有type =“application/javascript”而不是type =“text/javascript”

这在大多数浏览器中都能正常工作,但是IE8出现“Object Expected”错误。

type =“text/javascript”是正确的属性。

希望能帮助别人。