Javascript: изменение innerHTML vs display
Я разрабатываю веб-форму, где я хочу, чтобы различные входные данные появлялись в зависимости от того, что пользователь ранее выбрал. Поэтому мне было интересно, в чем разница между наличием пустого div и изменением того, что он содержит с помощью innerHTML, и наличием нескольких элементов div, установкой отображения на none и изменением того, что должно отображаться в зависимости от ввода пользователя.
Спасибо!
5 ответов:
Почти всегда гораздо эффективнее скрывать и показывать элементы по мере необходимости, а не создавать их и затем уничтожать.
Это связано главным образом с тем, что добавление узлов в документ является вычислительно дорогостоящей операцией, хотя
innerHTML
сильно оптимизировано. Во-вторых, это потому, что уничтожение элементов также означает, что вы уничтожаете любые обработчики событий, хранящиеся на этих элементах, что означает, что вы должны повторно связать их, что, естественно, занимает время и не нужно код.Еще одно преимущество заключается в том, что Javascript не будет работать, если пользователь отключил его или использует браузер, который его не поддерживает, например, средство чтения с экрана. Если все ваши элементы присутствуют в исходном HTML, то страница, по крайней мере, будет иметь некоторый смысл для этих пользователей.
Как правило, вы должны касаться innerHTML как можно меньше, а не работать с командами javascript, такими как createElement и appendChild.
Многие манипуляции innerHTML в javascript рассматриваются как своего рода анти-паттерн.
Тем не менее, если у вас есть одна форма или 2-3 формы, вы идете вперед и делаете то, что работает для вас. То есть то, что вы видите как более легкий для понимания и более доступный для обслуживания код.В этих масштабах я сомневаюсь, что кто-нибудь заметит производительность выигрыш / дефект при использовании любого из этих подходов. Лично я бы, наверное, поставил дисплей на ноль.
Если у вас готов div, просто измените дисплей:
- код проще
- у вас есть только одно место хранения для вашего контента (divs)
- dom не должен быть пересчитан двигателем
Это стандартное решение при работе, например, с вкладками.
Если вы измените элементы с помощью
innerHTML
, то при отправке формы будут отправлены только те входные данные, которые показаны.Скрывая элементы с помощью
display
, они все еще присутствуют в форме и все еще будут представлены.
Это будет быстрее, если вы выбираете divs по классам и идентификаторам и включаете и выключаете их. Однако я бы просто использовал innerHTML, если его просто простой текст, потому что вы не заметите разницу в скорости. Если нет причины иметь разные дивы, то есть выборки имеют резко различное содержание, то есть, возможно, график против текста против таблицы, то я бы сделал разные дивы.
Короче говоря, они оба делают одно и то же.