我在页面中编写了很多JQuery代码,并决定将一些函数移到一个单独的文件中。因此,文件#1只有函数定义:
function doSomething() { ... }
function doSomethingElse() { ... }
在主页面中,我将JQuery放在文件的末尾 - 遵循Zakas的“高性能Javascript”一书中的优化技术。
所以,在文件的最后(但在关闭正文标记之前)我有:
<script type="text/javascript" src="/scripts/MyFunctions.js"></script>
<script type="text/javascript">
doSomething();
doSomethingElse();
....
</script>
请注意,在加载页面并声明DOM后,将加载并运行最终的Javascript脚本。但是,每次声明'doSomething'未定义时,我都会收到错误。
如果函数包含在主脚本中,则无效。只有当我把它们拉到外面时才会出现这个错误。现在,我的猜测是第一个文件在第二个文件调用时没有完全加载/编译。但在我看来,最后一个脚本(基本上是“就绪”角色)应该是最后编译的脚本。当我查看JQuery和其他JS文件时,他们从匿名函数开始,而不是直接启动到函数定义,所以很明显还有其他事情发生。
请注意,我不认为加载/查找文件是一个问题:我尝试了各种路径以确保路径正确并且没有解决问题。< / p>
有没有人知道为什么我的功能没有找到?
更新:如果我完全按照找到的方式获取文件内容并将其放入第一个脚本标记而不是从文件加载,这样可以正常工作。但我已经重复检查了脚本文件名,这是正确的。所以这是从外部文件加载它的过程。
更新:已解决。我通过FireBug运行它,因为keegan和dskrepps建议并且它立即跳出来。我有一个ASP.NET变量,我放在脚本中,但当然,ASP.NET不解析文件或替换变量。当Javascript看到这些可替换的值时,它就会因未报告的解析错误而死亡。所以 - 文件没有被加载,它根本不是Javascript函数调用问题。相反,它是键盘和座椅之间的错误。 ; - )
感谢所有帮助过的人!
答案 0 :(得分:2)
这可能不是可以通过DOM-Ready块解决的问题,即:
// Do something when the DOM is ready
jQuery(function() {
});
因为通过普通ol'脚本标签加载JavaScript可以保证执行顺序(假设未设置defer
和async
属性),因此按顺序放置文件应该足够了。简而言之,假设文件实际上正在加载,将一个文件放在另一个文件后应允许第二个文件使用第一个文件。
您是否已检查过firebug / web检查器,以确保您没有为这些文件获取404?
在您的myFunctions
文件中,您是否将代码包装在匿名函数中?这样做会将定义保密(除非你明确地公开它们),这会阻止你在另一个块中访问它们。
例如,如果myFunctions.js
如下所示:
// Anonymous closure
(function() {
function doSomething() {}
function doSomethingElse() {}
})();
您将无法从页面调用这些函数,您必须将它们添加为窗口的属性或某个全局命名空间。
希望有所帮助。干杯!答案 1 :(得分:1)
您的doSomething()
和doSomethingElse()
个文件是否在$(document).ready()
来电?在你真正尝试调用这些函数之后,这可能会导致它们被激活。
虽然jQuery以匿名函数调用开始,但是它在一个闭包中,以便立即调用匿名函数,即它内部的函数立即被创建。
答案 2 :(得分:1)
由于onReady不起作用,检查文件是否加载的一种非常简单的方法是将alert('Running');
放在文件的最底部。如果它没有警报,则文件中可能存在语法错误。检查您的错误控制台,firebug或一些开发人员工具以进行调试。如果它发出警报,你可能拼写错误的函数名称。
还要注意绝对路径名和相对路径名之间的区别。如果我没记错的话,'/ script.js'将从'example.com/script.js'加载,而'script.js'将从'example.com/WhereEverYouAre/script.js'加载
如果您的功能可能未全局定义,请按以下方式定义:
window.doSomething = function() { ... }
答案 3 :(得分:0)
完全不同的原因但相同的症状 - 我所包含的.js文件中的一个函数缺少一个结束括号。