gpt4 book ai didi

javascript - JavaScript 中的什么机制导致 DOM 或 CSSStyleDeclaration 的变化触发页面重绘?

转载 作者:行者123 更新时间:2023-11-30 06:33:00 25 4
gpt4 key购买 nike

我认为我们只是想当然地认为,每当我们更改 DOM 元素的属性或其 CSSStyleDeclation 对象的属性时,页面都会重绘:

http://jsfiddle.net/peqtL/

document.getElementById("foo").innerHTML = "bar";
document.getElementById("foo").style.padding = "30px";

但仔细想想,.style返回 CSSStyleDeclaration对象,和 padding返回一个属性。现在我们只需设置一个属性,它如何触发并导致页面看起来不同?

我在想,这会不会是经典的“Observer Pattern”,其中页面渲染器向每个 DOM 元素和 CSSStyleDeclaration 注册对象,每当属性更改时,通知渲染器重绘页面的一部分?

或者,即使我们更改某些内容,整个页面也会受到影响,这不是真的吗:例如,z-index会影响自己和所有 sibling 的“掩饰”顺序,所以我们需要重新绘制父节点并向下树,或者如果元素有 position: relative 怎么办?或 position: absolute , 它可以影响页面上的任何元素,因此需要重绘整个页面。所以换句话说,渲染器可能不需要注册每个 DOM 元素及其 CSSStyleDeclaration。目的。渲染器只需要注册顶级 DOM 对象(document<html> 标记元素,即 document.documentElement 并且一个简单的实现是,对其属性或其后代属性的任何更改,然后通知渲染器重绘整个页面。只要我们简单地获取属性的值,就不需要通知渲染器重绘页面。

而且这种“观察者模式”是 DOM 和 JavaScript 引擎内部的——也就是说,我们无法真正接触或知道它是如何在底层完成的?

我知道实现应该是隐藏的,HTML 和 JavaScript 的用户不知道,但从编程的 Angular 来看,我希望知道什么是实现它的实用方法,作为软件系统。

最佳答案

实现此模式的一个好方法是使用 css 类。您应该避免修改每个 HTML 元素的 DOM 特性。修改 HTML 元素集的视觉方面或添加新类。在下面你可以看到一个简单的例子:

    //html
First name: <input type="text" id="fmame" class="mandatory">
Last name: <input type="text" id="lname" class="mandatory" value="Blablabla">

//javascript
var inputs = $("input");
for (var i = 0, j = inputs.length; i < j; i++) {
if (inputs[i].className === 'mandatory' && inputs[i].value === '')
inputs[i].className += ' error';
}

//css
.error {
background-color: red;
}

关于javascript - JavaScript 中的什么机制导致 DOM 或 CSSStyleDeclaration 的变化触发页面重绘?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16374053/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com