2013-07-25 2 views
10

У меня есть что-то вроде этого.JQuery удаляет внутренний текст, но сохраняет html

<div id="firstDiv"> 
    This is some text 
    <span id="firstSpan">First span text</span> 
    <span id="secondSpan">Second span text</span> 
</div> 

Я хочу, чтобы удалить «Это некоторый текст» и нуждаются в HTML-элементы нетронутыми.

Я пытался использовать что-то вроде

$("#firstDiv") 
    .clone() //clone the element 
    .children() //select all the children 
    .remove() //remove all the children 
    .end() //again go back to selected element 
    .text(""); 

Но это не сработало.

Есть ли способ, чтобы получить (и, возможно, удалить, через что-то вроде .text("")) только свободный текст в теге, а не текст в его дочерних тегов?

Спасибо очень много.

+0

Ответ здесь: http://stackoverflow.com/a/4399718/2524304 – FSou1

+0

вместо .text(), можете попробовать .val ('')? –

+0

@Happycoder все еще не работает :( – Okky

ответ

2

проверить это fiddle

Предположим, у вас есть этот HTML

<parent> 
    <child>i want to keep the child</child> 
    Some text I want to remove 
    <child>i want to keep the child</child> 
    <child>i want to keep the child</child> 
</parent> 

Затем вы можете удалить внутренний текст родителя, как это :

var child = $('parent').children('child'); 
$('parent').html(child); 

Проверить это fiddle для решения вашей HTML

var child = $('#firstDiv').children('span'); 
$('#firstDiv').html(child); 

PS: Имейте в виду, что любые обработчики событий ограничены на что DIV будут потеряны, как удалить, а затем воссоздать элементы

+3

В то же время вы снова создаете все элементы, поэтому все данные, события обработчики и т. д. будут потеряны. – adeneo

+0

Да, это будет результат – MaVRoSCy

6

Отфильтровать текстовые узлы и удалить их:

$('#firstDiv').contents().filter(function() { 
    return this.nodeType===3; 
}).remove(); 

FIDDLE

Чтобы фильтровать на сам текст, вы можете сделать:

$('#firstDiv').contents().filter(function() { 
    return this.nodeType === 3 && this.nodeValue.trim() === 'This is some text'; 
}).remove(); 

и получить текст:

var txt = []; 

$('#firstDiv').contents().filter(function() { 
    if (this.nodeType === 3) txt.push(this.nodeValue); 
    return this.nodeType === 3; 
}).remove(); 
+0

Это может быть любое место в этом div – Okky

2

Зачем пытаться заставить JQuery сделать это, когда это проще с ванильным JS:

var div = document.getElementById('firstDiv'), 
    i, 
    el; 

for (i = 0; i< div.childNodes.length; i++) { 
    el = div.childNodes[i]; 
    if (el.nodeType === 3) { 
     div.removeChild(el); 
    } 
} 

Fiddle здесь: http://jsfiddle.net/YPKGQ/

+0

Я бы не сказал, что это проще (если вы посмотрите на решение '.filter' adeneo, это просто меньше кода для написания), но это определенно не очень сложно. –

+0

@FelixKling - Это очень верно. Но это намного проще, чем некоторые из выпущенных решений jQuery! – RobH

0

Проверьте это, не уверен, если это то, что вы хотите точно ... Примечание: я проверил его только в хроме

http://jsfiddle.net/LgyJ8/

cleartext($('#firstDiv')); 

function cleartext(node) { 

    var children = $(node).children(); 
    if(children.length > 0) { 

     var newhtml = ""; 
     children.each(function() { 

      cleartext($(this)); 

      newhtml += $('<div/>').append(this).html(); 

     }); 

     $(node).html(newhtml); 

    } 
} 
+0

Проблема с '.html' (и' .innerHTML') заключается в том, что браузер выполняет синтаксический анализ строки HTML и создает из нее новые элементы. Это нормально, если вы с новыми элементами. Но если вы преобразовали существующие элементы в HTML и затем установите HTML для «воссоздания» этих элементов, вы потеряете все обработчики и данные, привязанные к этим элементам. –

+0

Ну, конечно, это не идеальное решение, но поскольку ОП не упоминал об обязательных событиях перед этими разделами, я подумал, что это достойно jsfiddle, чтобы увидеть, будет ли идея, которая появилась в моей голове, работать. – Lee

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