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