- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
使用JavaScript访问DOM元素的速度很慢,因此为了使页面更具响应性,我们必须执行以下操作
缓存对已访问元素的引用
更新节点“离线”,然后将其添加到树中
避免使用JavaScript修复布局
谁能告诉我前两件事该怎么做?
谢谢
最佳答案
这些是一些抽象的问题,甚至不一定彼此相关。
1.缓存对已访问元素的引用
缓存引用是一种实践,有时是必要的。在本地(或um,全局)维护对元素的引用的操作非常简单。使用document.createElement()
之类的DOM方法时,通常会有一个变量保存到该变量中。这是一个参考,可以缓存以备后用。 document.getElementById
返回对元素的引用,document.getElementsByTagName
返回引用列表,document.querySelectorAll
等也是如此。
2.更新节点“离线”,然后将其添加到树中
当您说“离线”时,我不太确定您所引用的上下文。这是在将任何元素(包括像<div>
这样的字符串)添加到DOM之前吗?
与元素进行交互的三种主要方式:document.createElement
(带有elem.appendChild
)
在一段遥远的过去,有一天,这是浏览页面内容的必要方式。它吸引了“ Web开发人员”社区的一个子集,该社区对采用类似于API的编程方式来处理和处理DOM及其居民感到满意。它几乎看起来像真实的代码,很难的东西。
当然,其中一些代码有些混乱,并且反复创建,附加和附加到那些代码上,并且对于那些不需要诞生它的人来说,这些代码看起来很酷。
如果您精通cloneNode
,则使用DOM节点可以获得更合理的结果。但是我认为直到最近几年,cloneNode
并不是一个很好的选择。我可能会忘记这一点,对货物狂热和所有。如我错了请纠正我。
然后IE来了,给了我们...elem.innerHTML
惊喜!这是不标准的,伙计。他们怎么能唯一的问题是,它真的很快。 Killer-fast(就像IE6 / 7一样,也从未发生过,我们都想忘记)。
DOM是...无论如何,浏览器速度慢且效率低下,而且无论如何都没有真正运行真实的代码,因此可以容忍DOM的慢度。但是随后,无论出于何种原因,innerHTML
进入左阶段,而且老兄,这比DOM方法要快。优雅,“我喜欢整天盯着标记而不是DOM方法”。
最终,每个人都加入了.innerHTML
潮流,这已成为事实上的标准。快速,对吗?
好。依靠。是的,做elem.innerHTML = "<p>Hey!</p>"
很快。 elem.innerHTML = '<p>Hey!</p><p>Yo!</p><p>What!</p>'
也是如此。因此,人们自然而然地认为,这是一项财产,让我们变得傻笑,
for 1..500 element.innerHTML += '<p>Medusa!</p>';
+=
对我们冲刺的朋友
innerHTML
就像k石。疯狂的坏主意,永不做,甚至不考虑这个坏主意。为什么? AFAIK,它与
.innerHTML
攻击内部内容的方式有关,因此,当您
elem.innerHTML += '...mayhem...'
时,您每次都会“破坏” DOM。或者其他的东西。这使DOM哭泣。
documentFragment
documentFragment
使场景崩溃。 MDN的
brief note对此进行了总结。它是与主DOM分开的
Node
。就像在一个小盒子中一样,在将其移动到爸爸DOM之前,将它们放进去。
.innerHTML
,并且都是DOM程序和东西。好漂亮
window.addEventListener('load', function () {
var target = document.getElementById('target'),
source = document.getElementById('source'),
...
source.addEventListener('click', function () {
var words = source.getElementsByTagName('span'),
total = words.length,
word;
while (word = words[--total]) {
target.appendChild(word);
}
});
});
target
和
source
保留在
click
处理程序的作用域之外,以便以后访问它们时,它们已经存在。由于在
words
之前不将
source
添加到
window.onload
,所以直到
span
出现之前,我不会将所有
words
元素与
target
一起移动到
source.click
。
documentFragment
。而且他们很酷。我只是最近才遇到他们,尽管显然对于那些知道他们似乎已经呆了两年或更长时间的人来说。因此,如果您是其中的
must.use.dom.methods(now)
之一,请在插入非片段DOM之前使用
documentFragment
。
elemn.innerHTML
,因为要添加标记。也许您有模板,AJAX响应标记等。
+=
时不要
elem.innerHTML
。
关于javascript - 最小化DOM访问以使页面更具响应性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14291811/
我在 Mac OsX 10.11 上使用 Xcode 7.0.1 (7A1001) 我使用 carthage 0.9.2 通过以下购物车文件下载reactivecocoa github“Reactiv
我正在将一个对象从属性“模型”(我从 Laravel 中的 Blade 属性模型中获得)分配给数据属性模型。后来数据属性模型发生变化,因为它绑定(bind)到表单输入字段。但 Prop “模型”也发生
当我更新数组内对象的属性然后作为组件的 Prop 传递时,在 svelte 中触发 react 性的正确方法是什么? let items = [{ id: 1, name: 'first'
我是 DRY principle 的坚定拥护者: Every piece of knowledge must have a single, unambiguous, authoritative rep
我正在实现一个需要以下功能的线程: 及时响应终止请求 推送消息 在等待消息时保持对 SendMessage 请求的响应 我对消息泵的初始实现使用了 GetMessage,如下所示: while not
在我的应用程序中,用户获得了一份已到达她的文档列表,并且可以对每个文档执行操作。 文件是分批提交的,当这种情况发生时,列表会增加。这一切都很好,这是预期的行为,但最好有一个按钮“暂停实时数据”,它会忽
我有一个属性为 的数据对象 displaySubtotal 我可以通过以下方式更新该属性的值: data.displaySubtotal = numPad.valueAsAString(); 我的方法
我需要一个垂直 slider 输入。由于内置的 sliderInput 函数无法做到这一点,因此我选择自己实现。根据this thread可以 (I) 使用 CSS 旋转 sliderInput
我正在从自定义用户权限管理系统迁移到 Alanning:roles v2.0 .我有一个非常基本的结构: 基本用户 用户组,每个用户组都有特定的设置。我将它们存储在一个“组”集合中。 管理群组的用户的
Shiny 中的响应式(Reactive)表达式将更改传播到需要去的地方。我们可以使用 isolate 来抑制一些这种行为。 ,但是我们可以抑制基于我们自己的逻辑表达式传播的更改吗? 我给出的例子是一
是否有(或可能有) react 性 Parsec (或任何其他纯函数式解析器)在 Haskell 中? 简而言之,我想逐个字符地为解析器提供数据,并获得与我提供的足够多的结果一样多的结果。 或者更简单
HTML(JADE) p#result Lorem ipsum is javascript j s lo 1 2 4 this meteor thismeteor. meteor input.sear
我有一个被导入函数更改的对象。 https://svelte.dev/repl/e934087af1dc4a25a1ee52cf3fd3bbea?version=3.12.1 我想知道如何使我的更改反
我有一个YUV 420半平面格式的图像,其中字节以这种方式存储: [Y1 Y2 ... [U1 V1.... Yk Yk+1...] Uk' Uk'+1] 其中Y平面的大小是UV平面的两倍,并
如何使用 ReactiveCocoa 订阅从 NSMutableDictionary 添加和删除的对象?另外,我想在它发生变化时广播通知。我的猜测是可以使用 RACMulticastConnectio
我正在构建一个带有多个选项卡的应用程序,其中一些选项卡涉及过多的计算,而另一些选项卡的计算速度很快。一个允许用户在 react 性或手动更新之间进行选择的复选框,与“刷新”按钮结合使用,将是理想的选择
我知道您可以在获取集合时使用 reactive: false 关闭 react 性。如何在内容可编辑区域内的集合字段中实现相同的效果?示例: Template.documentPage.events(
我想在 z3 中表示一个哈希函数,比如 SHA(x)。在做了一些研究之后,似乎 z3 不能很好地支持注入(inject)性,所以我不能有像这样的约束(虽然我意识到这并不是严格意义上的碰撞,但作为一种启
我正在解决一个问题,我想在仪表板中将数据显示为图表(通过 perak:c3 )和表格(通过 aslagle:reactive-table )。我的问题是数据是从 MongoDB 中的集合中提取的,它的
我的 ViewModel 中有这个函数,它返回一个信号,但内部 block 不起作用,我尝试添加断点,但它没有中断。这是我的代码。 func executeLoginAPI() -> RACSigna
我是一名优秀的程序员,十分优秀!