2011-01-10 5 views
5

Посмотрите этот код:Target по щелчку

<div> 
    <a href = "#"><span>Click me MAN !</span></a> 
</div> 

<script type = "text/javascript"> 
    window.onload = function() { 
     document.body.addEventListener ("click", function (event) { 
      var target = event.target; 

      alert ("Returns \"" + target.nodeName + "\". Just want \"" + target.parentNode.nodeName + "\"") 
     }, false); 
    } 
</script> 

Вы можете увидеть элемент «пролет» внутри «связь», когда «ссылка» щёлкнули текущая цель такой же «промежуток». Как «event.target» возвращает «ссылку» вместо «span».

Спасибо и нет, я не хочу использовать «parentNode».

+4

Почему именно вы слушаете щелчок по телу вместо того, чтобы направить тэг на якорь? –

+0

@Matt: Это хорошая идея, чтобы сократить обработчики событий до минимума и использовать тот факт, что большинство событий пузыряют дерево DOM, метод, известный как * событие делегирование *. Это может быть то, что делает OP. –

ответ

7

С вашим подходом, вы должны либо вручную пройти вверх по DOM, пока не ударил <a> элемент или прикрепить слушателя к ссылке себя и использовать this.

Минимизировать количество слушателей событий, как правило, хорошая идея, так что вот пример того, как пересечь DOM. Обратите внимание, что прослушиватель событий не работает в IE, который не поддерживает метод узлов DOM addEventListener().

Живой пример: http://jsfiddle.net/timdown/pJp4J/

function getAncestor(node, tagName) { 
    tagName = tagName.toUpperCase(); 
    while (node) { 
     if (node.nodeType == 1 && node.nodeName == tagName) { 
      return node; 
     } 
     node = node.parentNode; 
    } 
    return null; 
} 

document.body.addEventListener("click", function(event) { 
    var target = getAncestor(event.target, "a"); 
    if (target !== null) { 
     alert(target.nodeName); 
    } 
}, false); 
0

Разве вы не можете просто использовать

<span><a href="#">Click me</a></span> ? 
+0

Какова точка пролета тогда? Это становится совершенно бесполезным. –

+0

Как вам фигурировать? Стили, сделанные на нем, по-прежнему действительны для содержимого ссылки ... – Cray

1

Добавьте советы это CSS для JavaScript. Вы получите event.target вы хотите.

a > *, 
button > *{ 
    pointer-events:none; 
} 
Смежные вопросы