admin管理员组

文章数量:1316818

I'm trying to iterate "up" through the DOM nodes from a given element to get the first parent element which has the attribute 'animated'.

var el = evt.target;
    console.log(el);
while (!el.hasAttribute('animated'))
   { el = el.parentNode; }
return el;
    console.log(el);

Throws error:

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

How is this possible? I've clearly declared the variable el and the first log is correct .

I'm trying to iterate "up" through the DOM nodes from a given element to get the first parent element which has the attribute 'animated'.

var el = evt.target;
    console.log(el);
while (!el.hasAttribute('animated'))
   { el = el.parentNode; }
return el;
    console.log(el);

Throws error:

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

How is this possible? I've clearly declared the variable el and the first log is correct .

Share Improve this question asked May 30, 2012 at 15:17 jenswirfjenswirf 7,31711 gold badges51 silver badges67 bronze badges 1
  • Why are you doing console.log(el) AFTER you do return el;? The console.log(el) will never be executed. – jfriend00 Commented May 30, 2012 at 15:28
Add a ment  | 

3 Answers 3

Reset to default 8

The document object:

  • Is a node
  • Is the parentNode of the root element (if you were using HTML that would be the <html> element)
  • Is not an element.

Only elements have attributes, so only element objects have a hasAttribute method.

You need to stop testing when you reach the document object (or when you aren't testing an element any longer).

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

var el = evt.target is a document object and therefore does not have a hasAttribute attribute.

You could also make it into a function that returns either null or the ancestor node that has that attribute:

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

本文标签: javascriptElement has no method hasAttributewhyStack Overflow