dom 里面也用到了观察者模式?

2019-04-03 22:23:39 +08:00
 NonClockworkChen
比如 html 里面写一个 input 标签,value 是‘ 1 ’
然后用 getElementsByTagName('input')[0]拿到 input 之后,修改 input 的 value 为‘ 2 ’。
那么浏览器就渲染 input 为 2.

这个过程是观察者模式吗
1704 次点击
所在节点    问与答
11 条回复
noe132
2019-04-04 02:15:44 +08:00
你可以这么理解。+(只不过具体实现复杂很多。
geelaw
2019-04-04 06:27:43 +08:00
一个过程并不是一个模式,只能说它的实现是不是用了某个模式。几乎所有现代的事件系统都是观察者模式实现的——这是一个很自然的模式(我甚至之前都不知道这还有个名字)。你可以认为 set_input 通知了浏览器的渲染引擎自己的变化。
Mutoo
2019-04-04 06:27:44 +08:00
这种地方通常不会用到观察者模式,一般作法是脏检测。value 改变的时候,将该元素及所有祖先标记为脏,一帧过后,将所有标记为脏的结点全部重绘。
qping
2019-04-04 09:08:53 +08:00
@Mutoo #3 所有祖先也需要标记吗
karllynn
2019-04-04 10:42:02 +08:00
这个要看浏览器是怎么实现的…

你不要把一种现象和一种设计模式直接关联起来…这有无数种可能
Mutoo
2019-04-04 10:53:57 +08:00
@qping 纠正一下,应该是用脏矩形,将相交的元素标记为待更新。细节可以参阅一下《 Webkit 技术内幕》一书。
NonClockworkChen
2019-04-04 10:57:02 +08:00
@Mutoo 谢谢,之前朋友圈里还有人专门花 2 倍钱,买了这本书的二手。
qping
2019-04-04 11:03:01 +08:00
@Mutoo #6 谢谢~
qping
2019-04-04 11:04:43 +08:00
@Mutoo 这书真是贵啊 还没货
lizhuoli
2019-04-04 20:41:35 +08:00
@Mutoo 其实这就是观察者模式的标准实现,通过更改的地方触发一个标记或者通知……
Mutoo
2019-04-04 20:47:09 +08:00
@lizhuoli 观察者模式的实现是订阅 /发布,或者说推送( push ),而这个是轮询( pull )怎么能一样。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/551837

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX