这段代码是否需要在document.ready中?

azi*_*ani 32 javascript jquery

document.ready使用DOM完全加载后执行代码.这可以用于将事件处理程序附加到页面上的元素,例如

$(function(){ 
    $('#somediv').click(function(){ 

    }); 
}) 

<div id="somediv"> </div> 
Run Code Online (Sandbox Code Playgroud)

在内部,jQuery挂钩DOMContentLoadedwindow.onload作为后备.在IE的情况下,尝试一遍又一遍地滚动视口直到成功.

我有几个问题,我的第一个问题是,当将事件处理程序绑定到document自身时,是否有必要将该代码放入document.ready?我一直在编写下面的代码,而不是将它包装在一个document.ready

$(document).keydown(function(e){
    if (e.which == 39) { 
       alert( "right arrow pressed" );
       return false;
    }
});
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,它有效.我的理解是,由于此代码不会连接到文档中的任何元素,而是文档本身,因此无需将其包装在document.ready处理程序中.我不包装它的另一个原因是因为我曾经在vanilla javascript中做同样的事情,相当于下面的代码,这也有效.

document.onkeydown = function(){
var keyCode = event.keyCode || event.which;   
    if (keyCode == 39) { 
       alert( "right arrow pressed" );
       return false;
    }
}
Run Code Online (Sandbox Code Playgroud)

我已经看过很多人将它包装成一个帖子document.ready,有没有不包装这些代码的缺点document.ready

此外,我认为这个问题源于我在构建DOM时发生的事情缺乏清晰度,所以如果有人能够解释在DOM准备好之前的那段时间发生的事情.对于我来说,当html被解析并转换为DOM树时,文档已准备就绪,还是有更多内容?

总之,这是我的问题

  1. 将事件处理程序绑定到document自身时,是否有必要将该代码放入document.ready.
  2. 没有包装代码的缺点是document.ready什么?
  3. 在文件构建之前,在document.ready被解雇之前会发生什么样的事件?

use*_*654 33

如果您绑定到文档本身,则无需等待它准备就绪.在这种情况下,不应该将它包装在document.ready中.

当浏览器触发DOMReady事件时,或者对不支持DOMReady事件的浏览器版本的特定测试成功时,document.ready会被触发.

附加信息. (12年5月22日)

大多数现代浏览器都实现了DOMContentLoaded事件,该事件在文档中定义的所有元素都可以通过javascript操作时触发.其他浏览器依赖于setTimeout循环,该循环不断检查文档的readystate或直接绑定到文档的onreadystatechanged方法(取自jquery core).在执行javascript之前,文档本身已准备好进行操作,因此在直接绑定到文档时永远不需要等待.

这里唯一的问题是,如果代码与文档以外的元素交互,则有可能在文档存在之前在文档上触发事件.这不太可能发生,但它可能发生.如果您的代码可能会发生这种情况,那么将其置于其中$(document).ready()以防止该情况是有意义的.您的样品不保证被放入其中$(document).ready().


SLa*_*aks 11

重点$(document).ready是在解析整个文档后执行代码.

如果要使用尚不存在的元素,则只需使用它.
(例如,如果您的脚本在<head>)

如果您使用的元素已经存在(或者因为它们是全局的,或者因为<script>它们位于它们之下),您不需要它.


Jiv*_*ngs 5

不将事件绑定到document.ready块中的文档的唯一缺点是可以在加载所有页面内容之前触发事件,这可能不是您想要的.