Получение всех детей из узла

0

У меня будет скрипт, в котором все дочерние элементы из HTML-поддерева будут текстовыми. Я написал sth, но это не wokr для любого узла

$(document).ready(function () {
    var result;
    $.each($("li").contents(), function(i, v){
        if(v.nodeType == 3){
            result = result + " " + v.nodeValue;
        }
    });
    alert(result);
});
  • 0
    Работает нормально. jsfiddle.net/VgaPC . Вы получаете неопределенный на первом месте, потому что вы не объявили переменную result, и вы добавляете результат позже к нему

3 ответа

2
Лучший ответ

Попробуй это:

$(document).ready(function () {
    var result = "";
    $("li").each(function() {
       result += $(this).text();
    });
    alert(result);
});
  • 0
    но почему вы не проверяете nodeType == 3?
  • 0
    вам не нужно проверять, является ли это текстовым элементом, потому что, если текста нет, значение пустое, и это вас совсем не беспокоит. Посмотрите на api.jquery.com/text
2

Вам нужно инициализировать result для пустой строки:

var result = '';

демонстрация

Если нет, result инициализируется undefined и

undefined + 'someString' === 'undefinedsomeString'
  • 0
    Но если у меня есть fe <ul> в каком-то div, это не сработает
  • 0
    @ henio180 у меня работает: jsfiddle.net/t9372/2
Показать ещё 5 комментариев
0

В ES6 я считаю, что это более читаемо:

var result = [].slice.call($("li").contents())
    .filter(v => v.nodeType == 3)
    .map(v => v.nodeValue)
    .join(' ');
alert(result);

В ES5 это более подробный:

var result = [].slice.call($("li").contents())
    .filter(function(v){ return v.nodeType == 3; })
    .map(function(v){ return v.nodeValue; })
    .join(' ');
alert(result);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню