1

jsfiddle.net 上的演示

HTML:

<a href='http://www.jsfiddle.net'><span>link</span></a>

脚本:

$('span').click(function(event) {
  window.open('http://www.google.com');
  event.stopImmediatePropagation();
  //The line below does prevent jsfiddle.net from loading on the right.
  //event.preventDefault();
});
$('a').click(function() {
  //This function is not triggered as event propagation has been stopped.
  alert('You will never see this.');
});

在演示中单击“链接”将打开 google.com 和 jsfiddle.net。我的问题来了:为什么<a>(在这种情况下打开 jsfiddle.net)的默认行为被其子项(<span>在这种情况下)继承?有什么规格可以参考吗?提前致谢。

4

2 回答 2

2

为什么默认行为是<a>由其子代继承的?

因为它是有道理的 :-) 每次点击链接或其后代都会触发一个事件,其默认操作是激活链接。

有什么规格可以参考吗?

检查DOM level 3 规范中的默认操作和可取消事件以了解取消的说明。但是,DOM3 本身并没有指定任何默认操作。

这些是在 HTML 5 规范中完成的,专门针对交互式内容部分中的点击:

单击定点设备时,用户代理必须运行以下步骤:

  1. [设置一些标志]
  2. e是用户指定的元素的最近的可激活元素,如果有的话。为此,请检查目标是否具有已定义的激活行为。如果有,请接受,如果没有(并且有父元素),则使用 target的元素重复检查
  3. 如果有元素e,请为其运行点击前激活步骤(如果有)。
  4. 调度所需的click事件。
  5. 如果有一个元素e并且点击事件没有被取消,如果有的话,为它运行点击后激活步骤。
  6. 如果存在元素e并且事件被取消,则对其运行取消的激活步骤(如果有)。
  7. [重置标志]

激活行为由元素本身定义,例如在<a>元素处获取和遵循超链接。

于 2013-10-28T09:58:36.373 回答
1

请在此处查看此答案:

jquery中的e.stopPropagation()是否适用于锚标记

您可以结合使用event.preventDefault();以获得所需的行为。<a>StopPropagation 防止事件被触发,但不是默认行为,例如单击标签时导航到页面。

于 2013-10-28T09:05:07.567 回答