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.
Кто-нибудь знает, как это сделать?
Ответы
Ответ 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");
});