Я делаю букмарклет, который заменяет все буквы, например «R», на другие буквы, например «W», или, возможно, заменяет целые слова. Я пробовал использовать следующий код, но он портит сайт и показывает элементы в элементе.

javascript: $("body").text($("body").text().replace("r", "w"));

Будет ли решение для этого?

Для тех из вас, кто интересуется, для чего я бы это использовал, я пытаюсь создать код, который бы изменил это:

Здравствуйте, меня зовут Джонатан Грассвелл, и я хотел бы предложить новую идею для трактора.

В это:

Hewwo, мое имя - Jonnyathyan Gwyassweww, и я хотел бы создать новую идею для себя.

В основном, "OWOfier". Кроме того, можно ли вставить случайный смайлик через 20% времени после периода?

1
user12156952 29 Окт 2019 в 03:36

2 ответа

Лучший ответ

ТЕЛО, если полно HTML. Ваша проблема прямо здесь $("body").text($, поскольку в .text( вы говорите: "Сделать тело таким:" , теряя всю разметку.
Вместо этого вам следует перебирать каждый NodeType, который является 3 (Node.TEXT_NODE) или, скорее, используя API TreeWalker

const body = document.body; // Or whatever more specific element you desire
const repl = { // Your replacements:
  "l"   : "w",
  "L"   : "W",
  "r"   : "w",
  "R"   : "W",
  "\\." : ". :)" // Remember, escape RegExp special characters to treat them as literals
};

const treeWalker = document.createTreeWalker(body, NodeFilter.SHOW_TEXT);

while (treeWalker.nextNode()) {
  const Node = treeWalker.currentNode; // PS: Node.nodeType is always 3 
  Object.keys(repl).forEach(key => {
    Node.nodeValue = Node.nodeValue.replace(new RegExp(key, "g"), repl[key]);
  });
}
.hello, .ll {color: BURLYWOOD;} /* "l"s of "class" and "hello" will stay intact */
<h1 class="hello">Hello,</h1>
<p>
  my name is <b class="ll">Long Island</b>, 
  and I would like to propose a new idea. For a clock. LOL
</p>
0
Roko C. Buljan 4 Ноя 2019 в 01:41

Метод text() возвращает только текстовое содержимое тела.

Попробуйте эту функцию, запустите эту функцию под консолью этой страницы, нажав F12, эту функцию пока замените «Джонатан» на «ABCDEFGHIJKLMN».

function replaceTextOfElement(element) {
  $(element).contents()
    .filter((_, child) => child.tagName !== 'SCRIPT' && child.tagName !== 'STYLE' && child.tagName !== 'IFRAME')
    .each((_, child) => {
      if(child.nodeType === Node.TEXT_NODE) {
        child.data = child.data.replace('Jonathan', 'ABCDEFGHIJKLMN');
      } else {
        replaceTextOfElement(child);
      }
    });
}
replaceTextOfElement($('body'));
0
鸿则_ 29 Окт 2019 в 01:19