Есть ли способ заменить только внутренний текст всех элементов на странице?

Фон

На основе сегодняшнего XKCD я создал следующий скрипт:

javascript:var a=document.getElementsByTagName('body')[0].innerHTML;a=a.replace(/Program(\w\w+)*/gmi,'curse').replace(/language/gmi,'word');

Если вы переходите на сайт (например, http://en.wikipedia.org/wiki/Programming_language ) и вставьте приведенный выше код (повторно добавив javascript:, если требуется), это заменит регулярное выражение в содержимом документа, сохраняя при этом большую часть форматирования, создавая забавное чтение.

Однако это влияет на внешний вид сайта; предположительно, потому что я заменяю innerHTML, а не только innerText (наверное, хотя и не уверен).

Я не могу просто заменить innerText, так как все элементы включают в себя внутренний текст своего дочернего элемента; выполнение этого для элемента body удалит все форматирование, а выполнение этого для каждого элемента приведет к дублированию огромного количества контента.

Вопрос

Есть ли способ перебирать все узлы в HTML-документе с помощью (минимального) javascript, заменяя слова в их непосредственных дочерних текстовых значениях, сохраняя при этом их оставшееся содержимое?


person JohnLBevan    schedule 12.02.2015    source источник
comment
Я признаю, что это просто для удовольствия; несерьезный рабочий вопрос, но интригующий и хороший шанс изучить/улучшить мой javascript. Заранее спасибо за любые мысли.   -  person JohnLBevan    schedule 13.02.2015
comment
Да есть способ. Что вы хотите сделать, так это перебрать только текстовые узлы.   -  person zzzzBov    schedule 13.02.2015


Ответы (1)


Ваш Javascript вообще не меняет страницу. Он считывает содержимое тела в строку, а затем изменяет строку. Это не влияет на содержание.

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

Если вы хотите изменить страницу, вы должны вернуть строку в качестве содержимого в тело, а затем использовать void(0); в качестве последнего оператора, чтобы предотвратить создание новой страницы:

javascript:var a=document.getElementsByTagName('body')[0].innerHTML;a=a.replace(/Program(\w\w+)*/gmi,'curse').replace(/language/gmi,'word');document.getElementsByTagName('body')[0].innerHTML=a;void(0);
person Guffa    schedule 12.02.2015