我的HTML中有一个标签层次结构,它们都包含onclick事件处理程序。 onclick被推送到事件堆栈,从叶子回到层次结构的根。我只想回应叶子onclick事件。我可以刷新事件堆栈而不是使用标志吗?
例如......
<ul>
<li onclick="nada('1');"><a href="#1">1</a></li>
<li onclick="nada('2');"><a href="#2">2</a>
<ul>
<li onclick="nada('2.1');"><a href="#2.1">2.1</a></li>
<li onclick="nada('2.2');"><a href="#2.2">2.2</a></li>
<li onclick="nada('2.3');"><a href="#2.3">2.3</a></li>
</ul>
</li>
<li onclick="nada('4');"><a href="#4">4</a></li>
<li onclick="nada('5');"><a href="#5">5</a></li>
</ul>
使用此功能点击2.2 ...
function nada(which)
{
alert(which);
}
...将导致两个警告“2.2”和“2”。
我可以添加到nada函数中以消除'2'的警报?
答案 0 :(得分:1)
要阻止事件冒泡到父元素,您必须告诉event
对象。在IE中,您设置event.cancelBubble= true
。在其他浏览器中,您调用event.stopPropagation()
。
您可能还想关闭默认的链接跟踪操作,以便浏览器不会一直跳到顶部,尝试关注#1
之类的不存在的锚链接。在IE中,您设置event.returnValue= false
。在其他浏览器中,您调用event.preventDefault()
。
event
对象可在IE上以window.event
访问。在其他浏览器上,它被传递到事件处理函数中。将事件传递给同时适用于两者的函数的方法是:
<li onclick="nada('2.1', event);"><a href="#2.1">2.1</a></li>
function nada(n, event) {
alert(n);
if ('stopPropagation' in event) {
event.stopPropagation();
event.preventDefault();
} else {
event.cancelBubble= true;
event.returnValue= false;
}
}
然而,将onclick
事件放在它通常所属的a
元素上可能会更好。这有助于可访问性,因为a
元素将是可聚焦的并且可用键盘操作。这意味着您不必担心父母的点击处理程序被调用。
(如果需要,您可以将a
设置为看起来像普通块。)
然后,您还可以通过一些不显眼的脚本来启动冗余的onclick
链接:
<ul id="nadalist">
<li><a href="#1">1</a></li>
<li><a href="#2">2</a>
<ul>
<li><a href="#2.1">2.1</a></li>
<li><a href="#2.2">2.2</a></li>
<li><a href="#2.3">2.3</a></li>
</ul>
</li>
<li><a href="#4">4</a></li>
<li><a href="#5">5</a></li>
</ul>
<script type="text/javascript">
var links= document.getElementById('nadalist').getElementsByTagName('a');
for (var i= links.length; i-->0;) {
links[i].onclick= function() {
alert(this.hash.substring(1));
return false;
}
}
</script>
答案 1 :(得分:0)
我认为QuirksMode上的这篇文章可以帮助你: Javascript - Event order