2015-01-19 2 views
0

Я пытаюсь определить, является ли элемент потомком другого электората, который имеет определенный атрибут. Пока у меня нет проблем, когда значение истинно, но я получаю TypeError: undefined is not a function (evaluating 'node.hasAttribute(attribute)'), когда hasAttribute false. Есть идеи?Неопределенная ошибка при попытке определить потомка родителя с использованием hasAttribute

document.body.addEventListener('touchmove', function(event) { stopScroll(event); }); 
var stopScroll = function(event) { 
    var target = event.target; 
    var parent = target.parentNode; 

    if (isDescendantOf.attribute('data-scroll', target)) { 

    } else { 
     event.preventDefault(); 
    } 
}; 
var isDescendantOf = {}; 
isDescendantOf.parent = function(parent, child) { 
    var node = child.parentNode; 
    while (typeof node !== 'undefined') { 
     if (node == parent) { 
      return true; 
     } 
     node = node.parentNode; 
    } 
    return false; 
}; 
isDescendantOf.tag = function(tag, child) { 
    var node = child.parentNode; 
    while (typeof node !== 'undefined') { 
     if (node.tagName == tag) { 
      return true; 
     } 
     node = node.parentNode; 
    } 
    return false; 
}; 
isDescendantOf.attribute = function(attribute, child) { 
    var node = child.parentNode; 
    while (node !== null) { 
     console.log(typeof node); 
     if (node.hasAttribute(attribute) === true) { 
      return true; 
     } 
     node = node.parentNode; 
    } 
    return false; 
}; 

Вот скрипка, хотя она действует даже страннее по какой-то причине: http://jsfiddle.net/x95tgmkn/

+0

Попробуйте использовать parentElement или проверьте тип узла для текста vs element – Mouser

+0

@Mouser Я попытался сделать это с помощью 'typeof node === 'object'' в других функциях, попытался изменить его на' node! == null ", но все тот же вопрос. Есть ли другой способ проверить, является ли это элементом? –

+0

После быстрого google, 'node instanceof HTMLElement', кажется, путь. Спасибо за толкание в правильном направлении! –

ответ

0

Ваш цикл проходит от child.parentNode до document, и на каждом node он использует hasAttribute method интерфейса Element. Однако Documents являются равными Node с, которые не реализуют этот интерфейс.

Измените условие

while (node != null && node.nodeType == 1) 

или node.nodeType != 9 или typeof node.hasAttribute == "function".

 Смежные вопросы

  • Нет связанных вопросов^_^