2010-11-19 5 views
1

Как создать код jQuery, который заменяет только текст в документе .HTML, а не теги html.jQuery - заменить функцию

Допустим, что я хочу заменить все символы «b» на «c» в html-коде. Тогда я не хочу, чтобы html-код был заменен.

<b>bbbbb</b> 

Я имею в виду, что при замене должно быть только:

<b>ccccc</b> 

Так что б в HTML код не будет заменен.

Спасибо заранее!

+2

Вы читали (обязательно) предупреждение [против регулярных выражений разбора HTML] (http://stackoverflow.com/questions/1732348/ регулярное выражение-матч-открытого-теги-кроме-Xhtml-самодостаточный-теги/1732454 # 1732454)? –

ответ

0

Если вы используете селектор и принимаете как все дети, он должен работать ... Я действительно не знаю jquery, но я думаю, что вы просто используете его неправильно ... Это не нормально, что он меняет теги. . Использование иерархии DOM это главный инструмент Javascript ...

0

Если вы хотите заменить текст тегов в HTML документе, и у вас есть JQuery, не бежать через весь документ и заменить, используйте великолепные функции jQuery для захвата текста и innerHTML из элементов.

Например, чтобы заменить текст всех <b> тегов на текущей странице вы могли бы сделать что-то вроде этого:

$("b").text("Text that will replace current text"); 
+0

Но, предполагая, что он хочет изменить все экземпляры конкретной последовательности, которую он должен будет перебирать через * каждый * DOM-node/tag. –

+0

@David хороший пункт. – Alex

1

Попробуйте это: (заменяющий a с z везде внутри элемента с id="main")

$('#main, #main *').contents().each(function() { 
    if (this.nodeType == 3) 
     this.nodeValue = this.nodeValue.replace(/a/g, 'z'); 
}); 

Вы можете изменить первый бит на $('*'), но это опасно и, вероятно, медленно, и на this test вы можете увидеть, что он меняет s tuff в <style>, который генерируется jsfiddle (поэтому он, вероятно, сделает замену внутри всех <script> s тоже).

Обратите внимание, что вещь nodeType == 3 сообщает jQuery о возврате только текстовых элементов. Вы должны использовать 3 вместо константы Node.TEXT_NODE, потому что IE 7 не распознает его. (Сюрприз сюрприз ..)

отредактирован, чтобы отразить предложения idealmachine «s

+0

Я бы объединил часть '.filter' в функцию, переданную' .each', используя оператор if. Это должно быть немного быстрее, потому что тогда вы не будете повторяться над каждым текстовым узлом дважды. – PleaseStand

+0

Другая вещь, которую нужно изменить: '$ (this) .replaceWith ($ (this) .text(). Replace (/ a/g, 'z'));' to' this.nodeValue = this.nodeValue.replace (/ a/g, 'z'); '. Это позволяет избежать возможных проблем, если текст содержит допустимые, но экранированные HTML-теги. – PleaseStand

Смежные вопросы