锚包装器上的jQuery .one(“click”)导致href没有被跟踪

时间:2012-04-05 15:20:40

标签: javascript html javascript-events jquery

这是一个看似棘手的HTML / JS,让我或jQuery抛出一个循环(我的钱在我身上)。

它在this fiddle演示。


......但这是场景。一个锚包裹着一个span:

<span> the span
    <a onclick="alert('onclick HTML attritbute fired!')" href="http://www.href-attribute-    fired.com">the link</a>
    wraps the link
</span>

span包含一个单击处理程序,可单击该锚点。这需要.one()以避免因事件冒泡而永远循环(我还尝试.on().off()以相同的结果短路循环 - 请参阅小提琴。)

$('a').click(function() {
    alert("jQuery click fired!");
});

$('span').one("click", function() {
    alert('(span clicked, let us see what other events fire...)');
    $(this).find('a').click();
});

当您点击链接本身时,您会注意到:

  1. onclick HTML attritbute fired!
  2. jQuery click fired!
  3. (跨越点击,让我们看看其他事件是什么......)
  4. onclick HTML attritbute fired!
  5. jQuery click fired!
  6. 跟着href
  7. 它通过JS事件循环一段额外的时间,因为事件冒泡到跨度,这是一个有点愚蠢和不优雅但完全预期和对我有意义。这里的关键部分是,在完成所有JS事件之后,跟随href

    单击外跨区时,这是事件的顺序:

    1. (跨越点击,让我们看看其他事件是什么......)
    2. jQuery click fired!
    3. onclick HTML attritbute fired!
    4. ...... {蟋蟀!?!} ....
    5. 即使主播的JS click事件被触发,仍然不会跟踪href


      我猜测.one()span 冒出后,anchor 没有取消绑定span 的点击事件。 ,此时,事件传播完全消失。由于直到所有点击事件都完成后才会跟踪href,当信号在anchor处死亡时,window.location不知道要触发go-to-href事件。

      ......但是真的发生了什么?是什么赋予了?

      有什么更好的方法可以解决这个问题(我想避免JS因为各种原因而手动设置{{1}})?

1 个答案:

答案 0 :(得分:4)

第一个实例(直接点击它)时会跟踪链接,因为这是<a>标记的工作方式,并且没有任何处理程序要求取消默认行为。

<a>标记上通过jQuery触发“点击”显然不会跟随链接;这就是jQuery的工作原理。