将jquery代码包装在$(document).ready()函数中是多么重要
How important it is to wrap jquery code in $(document).ready() function?
我已经用jQuery开发我的前端代码一段时间了,因为我正在用rails中的部分实现这个网站。通常,我会使用 content_for :javascript
来包装一些特定于视图的代码。
我的问题是,我最终得到了很多脚本标签,并且由于其中大多数是jquery代码,因此我输入了很多$(document).ready(function() {});
所以我的问题是,是否有必要将所有内容包装在document.ready中,如果我有太多document.ready
会影响性能吗?
$(document).ready()
有一个目的 - 在 DOM 完成加载并且现在准备好访问或修改后执行一些代码。
如果您的代码位于 DOM 元素之前,例如在 <head>
标记中或在某些 DOM 元素之前的<body>
部分的顶部或中间,并且该代码确实在首次初始化时尝试访问 DOM,那么它应该放在一个 $(document).ready()
块中,这样它就不会在 DOM 准备就绪之前执行,或者应该移动 ' 标记。
如果您的代码位于<body>
中<script>
标记中,该标记位于它需要访问的 DOM 元素之后,则您的代码不需要位于 $(document).ready()
块中。
(例如,它仅在其他事件时被调用),或者您的代码在初始化时不访问 DOM,则该代码不需要位于 $(document).ready()
块中。
虽然你显然有jQuery可用,但你可以阅读这个答案以获得更详细的描述:纯JavaScript相当于jQuery的$.ready()如何在page/dom准备好时调用函数。
拥有多个$(document).ready()
块就像为一个事件注册多个回调一样。 真的没什么大不了的。 每个函数只需要额外的几个函数调用来设置,并且在执行时是一个额外的回调执行。 如果这是编写代码的最干净方法,那么一定要使用多个$(document).ready()
块。
总而言之,在以下情况下将代码放入$(document).ready()
块中:
- 特定的代码块在首次运行时需要访问 DOM,并且代码位于脚本标记中,该脚本标记放置在
<body>
标记的末尾之前,或者放置在可能需要访问的某些 DOM 元素之前。
在以下情况下,无需将代码放入$(document).ready()
块中:
- 首次初始化时运行的代码部分不访问 DOM。
- 代码被放置在它引用的 DOM 元素之后的
<script>
标记中。 <script>
标记标记为defer
,因为这显式指示浏览器延迟此脚本标记的运行,直到解析 DOM 之后。
另外,请记住,声明函数的位置无关紧要。 只有从何处调用函数才重要。 因此,您可以在$(document).ready()
之外定义任意数量的函数。 你只需要确保访问 DOM 的任何函数都不会被太快调用。
如果你的代码确实访问了你的 DOM 元素,但你把它放在$(document).ready()
之外,它可能会失败或产生意外的行为。请参阅下面的示例:
var listA = $('ul.myclass').children();
$(document).ready(function(){
var listB = $('ul.myclass').children();
});
从上面的简单代码片段来看,即使文档尚未完全加载或准备就绪,脚本加载时也会立即计算listA
,而listB
是在文档加载并准备就绪时计算的。
在这种情况下,listA
和listB
可能会有所不同,即使它们是从同一个 DOM 选择器计算的。
您可以初始化一些变量值或预加载一些与 document.ready()
之外的 UI 无关的值。但是,当您想初始化UI或在启动时访问DOM,请始终在文档完成加载时执行此操作(document.ready
)。
我同意@jfriend00所说的一切,但也请记住,并非所有代码都需要在document.ready
事件中。 我的意思是您可以随时创建函数,它们只需要在 document.ready
执行。 例如:
function manipulateDOM( el ) {
document.getElementById(el).classList.add('myClass');
}
$(document).ready(function()){
manipulateDOM('myEl');
});
- jQuery加载的async和ready函数不工作
- 如何通过documents.ready函数中的javascript自动按键(ctrl+shift+i)
- 停止对document.ready函数的重定向/刷新
- ready函数在每个页面中触发
- 函数从$(document).ready外部调用在$(document).ready中定义的函数
- 如果没有document.ready(),我怎么能拥有多个javascript函数呢
- 重载像$(document).ready这样的函数是错误的
- $(document)中的多个javascript函数.ready不工作
- JavaScript执行从函数声明开始,而不是从$(document).ready()开始
- 编写没有加载和.ready函数的JavaScript
- 在 $( 文档 ).ready 函数中使用字符串名称调用 javascript 函数
- 调用 Document.ready 外部的 AJAX 函数
- 在CrossRider内部创建的全局变量's的appAPI.ready()函数对页面不可用
- jQuery的事件处理程序运行良好,但应该't,因为它's不在ready()函数中
- 函数在例如$(document).ready()上注册时的通知
- 如何在document.ready(function)时运行隐藏函数和动画
- 超越了在document.ready()中编写简单函数
- Javascript on click事件在函数中不起作用,但在document.ready()中起作用
- 为什么document.ready中的事件处理程序函数有效但无效;取出后不起作用
- 如何调用函数ready()中的函数