Подтвердить что ты не робот

JQuery найти и заменить строку

У меня есть где-то на сайте определенный текст, пусть говорят "lollypops", и я хочу заменить все вхождения этой строки на "marshmellows". Проблема в том, что я не знаю, где именно текст. Я знаю, что могу сделать что-то вроде:

$(body).html($(body).html().replace('lollypops', 'marshmellows'));

Это, вероятно, сработает, но мне нужно переписать как можно меньше HTML, поэтому я думаю о чем-то вроде:

  • поиск строки
  • найдите ближайший родительский элемент
  • переписать только ближайший родительский элемент
  • замените это даже на атрибуты, но не на всех, например, замените его в class, но не в src

В качестве примера у меня была бы структура вроде этого

<body>
    <div>
        <div>
            <p>
               <h1>
                 <a>lollypops</a>
               </h1>
            </p>
            <span>lollypops</span>
        </div>
    </div>
    <p>
       <span class="lollypops">Hello, World!</span>
       <img src="/lollypops.jpg" alt="Cool image" />
    </p>
<body>

В этом примере каждое появление "lollypops" будет заменено, только <img src="... останется прежним, и единственными элементами, которые будут фактически манипулировать, будет <a> и оба <span> s.
Кто-нибудь знает, как это сделать?

4b9b3361

Ответ 1

Вы можете сделать что-то вроде этого:

$("span, p").each(function() {
    var text = $(this).text();
    text = text.replace("lollypops", "marshmellows");
    $(this).text(text);
});

Лучше отметить все теги текстом, который необходимо изучить с подходящим именем класса.

Кроме того, это может иметь проблемы с производительностью. jQuery или javascript вообще не подходят для такого рода операций. Вам лучше сделать это на стороне сервера.

Ответ 2

Вы могли бы сделать что-то таким образом:

$(document.body).find('*').each(function() {
    if($(this).hasClass('lollypops')){ //class replacing..many ways to do this :)
        $(this).removeClass('lollypops');
        $(this).addClass('marshmellows');
    }
    var tmp = $(this).children().remove(); //removing and saving children to a tmp obj
    var text = $(this).text(); //getting just current node text
    text = text.replace(/lollypops/g, "marshmellows"); //replacing every lollypops occurence with marshmellows
    $(this).text(text); //setting text
    $(this).append(tmp); //re-append 'foundlings'
});

example: http://jsfiddle.net/steweb/MhQZD/

Ответ 3

Ниже приведен код, который я использовал для замены текста, цветным текстом. Он прост, взял текст и заменил его в теге HTML. Он работает для каждого слова в теге класса.

$('.hightlight').each(function(){
    //highlight_words('going', this);
    var high = 'going';
    high = high.replace(/\W/g, '');
    var str = high.split(" ");
    var text = $(this).text();
    text = text.replace(str, "<span style='color: blue'>"+str+"</span>");
    $(this).html(text);
});

Ответ 4

Почему вы просто не добавляете класс в контейнер строк, а затем заменяете внутренний текст? Как и в этом примере.

HTML:

<div>
    <div>
        <p>
           <h1>
             <a class="swapText">lollipops</a>
           </h1>
        </p>
        <span class="swapText">lollipops</span>
    </div>
</div>
<p>
   <span class="lollipops">Hello, World!</span>
   <img src="/lollipops.jpg" alt="Cool image" />
</p>

JQuery

$(document).ready(function() {
    $('.swapText').text("marshmallows");
});