【问题标题】:Concurrent DOM node modification in Chrome?Chrome中的并发DOM节点修改?
【发布时间】:2012-06-13 20:09:56
【问题描述】:

我正在尝试以递归方式将 CSSStyleDeclaration 对象重新应用到文档的 innerHTML 中的每个节点。例如,如果您在此页面上调用 window.getComputedStyle(document.getElementsByTagName("a")[0]),则返回的散列中有大约 650 个不同的属性。假设我的文档的 innerHTML 中有 1000 个节点。当我遍历 innerHTML 并在每个 CSSStyleDeclaration 哈希中应用样式时,即对 node.style.setProperty(key, value) 进行了 650,000 次调用。但是,通过循环迭代,我正在逐个处理每个节点。相反,一次对 DOM 进行 1000 次调用而不是执行此循环会更有效率。问题是,如果这在 Chrome 中是可能的,我不知道怎么做。

我怀疑 Chrome 在整个 DOM 上都有一个 GIL(因为没有更好的词),但这可能只是迷信。如果不是这样,我会假设锁在节点级别。但同样,完全的迷信。我在这个没有事实的环境中运作。如果您有任何指点,我将不胜感激。

【问题讨论】:

  • 你能做类似node.style = firstLinkStyle;的事情吗?不确定这是否有效。

标签: javascript css dom google-chrome dom-node


【解决方案1】:

首先,DOM 被指定为不是线程安全的,因此您几乎不可能同时应用这些属性。此外,javascript 不是并行的,因此要并行执行这些任务,您必须使用 WebWorker,它不能按原样访问 DOM,唉,不是线程安全的。

其次,您为什么不在文档中创建一个样式表,然后使用insertRule 附加一个新的、动态创建的规则,让浏览器的渲染引擎为您完成工作?

【讨论】:

  • 因为对于这个应用程序,我必须严格控制级联,并且 insertRule 出现在我理解的 Computed Values 步骤之前。来自 DOM Level 2 CSS 规范:insertRuleUsed to insert a new rule into the style sheet. The new rule now becomes part of the cascade.
  • 根据您的用例,!important 标志可能会很有用:)
猜你喜欢
  • 2011-12-22
  • 2012-02-07
  • 2019-03-16
  • 2018-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-31
  • 1970-01-01
相关资源
最近更新 更多