JQuery each() 函数代码即使在集合中没有元素时也在运行

JQuery each() function code is running even when there are no elements in the collection

本文关键字:元素 运行 集合 JQuery 函数 代码 each      更新时间:2023-09-26

我的应用程序中有以下代码。它应该从 JQuery 集合中构建一个逗号分隔的字符串。集合是从某个 xml 检索的。我使用 JQuery each() 进行迭代。这是我一直在使用的标准代码。我首先声明并定义结果变量(patientConditions),并将其设置为空白。在函数中,我将找到的字符串与逗号一起添加到结果变量中。如果有结果,我不会被这留下的尾随逗号所困扰。问题是没有结果,我的 each() 中的第二行正在运行 - 它们可能都是。循环完成后(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')将返回一个零 elemet 集。 然后该集合上的.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
    }
});