为什么$ .click()必须包含在$(document).ready()中?

我正在浏览http://docs.jquery.com/How_jQuery_Works并找到在$(document).ready()中包含$.click()事件的要求,甚至有点奇怪。 我的困难如下:

  • 加载文档时,控件将输入$(document).ready()函数,但是它会继续执行$.click()吗? (基于它不会的行为。但是当控件进入正常function时,为什么不进入$.click()函数?)
  • 由于用户只有在文档准备好后才能看到URL,是否真的需要在$(document).ready()嵌入$.click() $(document).ready()

How jQuery Works文档使用绑定$(document).ready() .click()内部的.click()的示例来确定在函数执行时已创建绑定.click()事件的元素。

使用函数作为参数调用.click()在与其前一个选择器匹配的节点上执行 .click() ,而是将函数绑定到匹配节点的onclick

如果你试图做这样的事情:

 $('a').click(function(){ alert('clicked me'); }); 

…在文档或在呈现任何元素之前,事件不会绑定到任何节点,因为在执行该函数时没有与$('a')选择器匹配的节点。

此外,如果您在创建了一些标记时执行了此操作,则只有已创建的标记才会获得绑定事件。 绑定函数后创建的标签将不具有.click()绑定。

所以在jQuery(和其他JavaScript框架)中,你经常会看到在$(document).ready(function(){});中添加事件处理程序,绑定小部件等的约定$(document).ready(function(){});

这不是对.click()的实际调用,这是它所关注的元素,而是调用它的元素的选择器。

例如,如果有一个id="myButton"的元素,那么你将引用它:

 $('#myButton') 

但是,如果该元素尚未加载(即,如果文档尚未准备就绪,并且您不知道当前加载了哪些元素),那么该选择器将找不到任何内容。 因此它.click()在任何事情上调用.click() (要么绑定事件,要么触发它,具体取决于.click()的参数)。

您可以使用其他方法, 例如jQuery .on()函数 ,它可以将事件绑定到公共父元素,并从文档生命周期后期添加的事件中过滤“冒泡”事件。 但是如果你只是使用普通的选择器并调用一个函数,那么选择器需要在DOM中找到一些东西才能让函数做任何事情。

是的,您需要确保您添加点击处理程序的DOM元素存在,您知道的任何文件都已准备就绪。

$(document).ready(..)方法试图解决的问题是页面的javascript代码的执行与页面中的控件绑定的时间之间的紧张关系。 一旦文档准备好并且DOM元素可用,就会触发ready函数,因此javascript代码可以对DOM做出合理的假设

最常见的例子是javascript代码相对于它试图操作的DOM元素的位置。 考虑

  
Click Me

在此特定示例中,javascript将无法按预期运行。 当进入脚本块时,运行click行,并且当前没有具有id target DOM元素,因此处理程序绑定到任何内容。 代码没有什么问题,它只是在创建DOM元素之前运行的不幸时间。

在这个例子中,问题是显而易见的,因为代码和DOM元素在视觉上配对在一起。 在更复杂的网页中,尽管javascript通常位于完全独立的文件中,并且没有关于加载顺序的可视保证(也不应该)。 使用$(document).ready(..)抽象消除了排序作为潜在问题根源的问题,并促进了关注点的正确分离

一旦读取标记,Javascript通常就会开始执行。 这意味着在将脚本放入头部的标准实践中,尚未创建任何元素,您可以将单击处理程序绑定到。 甚至身体元素还不存在。 使用jQuery.ready延迟执行代码,直到所有DOM元素都被加载。