У меня есть следующий код в моем приложении. Предполагается, что будет построена строка, разделенная запятыми, из коллекции 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() + ',';
});
Из того, что я могу понять, существует соответствие для 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() + ',';
}
});
Всякий раз, когда объект 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
}
});