在 document.ready 里面写代码有必要吗?

很多前端开发者经常会在 JavaScript 代码中使用 jQuery 的 $(document).ready() 函数,以确保 DOM 已经加载完毕再执行他们的代码。这是一个非常好的实践,但并不是所有的情况都需要将代码包装在 $(document).ready() 函数中。在本文中,我们将探讨在哪些情况下需要使用 $(document).ready() 函数,并提供一些示例代码。

DOM 加载的时机

当浏览器读取 HTML 页面时,它会从头到尾逐行解析文档,并构建 DOM 树。当遇到外部脚本(<script>)标签时,它会停止解析 HTML,并执行 JavaScript 代码。如果 JavaScript 代码操作了未被解析的 HTML,那么代码就会失败。为了避免这种情况,可以使用 $(document).ready() 函数。该函数会在整个 DOM 都加载完成后才运行代码。

以下是一个简单的例子:

--------- -----
------
------
    ----------------------
-------
------

--------- -----------

------- -----------------------------------------------------------
--------
    ---------------------------- -
        ---------------- -- ---------
    ---
---------

-------
-------

在上面的代码中,console.log() 只会在 DOM 完全加载完成后才会运行。如果我们没有使用 $(document).ready() 函数,那么代码可能会尝试在 DOM 加载之前执行,从而导致错误。

不需要使用 document.ready 的情况

虽然 $(document).ready() 是一个非常好的实践,但并不是所有的情况都需要将代码包装在其中。以下是一些情况:

1. 在页面底部引入脚本

在这种情况下,浏览器已经解析了整个文档,并且所有的 DOM 元素都已经加载和准备就绪。因此,在这种情况下,我们不需要使用 $(document).ready() 函数。

--------- -----
------
------
    ----------------------
-------
------

--------- -----------

------- -----------------------------------------------------------
------- ---------------------------

-------
-------

2. 使用 defer 或 async 属性

使用 deferasync 属性可以确保脚本的执行不会阻塞页面的加载。defer 属性表示脚本的执行会延迟到 DOM 解析完成之后,而 async 属性表示脚本的执行不会阻塞页面的解析,但是它也不能保证 DOM 已经完全加载完成。

--------- -----
------
------
    ----------------------
    ------- ----- ---------------------------
-------
------

--------- -----------

-------
-------

3. 使用 ES6 模块

如果你使用的是 ES6 模块,那么你可以将代码包装在 import 语句中。ES6 模块会等待所有依赖项都加载完成后再执行代码。

--------- -----
------
------
    ----------------------
    ------- --------------
        ------ - ---------- - ---- ----------------
        
        -------------
    ---------
-------
------

--------- -----------

-------
-------

结论

虽然 $(document).ready() 是一个非常好的实践,但并不是所有的情况都需要将代码包装在其中。在页面底部引入脚本、使用 defer 或 async 属性、使用 ES6 模块等情况下,

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/28149