2012-05-30 2 views
3

Я пытаюсь повторить «вверх» через узлы DOM из данного элемента, чтобы получить первый родительский элемент, который имеет атрибут «анимированный».Элемент не имеет метода hasAttribute, Почему?

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, и первый журнал правильный.

+0

Почему вы делаете 'console.log (эл)' ПОСЛЕ вы 'вернуть эль; '? 'Console.log (el)' никогда не будет выполнен. – jfriend00

ответ

7

document объект:

  • является узлом
  • Является parentNode корневого элемента (если вы используете HTML, который был бы <html> элемент)
  • не является элементом.

Только элементы имеют атрибуты, поэтому только объекты элемента имеют метод hasAttribute.

Вам необходимо прекратить тестирование, когда вы достигнете объекта документа (или когда вы больше не тестируете элемент).

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

Можно ли использовать 'hasOwnProperty'? [Подробнее см. Здесь] (http://stackoverflow.com/questions/135448/how-do-i-check-to-see-if-an-object-has-an-attribute-in-javascript). – approxiblue

+0

Я понятия не имею, если DOM для произвольных документов разметки сопоставляют атрибуты непосредственно с свойствами или нет. – Quentin

+1

Я бы проверял 'el.nodeType == 1' (который гарантированно работает) вместо' el.hasAttribute' (которого нет). –

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; 
    } 
} 
Смежные вопросы