为什么$(document).on(..)可以放在页面的任何位置,而$(" .cl")。on(..)必须放在$(document).ready回调中还是之后呢?

时间:2014-04-20 15:50:42

标签: javascript jquery

标题问题说明了一切。在大多数情况下,我理解后一种情况。当读取Javascript时,对DOM的引用必须具有某种意义,这就是为什么我们将它包装在$(document).ready回调中,或者将我们的脚本置于<body>下。我真的不明白为什么$(document).on(...)似乎无论位置如何都有效。

任何输入都是麻烦。

1 个答案:

答案 0 :(得分:3)

执行$(anything)时,运行该选择器时必须存在任何对象。

当您进入<head>部分时,document对象已经存在,因为它是整个页面的主父级。但是,身体中还没有任何东西存在,所以还没有$(“.class”)存在,因此选择器找不到任何东西(或者更糟糕的是因为身体还没有存在而失败)。

但是$(document)确实存在最早可以运行脚本的时间(在<head>部分中$(document)所以<body>正常工作,并且可以将事件处理程序附加到。

如果您要查找$(".class")中的元素,例如您的示例<body>,那么您必须等待.ready()部分加载类似jQuery&#39; s <body>(因此这些元素将在脚本运行之前存在)或者您必须将脚本放在.on()之后的那个元素之后,以便在运行您的元素时已经解析了您想要的元素脚本。


如果您正在使用$(mySelector).on("click", ".myClass", fn); 这样的委托事件处理,请再添加一点:

$(mySelector)

然后".myClass"中的对象是事件处理程序将直接附加到的对象,这些是您运行此代码行时必须存在的对象。运行此代码时,不必存在与$(document).on("click", ".myClass", fn); 匹配的对象。因此,如果您通过附加到文档对象来执行委托事件处理:

document

然后,在运行此行代码时,只有document对象必须存在。由于首先创建了document对象,因此当您可以运行javascript代码时它就已存在,因此它似乎总是有效。

这引发了一个有趣的问题,即您是否可以将所有事件处理程序附加到{{1}}对象。如果你这样做会有一些权衡(如果直接附加到源对象,某些事件只能正常工作),所以不应该在不了解后果的情况下盲目地做到这一点。有关将所有事件附加到文档对象的权衡的更详细讨论,请参阅this answer