什么时候不应该为事件处理程序使用$(document).ready(function()?

时间:2012-01-28 02:47:24

标签: jquery

我是jquery和javascript的新手,只是想知道,为什么你不想对你的所有事件处理程序使用.ready()函数?

如果用户在整个页面呈现之前向鼠标事件或键盘事件发送输入,是否会出现潜在问题?

5 个答案:

答案 0 :(得分:3)

永远不会出现这种情况,在加载DOM时会触发jQuery文档。它不会等待加载完整的页面(包含的图像等)。在您的代码执行之前,用户能够及时做出反应来尝试触发某些内容是非常罕见的。阅读:http://api.jquery.com/ready/

具体来说,第一段:

  

当JavaScript提供用于执行代码的load事件时   页面呈现,此事件在所有资产之前都不会被触发   如图像已被完全接收。在大多数情况下,   只要DOM层次结构完全可以运行脚本   建造。传递给.ready()的处理程序是保证的   在DOM准备好之后执行,所以这通常是最好的地方   附加所有其他事件处理程序并运行其他jQuery代码。

所以使用$(document).ready(function(){})或等效的$(function(){})总是一个很好的做法。

编辑:为了进一步确保用户永远不会遇到问题,请确保您的脚本全部托管在您的网站旁边。例如,jQuery可以选择使用CDN。 CDN很不错,但如果用户无论出于什么原因可以访问您的网站而不是CDN,它可能会使您的网页处于无用状态。

答案 1 :(得分:1)

我相信你实际应该使用$(document).ready()处理程序。原因是,如果您的HTML或DOM还没有完全加载,当您将事件绑定到不同的元素时,它们可能会由于尚未在页面上而失败。

我不确定是谁或者是什么告诉你不要把事件处理程序放在ready函数中,但是我认为这是一种非常常见的做法。

答案 2 :(得分:1)

在某些情况下,您不希望或无法附加事件处理程序,因为您只想在其他事件之后启用事件,或者因为通过ajax加载内容和其他信息。在大多数情况下,就绪功能是正确的位置。

答案 3 :(得分:0)

这就是为什么最佳做法是将整个代码包装在.ready()函数中。

$(document).ready(function(){
  //all event handlers here
});
  

如果用户向鼠标发送输入,则无法存在潜在问题   整个页面呈现之前的事件或键盘事件?

问题不是在整个页面被渲染之前。问题是当jQuery尚未加载时,然后用户尝试单击通过jQuery事件处理程序处理的内容。那么,回答你的问题;是的,那里可能存在潜在问题。

答案 4 :(得分:0)

  

如果用户在整个页面呈现之前向鼠标事件或键盘事件发送输入,是否会出现潜在问题?   [本段]指的是不使用.ready()

的脚本

通常,如果要引用JavaScript中的元素,则必须已经解析了所讨论的元素,即添加到DOM树中。无论您是尝试附加事件处理程序(使用或不使用jQuery),更改其CSS设置或其他任何内容,这都适用。

.ready()处理程序不等待整个页面呈现,它等待页面为JS操作“准备好”,因为它已经< em>解析并构建了整个DOM树。此时,渲染可能仍在发生,例如,图像元素的实际内容仍然只能部分下载。

但是,只要在之后的中包含的脚本块中,就可以在(或不包含).ready()之前从JavaScript 开始操作元素。 / em>页面源中有问题的元素,因为浏览器从您的html源自上而下解析它。一个例子:

<input type="text" id="input1">
<script>
   // following will work, because "input1" already exists
   $("#input1").change(function() { /* do something */ });

   // following will NOT work, because "input2" has not been parsed yet
   $("#input2").change(function() { /* do something */ });
</script>
<input type="text" id="input2">

因此,如果由于某种原因你有一些关键的功能,你觉得你必须在 .ready()之前设置,你可以做类似上面的事情。

另请注意,如果您将脚本包含在正文的底部,则根本不需要.ready()函数,因为(与.ready()一样)此时所有元素都将被删除解析。

如果它包含在.ready()部分中,它将在解析文档的其余部分之前执行,因此您需要使用<head>