Что именно обновляется при манипулировании DOM

Я пытаюсь понять, что именно обновляется в обычном DOM после манипуляции с DOM.

Предположим, у нас есть DOM ниже, и я использую javascript для удаления li с классом blue.

Означает ли это, что браузер смотрит на родительский элемент синего класса (например, идентификатор списка 1) и повторно отображает этот узел DOM, включая всех дочерних элементов (за исключением синего класса), а затем перерисовывает всю страницу на основе любых правил css?

Я бы подумал, что это будет процесс, но я не был уверен и нигде не могу найти никаких конкретных примеров.

 <div>
   <ul id = "list1">
     <li> red </li>
     <li class = "blue"> blue </li>
     <li> green </li>
    </ul>
    <ul id = "list2">
      <li> orange </li>
      <li> gray </li>
      <li> brown </li>
    </ul>
 </div>

Это именно то, что должен делать браузер.

Terry Wei 11.06.2018 03:55
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
5
1
141
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Да, потому что это единственный способ удалить элемент ... через его родительский элемент, то есть .removeChild(). Тогда DOM может или не может подвергнуться так называемой Reflow, в зависимости от того, какие изменения в результате произойдут.

DOM не обязательно подвергается перекомпоновке. Если в конце манипуляции с DOM никаких изменений не произошло (например, из-за того, что вы выполнили child.remove(); parent.append(child);, и если вы не вызвали один из методов / свойств триггеров перекомпоновки, то перекомпоновки происходить не должно.

Kaiido 11.06.2018 07:14
Ответ принят как подходящий

Это не так просто, потому что вы, вероятно, не совсем понимаете, как работает Обновление DOM + процесс рендеринга.

DOM - это просто объект javascript, как и любой другой.

Когда вы выполняете манипуляции с DOM, это действительно похоже на то, как если бы вы изменили свойства простого объекта (сложный, но все же).

Некоторые из этих манипуляций действительно могут испортить макет страницы и визуализированный фрейм, но в целом браузеры будут ждать, пока им действительно придется выполнить операцию перерисовки, прежде чем запускать оба этих алгоритма. Это означает, что эти алгоритмы не будут запускаться при каждой отдельной манипуляции с DOM.

Итак, чтобы ответить на вопрос, при манипулировании DOM вы изменяете свойства объекта js и, возможно, устанавливаете флаг, позволяющий узнать как пересчет макета, так и средство визуализации, которое им придется задействовать при следующем обновлении экрана.

Когда эти пересчет макета (a.k.a оплавление) и операции перерисовки на самом деле срабатывают, это не связано никакими спецификациями, и это то самое место, которое большинство браузеров попытается оптимизировать, и, следовательно, трудно сказать однозначно, как они работают повсюду. (Хотя указано, что перекомпоновка в некоторых случаях должна выполняться синхронно) .
Но мы можем предположить, что если ничего не изменилось, это, по крайней мере, будет сокращено.

Например, если в вашем примере #list1 имеет CSS-свойство display, установленное на none, то перерисовывать будет нечего, то же самое, если вы повторно добавили элемент .blue синхронно.

Проще говоря,

// js execution
DOM manip => mark layout as dirty
DOM manip => mark layout as dirty
... there may be a lot here

// Before screen refresh
if (layout.isDirty()) 
  layout.recalc() // will itself mark repaint as dirty if needed
if (renderer.isDirty())
  rendered.repaint()

Другие вопросы по теме