3

我正在尝试通过给定元素的 DOM 节点“向上”迭代,以获取第一个具有“动画”属性的父元素。

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并且第一个日志是正确的。

4

3 回答 3

7

document对象:

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

只有元素才有属性,所以只有元素对象才有hasAttribute方法。

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

while (
    el.nodeType === 1 && 
    (!el.hasAttribute('animated'))
) {
于 2012-05-30T15:18:07.197 回答
1

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

于 2012-05-30T15:20:35.837 回答
1

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

function findNodeWithAttribute(el, attr) {
    while (true) {
        if (!el || !el.hasAttribute) {
            return null;
        } else if (el.hasAttribute(attr)) {
            return el;
        }
        el = el.parentNode;
    }
}
于 2012-05-30T15:42:06.133 回答