javascript - anchor 包装器上的 jQuery .one ("click") 会导致 href 不被遵循

标签 javascript html jquery jquery-events

这是一个看似棘手的 HTML/JS 代码,它让我或 jQuery 陷入了循环(我的钱在我身上)。

已在this fiddle中进行演示.


...但这就是场景。 anchor 用跨度包裹:

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

跨度有一个单击 anchor 的单击处理程序。这需要是 .one() 以避免由于事件冒泡而永远循环(我也尝试过 .on().off()以相同的结果短路循环 - 请参阅 fiddle )。

$('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 属性已触发!
  2. jQuery 点击被触发!
  3. (单击了跨度,让我们看看会触发哪些其他事件...)
  4. onclick HTML 属性已触发!
  5. jQuery 点击被触发!
  6. 遵循 href

由于事件冒泡到跨度,它会额外循环一次 JS 事件,这有点愚蠢和不优雅,但完全符合预期,对我来说很有意义。这里的关键部分是,在所有 JS 事件完成之后,跟随 href

当您单击外部范围时,事件的顺序如下:

  1. (单击了跨度,让我们看看会触发哪些其他事件...)
  2. jQuery 点击被触发!
  3. onclick HTML 属性已触发!
  4. ... {蟋蟀!?!} ....

即使 anchor 的 JS click 事件已触发,也不会遵循 href


我猜测 .one() 不会解除 span 的点击事件的绑定(bind) 直到从anchor,此时,事件传播完全终止。由于只有在所有点击事件完成后才会跟踪 href,因此当信号在 span 处消失时,anchor 不知道要触发 go-to-href 事件。

...但这真的是发生的事情吗?给出了什么?

有什么更好的方法来解决这个问题(我想避免 JS 出于各种原因取消 href 并手动设置 window.location)?

最佳答案

在第一个实例中(当您直接单击它时)会跟随该链接,因为这就是 <a> 的方式。标签有效,并且您的处理程序都不会要求取消默认行为。

通过 jQuery 在 <a> 上触发“点击”标签明确不跟随链接;这就是 jQuery 的工作原理。

关于javascript - anchor 包装器上的 jQuery .one ("click") 会导致 href 不被遵循,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10031389/

相关文章:

html - CSS: space <li> 所以它们在固定高度的 <div> 中垂直均匀分布

Javascript/JQuery 设置复选框的值,同时禁用其他复选框

javascript - Angular 不绑定(bind)的字符串插值

php 中的 Javascript 不工作

html - 多个导航栏配置?

html - 为什么富内容中的 HTML 文本将图像显示为 'Graphic'?

javascript - 选择多个但不是所有 HTML 类

javascript - 在 Jasmine 测试中访问 Controller 范围

javascript - jquery 设置 attr() 输入对象

javascript - 我可以在 HTML5 Canvas 中创建图形形状对象吗以及当用户将鼠标悬停在形状上时如何将光标显示为指针