@doutaxe

Чем заменить document.body.innerHTML, чтобы страница оставалась интерактивной?

Использую код
<script type="text/javascript">
window.onload = function(){
...
document.body.innerHTML = document.body.innerHTML.replace(/test1/g, 'test2');
});
}
</script>


для замены во всем документе 'test1' на 'test2'. Строка 'test1' может встречаться в тегах a, div, script с различными классами и id. Проблема в том, что после выполнения замены перестают работать все js формы на странице. Прочитал, что это вроде как из-за того, что document.body.innerHTML стирает все DOM-события. А как тогда сделать замену, чтобы страницы оставалась интерактивной?
  • Вопрос задан
  • 1824 просмотра
Решения вопроса 1
@doutaxe Автор вопроса
Сам спросил, сам ответил. В итоге использую набор вот таких конструкций с перебором всех мест, где может встречаться искомая строка:
$("a[href]").each(function() { this.href = this.href.replace(/test1/, "test2"); });
$("img[src]").each(function() { this.src = this.src.replace(/test1/, "test2"); });
...
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Stalker_RED
@Stalker_RED
Не перезаписывать innerHTML, а перебрать нужные элементы, проверить есть ли у них такая строка, и если есть сделать замену для textContent.
Еще и быстрее получится.

document.querySelectorAll('a, div, script').forEach(el => {
  if (el.textContent.includes('test1'))
    el.textContent = el.textContent.replace(/test1/g, 'test2');
})

Стоит учитывать, что к моменту замены может оказаться так, что код из тегов script уже успел сработать со старыми значениями.

(и вообще, вы что-то странное делаете о_О)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы