Замініть слова в основному тексті


93

Чи є спосіб замінити звичайний текст в елементі таблиці, який розміщений у тілі HTML?

Як заміна "привіт" на "привіт"?

Будь ласка, використовуйте лише JavaScript без jQuery .


Чи можете ви, будь ласка, бути більш конкретними? Що ви хочете замінити, де це в організмі тощо
Зірак

тіло має div і всередині цієї таблиці, то я хотів би замінити якийсь звичайний текст, а не код, як заміна ("привіт") на ("привіт")
Wahtever

3
більшість рішень, наведених нижче, знищать усі події та всю структуру dom, якщо слово, що замінюється, - це назва класу, назва тегу або що-небудь у html
Мухаммад Умер,

Схоже, і запитання, і відповіді помилкові. Він запитує, як замінити слова, а не символи. Такі як заміна цього hello, this is a text randomTexthelloмає бути hi, this is a text randomTexthello. Однак усі інші відповіді тут замінюють символи замість слів.
Orhun Alp Oral

Відповіді:


139

Щоб замінити рядок у вашому HTML іншим, використовуйте метод replace на innerHTML :

document.body.innerHTML = document.body.innerHTML.replace('hello', 'hi');

Зверніть увагу, що це замінить перший екземпляр у helloвсьому тілі, включаючи будь-які екземпляри у вашому HTML-коді (наприклад, назви класів тощо), тому використовуйте з обережністю - для кращих результатів спробуйте обмежити обсяг вашої заміни, націливши свій код за допомогою document.getElementById або подібний.

Щоб замінити всі екземпляри цільового рядка, використовуйте простий регулярний вираз із gлобальним прапором:

document.body.innerHTML = document.body.innerHTML.replace(/hello/g, 'hi');

1
не працював для мене ось що я використовував <script type="text/javascript"> window.onload = clear(); function clear() { document.body.innerHTML = document.body.replace('ü', 'n'); } </script>
Wahtever

Це може бути складніше із розширеними символами - в якому кодуванні знаходиться ваш документ? Ви впевнені, що персонаж ü, а не & # 252; наприклад..?
Декстер,

2
ви не точно скопіювали мій код ;-) переконайтеся, що у вас є InternalHTML з обох сторін висловлення, тобто: document.body.innerHTML = document.body.innerHTML.replace ('ü', 'n');
Декстер,

3
FYI - Помилка у першому коментарі: встановлена window.onload = clear;без дужок "()". Коли ви пишете, clear()ви фактично виконуєте функцію, але ви хочете призначити функцію лише обробнику завантаження
Філіп

1
Зверніть увагу, що використання innerHTML сьогодні вважається поганим: slideshare.net/x00mario/the-innerhtml-apocalypse
kufudo

13

Функція нижче для мене ідеально працює:

// Note this *is* JQuery, see below for JS solution instead
function replaceText(selector, text, newText, flags) {
  var matcher = new RegExp(text, flags);
  $(selector).each(function () {
    var $this = $(this);
    if (!$this.children().length)
       $this.text($this.text().replace(matcher, newText));
  });
}

Ось приклад використання:

function replaceAllText() {
  replaceText('*', 'hello', 'hi', 'g');
}

$(document).ready(replaceAllText);
$('html').ajaxStop(replaceAllText);

Ви також можете використовувати пряму заміну, наприклад:

document.body.innerHTML = document.body.innerHTML.replace('hello', 'hi');

Але будьте обережні з цим, оскільки це також може впливати на теги, css та сценарії.

EDIT: Що стосується чистого рішення JavaScript, використовуйте замість цього метод:

function replaceText(selector, text, newText, flags) {
  var matcher = new RegExp(text, flags);
  var elems = document.querySelectorAll(selector), i;

  for (i = 0; i < elems.length; i++)
    if (!elems[i].childNodes.length)
      elems[i].innerHTML = elems[i].innerHTML.replace(matcher, newText);
}

Як можна було б замінити весь текст у певному тегу (наприклад, <p> або <span>) іншим текстом?
GJZ

Просто додайте імена тегів до першого вхідного параметра, наприклад replaceText ('p, span', 'hello', 'hi')
Ziad

Це працює неправильно. Поміркуйте над цим: <p> привіт <strong> світ </strong>, </p>. привіт не замінюється.
David Vielhuber,

Привіт, я новачок у кодуванні. Я можу зробити щось добре з AppleScript. Але це все, що я знаю. Чи можете ви дати мені кілька порад, з чого я почну, моя мета - використовувати javascript для автоматизації збору баз даних, зображень, відео, заповнення веб-форм, завантаження, можливо, для роботи з Excel. Applescript це нормально, але Java, здається, абсолютно новий рівень і набагато кращий. З чого мені почати, щоб досягти своїх цілей. Я знаю 0 про javascript, і навіть не знаю, як зробити так, щоб ваш сценарій працював вище! Куди я повинен приклеїти його? Дуже тобі вдячний!
Duy Duy,

10

