我有一个2000行的jquery文件,我把文件拆分成较小的文件,如果我在第一个文件中有一个函数,那个文件#2是指的,它就会出现未定义。
每个文件都包含在jquery ready函数中,执行此操作的最佳方法是什么?
答案 0 :(得分:6)
如果有问题的函数是在ready
处理程序的范围内声明的,那么任何其他代码都无法访问它,包括其他ready
处理程序。
您需要做的是在全局范围内定义函数:
function foo()
{
alert('foo');
}
$(document).ready(function()
{
foo();
});
P.S。添加ready
处理程序的更简洁方法是:
$(function()
{
foo();
});
修改:如果您的每个分开的ready
处理程序的内容依赖于前面的部分,那么由于上述原因,您无法拆分它们。更明智的做法是将大部分逻辑分解为独立函数,将它们放在ready
事件处理程序之外的自己的文件中,然后从处理程序中调用它们。
修改:为了进一步说明,请考虑以下处理程序:
$(function()
{
var foo = 'foo';
var bar = 'bar';
alert(foo);
alert(bar);
});
我可能会把它分开:
$(function()
{
var foo = 'foo';
var bar = 'bar';
});
$(function()
{
alert(foo);
alert(bar);
});
问题在于foo
和bar
是在第一个处理程序中定义的,当它们在第二个处理程序中使用时,它们已经超出范围
这样的任何连续逻辑流都需要在同一范围内(在本例中为事件处理程序)。
答案 1 :(得分:2)
函数定义不应包含在另一个函数中。除非您真的希望该函数定义是私有的,否则不会。如果我理解正确,那不是你的意图。
只在jQuery ready函数中包装函数调用。
如果您担心自己的函数与第三方函数名称发生冲突,请将其命名为:
var myFunctions = {}
myFunctions.doThis = function () {}
myFunctions.doThat = function () {}
但实际上,如果您要为其他人创建mashup或库,您只需要担心这个问题。在您自己的网站上,您可以控制javascript中包含的内容。
答案 2 :(得分:1)
实际上,出于性能原因,最好将其保存在一个文件中;多个请求实际上可以占用更多带宽......但作为单独的文件,您需要按特定顺序对它们进行排序,以便存在逻辑顺序。每个脚本都定义一个方法,而不是在document.ready中包含所有内容,该页面将在其自己的document.ready处理程序中执行,以便您可以维护该顺序。
答案 3 :(得分:1)
很可能它未定义的原因是因为当你有单独的就绪调用时,这些调用中的代码范围是不同的。
我会重新组织我的代码。可以使用$ .extend直接将任何共享函数附加到jQuery对象。这就是我们为我们的应用程序所做的工作,它运作良好。
见this question。希望它有所帮助。
答案 4 :(得分:0)
每个文件都不应具有就绪功能。只有一个文件应该具有就绪功能,并且应该是最后一个文件。
答案 5 :(得分:0)
函数在JavaScript中提供范围。您在jquery.ready中的代码是一个匿名函数,因此它不知道其他作用域。删除这些JavaScript函数的包装并将它们声明为常规函数,la
$(document).ready(function ()
{
functionFromFile1();
functionFromFile2();
};
答案 6 :(得分:0)
“包装在jquery ready函数中”只不过是将事件绑定到jQuery认为DOM准备就绪时触发的ready
事件。
您应该只将依赖于DOM的方法绑定到ready
事件。无论你做了多少绑定,所有方法最终都会以绑定顺序执行。