2016-09-15 2 views

ответ

1

Вместо использования .text используйте .contents, чтобы получить все узлы (включая текстовые узлы), а затем использовать each перебрать их и получить только текст текстовых узлов:

var text = []; 
$("div.A").contents().each(function() { 
    if (this.nodeType === 3) { // 3 = Text node 
     text.push(this.nodeValue); 
    } 
}); 

console.log(text); // ["I'm in A.", "I'm in A, too."] 

(Фактические авторизованы содержимое, вероятно, имеют пробелы вокруг них, как пробелы в текстовом узле, в зависимости от точной разметки)

Или, если вы предпочитаете:.

var text = $("div.A") 
    .contents() 
    .filter(function() { 
     return this.nodeType === 3; // 3 = Text node 
    }) 
    .map(function() { 
     return this.nodeValue; 
    }) 
    .get(); 

Который выглядит намного опрятнее в ES2015 +:

let text = $("div.A") 
    .contents() 
    .filter((i, e) => e.nodeType === 3) 
    .map((i, e) => e.nodeValue) 
    .get(); 
2

Этот простой трюк поможет получить то, что вы хотите.

$('div.A') 
    .clone() //clone the element 
    .children() //select all the children 
    .remove() //remove all the children 
    .end() //again go back to selected element 
    .text(); 

Его основанные на методе клонирования, вы можете прочитать больше об этом from here.

$('div.A').clone().children().remove().end().text() //single line representation 
Смежные вопросы