Я отримав цю функцію для безпечної заміни тексту без побічних ефектів (поки що):

function replaceInText(element, pattern, replacement) {
    for (let node of element.childNodes) {
        switch (node.nodeType) {
            case Node.ELEMENT_NODE:
                replaceInText(node, pattern, replacement);
                break;
            case Node.TEXT_NODE:
                node.textContent = node.textContent.replace(pattern, replacement);
                break;
            case Node.DOCUMENT_NODE:
                replaceInText(node, pattern, replacement);
        }
    }
}

Це для випадків, коли 16 кБ findAndReplaceDOMTextтрохи занадто важкі.


Привіт, я новачок у кодуванні. Я можу зробити щось добре з AppleScript. Але це все, що я знаю. Чи можете ви дати мені кілька порад, з чого я почну, моя мета - використовувати javascript для автоматизації збору баз даних, зображень, відео, заповнення веб-форм, завантаження, можливо, для роботи з Excel. Applescript це нормально, але Java, здається, абсолютно новий рівень і набагато кращий. З чого мені почати, щоб досягти своїх цілей. Я знаю 0 про javascript, і навіть не знаю, як зробити так, щоб ваш сценарій працював вище! Куди я повинен приклеїти його? Дуже тобі вдячний!
Duy Duy,

Дуй Дуй, це багато проблем. Враховуючи лише опис завдання, це достатня причина для того, щоб кинути роботу.
funky-future

9

У мене була та сама проблема. Я написав власну функцію, використовуючи replace на innerHTML, але це перекрутить якірні посилання тощо.

Щоб він працював коректно, я використовував бібліотеку щоб це зробити.

Бібліотека має чудовий API. Після включення сценарію я назвав його так:

findAndReplaceDOMText(document.body, {
  find: 'texttofind',
  replace: 'texttoreplace'
  }
);

Це було єдине рішення, яке спрацювало для мого випуску. Мені потрібно було використовувати REGEX для пошуку та заміни телефонних номерів на всьому сайті, і інші відповіді тут порушили б мої події DOM.
DavyH

3

Я намагався замінити дійсно великий рядок, і з якоїсь причини регулярні вирази видавали деякі помилки / винятки.

Тож я знайшов цю альтернативу регулярним виразам, яка також працює досить швидко. Принаймні це було досить швидко для мене:

var search = "search string";
var replacement = "replacement string";

document.body.innerHTML = document.body.innerHTML.split(search).join(replacement)

src: Як замінити всі входження рядка в JavaScript?


2

Використовуйте функцію заміни рядка javascript за замовчуванням

var curInnerHTML = document.body.innerHTML;
curInnerHTML = curInnerHTML.replace("hello", "hi");
document.body.innerHTML = curInnerHTML;

1

Спробуйте застосувати вище запропоноване рішення на досить великому документі, замінивши досить короткі рядки, які можуть бути присутніми у innerHTML або навіть innerText, і ваш HTML-дизайн у кращому випадку стає непрацездатним

Тому я спочатку вибираю лише текстові елементи вузлів через вузли HTML DOM, як це

function textNodesUnder(node){
  var all = [];
  for (node=node.firstChild;node;node=node.nextSibling){
    if (node.nodeType==3) all.push(node);
    else all = all.concat(textNodesUnder(node));
  }
  return all;
}

textNodes=textNodesUnder(document.body)
for (i in textNodes) { textNodes[i].nodeValue = textNodes[i].nodeValue.replace(/hello/g, 'hi');    

`і в подальшому я застосував заміну на всіх циклах


1

Я хотів додати приклад до відповіді funky-future, оскільки я постійно отримував цю помилку:

Uncaught TypeError: element.childNodes is not iterable

використовувати так:

replaceInText(document.body,"search term","replacement");

у мене це не працювало з селекторами jQuery.


1
Якщо у вас є нове запитання, поставте його, натиснувши кнопку Задати питання . Додайте посилання на це запитання, якщо це допомагає надати контекст. - З огляду
SilverNak

1
Це не нове запитання, я розширював відповідь фанкі-майбутнє, надаючи приклад, який працює. довелося опублікувати нову відповідь bc Мені не вистачає представника, щоб прокоментувати його.
Y Stroli

0

Я новачок Javascriptі щойно почав вчитися цим навичкам. Будь ласка, перевірте, чи наведений нижче спосіб корисний для заміни тексту.

<script>

    var txt=document.getElementById("demo").innerHTML;
    var pos = txt.replace(/Hello/g, "hi")
    document.getElementById("demo").innerHTML = pos;

</script>

0

Іноді зміна document.body.innerHTMLламає деякі сценарії JS на сторінці. Ось версія, яка змінює лише зміст textелементів:

function replace(element, from, to) {
    if (element.childNodes.length) {
        element.childNodes.forEach(child => replace(child, from, to));
    } else {
        const cont = element.textContent;
        if (cont) element.textContent = cont.replace(from, to);
    }
};

replace(document.body, new RegExp("hello", "g"), "hi");
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.