1

我的 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”的警报?

4

1 回答 1

2

要阻止事件冒泡到父元素,您必须告诉event对象它。在 IE 中,您设置event.cancelBubble= true. 在其他浏览器中,您调用event.stopPropagation().

您可能还想关闭默认的链接跟踪操作,这样浏览器就不会一直跳到顶部尝试跟踪不存在的锚链接,例如#1. 在 IE 中,您设置event.returnValue= false. 在其他浏览器中,您调用event.preventDefault().

可以像在 IE 上一样访问该event对象。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>
于 2009-11-30T23:00:08.113 回答