元素没有hasAttribute方法,为什么?

3
我正在尝试从给定元素开始“向上”遍历DOM节点,以获取具有属性“animated”的第一个父元素。
var el = evt.target;
    console.log(el);
while (!el.hasAttribute('animated'))
   { el = el.parentNode; }
return el;
    console.log(el);

抛出错误:

>>>Uncaught TypeError: Object #<HTMLDocument> has no method 'hasAttribute'

这怎么可能?我已经明确声明了变量el,第一个日志是正确的。


你为什么在执行 return el; 之后还要执行 console.log(el) 呢?console.log(el) 永远不会被执行。 - jfriend00
3个回答

7

文档对象:

  • 是一个节点
  • 是根元素的parentNode (如果您使用的是HTML,则为<html>元素)
  • 不是一个元素。

只有元素才有属性,因此只有元素对象才有hasAttribute方法。

当您到达文档对象(或不再测试元素时)时,需要停止测试。

while (
    el.nodeType === 1 && 
    (!el.hasAttribute('animated'))
) {

我们也可以使用hasOwnProperty吗?更多细节在这里 - approxiblue
我不知道任意标记文档的DOM是否直接将属性映射到属性。 - Quentin
1
我会检查 el.nodeType == 1(这是保证有效的)而不是 el.hasAttribute(这是不保证有效的)。 - Tim Down
它修复了我(可能是因为我认为自己是新手而不够高效)脚本中的奇怪行为。getAttribute在第二次使用时返回错误,但第一次确实起作用。我执行了nodeType === 1检查,现在它运行得非常好。+1 - Fusseldieb

1

var el = evt.target 是一个 document 对象,因此没有 hasAttribute 属性。


1

您还可以将其制作成一个函数,该函数返回null或具有该属性的祖先节点:

function findNodeWithAttribute(el, attr) {
    while (true) {
        if (!el || !el.hasAttribute) {
            return null;
        } else if (el.hasAttribute(attr)) {
            return el;
        }
        el = el.parentNode;
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接