JQuery код функции each () выполняется, даже если в коллекции нет элементов

0

У меня есть следующий код в моем приложении. Предполагается, что будет построена строка, разделенная запятыми, из коллекции JQuery. Коллекция извлекается из некоторого xml. Я использую JQuery each() для итерации. Это стандартный код, который я использую все время. Сначала я объявляю и определяю переменную результата (patientConditions) и устанавливаю ее в пустую. Внутри функции я добавляю найденную строку к переменной результата вместе с запятой. Меня не беспокоит конечная запятая, это оставляет, если есть результаты. Проблема в том, что без каких-либо результатов выполняется вторая строка внутри моей() (они, вероятно, оба). По завершении цикла (без соответствующих элементов в xml) значение результата равно ",". Он должен быть пустым. Я думаю, что это связано с закрытием или подъемом, но я не могу понять, как это происходит. Я взломал решение этого сценария, но я больше беспокоюсь о дыре в своих знаниях js :(

var patientConditions = '';

$xml.find('patient>prescription>conditions').each(function() {
    var conditionName = $(this).find('condition>name');
    patientConditions += conditionName.text() + ',';
});
Теги:

2 ответа

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

Из того, что я могу понять, существует соответствие для patient>prescription>conditions, но не для condition>name, в этом случае $(this).find('condition>name') вернет нулевой набор элемет. то .text() на этом наборе вернет пустую строку

$xml.find('patient>prescription>conditions').each(function() {
    var conditionName = $(this).find('condition>name');
    if(conditionName.length){
        patientConditions += conditionName.text() + ',';
    }
});
1

Всякий раз, когда объект jQuery используется для поиска несуществующих узлов, в этом случае $(this).find('condition>name'). Объект jQuery все еще существует, он просто не содержит никакой связи с узлом. Это позволит вам запускать все функции jQuery на этом объекте, несмотря на то, что у них нет ссылки. Вот почему conditionName.text() возвращает пустую строку, несмотря на отсутствие узла. Решение, проверьте, существует ли узел, прежде чем что-либо делать.

var patientConditions = '';

$xml.find('patient>prescription>conditions').each(function() {
    var conditionName = $(this).find('condition>name');

    if (conditionName.length > 0) {
        patientConditions += conditionName.text() + ',';
    } else {
        // Do something if node doesnt exist
    }
});

Ещё вопросы

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