Одновременная модификация узла DOM в Chrome?
Я пытаюсь рекурсивно повторно применить CSSStyleDeclaration
объекты для каждого узла в innerHTML моего документа. Например, если вы звоните window.getComputedStyle(document.getElementsByTagName("a")[0])
на этой странице есть около 650 различных свойств в возвращаемом хэше. Допустим, у меня было 1000 узлов в innerHTML моего документа. Как я перебираю innerHTML и применяю стили в каждом CSSStyleDeclaration
хэш, то есть 650 000 звонков node.style.setProperty(key, value)
, Однако, перебирая цикл, я делаю каждый узел один за другим. Вместо этого было бы гораздо эффективнее сделать 1000 вызовов DOM одновременно, вместо того, чтобы делать этот цикл. Дело в том, что если это возможно в Chrome, я не знаю как.
Я подозреваю, что Chrome имеет GIL (из-за отсутствия лучшего слова) для всего DOM, но это может быть просто суеверием. Если бы не это, я бы предположил, что блокировка находится на уровне узла. Но опять же, полное суеверие. Я работаю в безосновательной среде на этом. Если у вас есть какие-либо указатели, я был бы очень признателен.
1 ответ
Прежде всего, DOM указан как не ориентированный на многопотоковое исполнение, поэтому очень мало шансов, что вы сможете применять эти свойства одновременно. Кроме того, javascript не является параллельным, поэтому для выполнения этих задач параллельно вам придется использовать WebWorker, который не может получить доступ к DOM, поскольку он, увы, не является поточно-ориентированным.
Во-вторых, почему бы вам просто не создать таблицу стилей внутри документа и использовать insertRule, чтобы добавить новое, динамически созданное правило и позволить движку рендеринга браузера сделать работу за вас?