javascript - 通过 JavaScript 执行顺序操作 DOM

标签 javascript onready

我有以下代码,结果附在最后。据我了解,JQuery.ready 和 JQuery.Window 加载事件在创建 DOM 之后运行,因此它可以操作 DOM,但不是第一个更改 John 背景的函数。

我的问题是:

  1. John 的背景没有变成黄色是因为 JavaScript 本质上是向后引用的,在脚本运行时无法找到 id name1 的元素?

    <
  2. 如果我必须运行第一个函数来更改 John 的背景,该函数是否应该在 DIV 标记之后使用?

Blockquote

<script>
    (function () {
        $('#name1').css('background-color', 'yellow');
    })();

    $(function () {
        $('#name2').css('background-color', 'red');
    });

    $(window).load((function () {
        $('#name3').css('background-color', 'blue');
    }));
</script>

<div id="name1">John</div>
<div id="name2">Mary</div>
<div id="name3">Jacob</div>
<div id="name4">James</div>

<script>
    (function () {
        $('#name4').css('background-color', 'yellow');
    })();
</script>

Blockquote

enter image description here

最佳答案

浏览器从上到下读取 HTML。所以:

<script>

这会立即执行:(但由于还没有任何东西,所以不会有任何变化)。为了进一步解释,这些被称为立即执行函数 (IEF) ==> (function(){ ... })(); 但在这种情况下拥有它是没有意义的,因为代码将无论如何立即执行。

    (function () {
        $('#name1').css('background-color', 'yellow');
    })();

这实际上是 jQuery 中 $(document).ready(...); 的快捷方式; 它被认为不是一个好的做法,因为它不那么可读。

    $(function () {
        $('#name2').css('background-color', 'red');
    });

这个执行窗口加载(并不完全相同)。

    $(window).load((function () {
        $('#name3').css('background-color', 'blue');
    }));
</script>

<div id="name1">John</div>
<div id="name2">Mary</div>
<div id="name3">Jacob</div>
<div id="name4">James</div>

<script>

这也会立即执行(IEF):在这种情况下它会起作用,但这不是最佳实践。

    (function () {
        $('#name4').css('background-color', 'yellow');
    })();
</script>

如果您想了解 document.ready 和 window.load 之间的更多差异,请查看 this stackoverflow question

JavaScript 是一种事件驱动语言,优点是您可以根据需要向事件添加任意数量的监听器,因此向加载的 DOM 内容添加事件监听器几乎总是最好的方法。始终在最后加载脚本也是一种最佳实践,这样您可以让用户首先获取内容和样式,然后再启动功能。

我会如何编写你的代码:

<div id="name1">John</div>
<div id="name2">Mary</div>
<div id="name3">Jacob</div>
<div id="name4">James</div>

<script>
    document.addEventListener("DOMContentLoaded", function(event) {
        // DOM fully loaded and parsed
        $('#name1').css('background-color', 'yellow');
        $('#name2').css('background-color', 'red');
        $('#name3').css('background-color', 'blue');
        $('#name4').css('background-color', 'yellow');
    });
</script>

尽管我不会为此使用 jQuery :P。我什至不会为此使用 JavaScript,而只是使用旧的 CSS ;)

关于javascript - 通过 JavaScript 执行顺序操作 DOM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29723530/

相关文章:

javascript - 在javascript中,当第一个函数准备好时执行一个函数

javascript - 重复显示每条记录的唯一范围,angularjs

javascript - 如何更改 package.json 以获得最新版本的 axios?

javascript - FancyBox onload show 无法正常点击

jquery - 如何在没有JQuery的情况下模仿跨浏览器$(document).ready()行为

javascript - $(document).ready 到底保证了什么?

javascript - 检查 DOM 是否准备就绪是否过度?

javascript - google.load 自定义 js

javascript - 尝试在 NetSuite 中保存记录时何时使用 "enableSourcing"选项?

javascript - jQuery:如何检测页面将在刷新时返回的偏移量?