2011-01-21 3 views
3

У меня есть этот кусок HTML кода:Как предотвратить замену с помощью нескольких текстовых узлов?

<p><span>h</span><span>o</span><span>l</span><span>a</span></p> 

И я использую JQuery на нем, чтобы заменить все пролеты:

$('p span').each(function(){ 
    $(this).replaceWith($(this).text());  
}); 

Когда я смотрю в моем DOM я вижу сценарий, созданный 4 текстовых узла, для каждой буквы один. Как я могу предотвратить это? Я хочу только текстовый узел!

Примечание: данный пример очень упрощен. Я на самом деле делать это на:

<p>This is an <b>example</b>: <span>h</span><span>o</span><span>l</span><span>a</span>!</p> 

Это должно выглядеть следующим образом:

<p>{text}This is an {/text}<b>{text}example{/text}</b>{text}: hola!{/text}</p> 

{текст} является DOM-текстовый узел :-)

+0

Изменил ли HTML вариант? –

+0

Вы имеете в виду p.html (p.html())? Было бы очень тяжело. –

ответ

2

Одна вещь, которую вы могли бы сделать, это в конце концов, вызвать родной normalize() метод:

$('p').find('span').each(function(){ 
    $(this).replaceWith($(this).text());  
}).end()[0].normalize(); 

EDIT: Я был ранее с помощью parent()(docs) пройти вверх от элементов <span>, но они были удалены из DOM, поэтому у них больше не было родителя.

Вместо этого я сначала выбираю <p>, затем find()(docs)<span> элементов. Таким образом, я могу использовать end()(docs), чтобы вернуться к <p> и позвонить .normalize().

Если есть несколько элементов <p>, вы хотите сделать еще один цикл.

$('p').find('span').each(function(){ 
    $(this).replaceWith($(this).text());  
}).end().each(function() { 
    this.normalize(); 
}); 

Вы также можете передать функцию в качестве параметра replaceWith()(docs), который возвращает текст каждого элемента.

$('p').find('span').replaceWith(function(i,el){ 
    return $.text([this]); 
}).end().each(function() { 
    this.normalize(); 
}); 
+0

Кажется не работает в хроме –

+0

@Kees: Вы правы. Расследование ... – user113716

+0

@ Kees: У меня это есть. Вызов '.parent()' неверен, потому что элементы '' были заменены и больше не имеют родителя. Обновление ... – user113716

1

Возможно, вы действительно хотите этого?

$('p').text(function (i, txt) { 
    return txt; 
}); 

В действии: http://jsfiddle.net/2qNGY/

+0

+1 Мне нравится это, хотя я бы, вероятно, передал функцию вместо '$ ('p'). Text (function (i, txt) {return txt;});' – user113716

+0

Я бы потерял другой html, присутствующий в P ... так что это не сработает, я думаю ... и .html (html()) будет очень очень тяжелым –

+0

@patrick, woops. Хороший улов! Спасибо за это. –