检查JavaScript中是否存在节点值

时间:2014-04-18 13:03:47

标签: javascript jquery

我从加载的AJAX页面获取href值:每次加载AJAX页面时,它都会从新加载的页面中获取值。

我用它来获得正确的href值:

firstURL = l[0].childNodes[0].attributes[0].nodeValue;

但是,在最后一页上,此节点不存在(因为我们在最后一页上),并返回:

Uncaught TypeError: Cannot read property 'attributes' of undefined trans.js:393
(anonymous function) trans.js:393
j jquery.min.js:2
k.fireWith jquery.min.js:2
x jquery.min.js:4
(anonymous function)

如果子节点l[0].childNodes[0].attributes[0].nodeValue存在,我有没有办法分配这个变量?

4 个答案:

答案 0 :(得分:2)

您可以在尝试访问子节点之前检查是否存在子节点:

var firstURL = '';

if(l[0].childNodes.length > 0){ // only if there's more than 1 child node
    firstURL = l[0].childNodes[0].attributes[0].nodeValue;
}

附注:

  • childNodes包含文本节点,因此您可能更喜欢children,它只包含元素而不包含文本节点。如果将来在目标之前添加任何文本,您将获取文本节点。
  • 您可能更愿意使用getAttribute('href')而不是获取第一个存在的属性。

要使用.getAttribute(),您只需将.attributes[0]替换为:

firstURL = l[0].childNodes[0].getAttribute('href');

这将更加健壮,因为如果你曾经为元素添加新属性,这将在更改中存活,而依赖它始终是第一个可能会导致问题。

另请注意,如果您使用getAttribute(),则无需访问nodeValue,因为getAttribute()直接返回实际属性值

答案 1 :(得分:1)

在取消引用之前,您应该检查l[0].childNodes[0]是否存在。

if(l[0].childNodes[0]) {
    firstURL = l[0].childNodes[0].attributes[0].nodeValue;
} else {
    firstURL = <default value>;
}

或者作为三元:

firstURL = (l[0].childNodes[0]) ? l[0].childNodes[0].attributes[0].nodeValue : <default value>;

答案 2 :(得分:0)

if(!!l[0].childNodes[0]) {
    firstURL = l[0].childNodes[0].attributes[0].nodeValue;
}

答案 3 :(得分:0)

使用jQuery(标记为问题)这可能会变得非常简单:

var href = $('a.yourlink').attr('href');

由于$('a.yourlink')与任何DOM元素不匹配,因此在最后一页上可能为空。但它不会抛出任何JS异常。因此,要在最后一页上设置一些默认值,您可以像这样扩展该代码段:

var href = $('a.yourlink').attr('href') || 'my-default-url.html';