我可以使用Javascript在Firefox中刷新事件堆栈吗?

时间:2009-11-30 22:24:49

标签: javascript javascript-events event-handling flush

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

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