在锚标记内创建锚标记


75

在我的随机测试中,我看到了一种将锚标签放在另一个锚标签内的行为。我做了一个jsfiddle

<a class="groupPopper">
     <a class="name"> content</a>
</a>

但是在开发人员工具中,它看起来有所不同:

在此处输入图片说明

我相信我们不能将锚标记放在另一个锚标记中,因为单击内部锚会导致click事件冒泡到父锚标记,这是不允许的。

我的假设正确吗?

Answers:


115

如@ j08691所述,aHTML语法禁止嵌套元素。HTML规范没有说明原因;他们只是强调规则。

从实际的角度来看,浏览器在其解析规则中有效地实施了这一限制,因此与许多其他问题不同,违反规范将不起作用。解析器有效地将<a>opena元素内部的start标记视为在开始新元素之前隐式终止open元素。

因此,如果您编写<a href=foo>foo <a href=bar>bar</a> zap</a>,则不会获得嵌套元素。浏览器会将其解析为<a href=foo>foo</a> <a href=bar>bar</a> zap,即两个连续的链接,后跟一些纯文本。

嵌套没有本质上不合逻辑的东西 a元素:可以实现它们,以便单击“ foo”或“ zap”激活外部链接,单击“ bar”激活内部链接。但是我没有看到使用这种结构的理由,HTML的设计者也可能没有看到这种结构,因此他们决定禁止使用这种结构,从而简化了事情。

(如果您真的想模拟嵌套链接,则可以将普通链接用作外部链接,将span具有适当事件处理程序的元素用作内部“链接”。或者,可以复制链接:<a href=foo>foo</a> <a href=bar>bar</a> <a href=foo>zap</a>。)


似乎至少有些最新的浏览器现在允许它。我有一个结构a > div > a,Chrome和Firefox都让它在我编写时就已经存在,并且它们在解析过程中也没有取消结构化(我还没有测试Edge)。
trusktr

对不起,说不可能是没有帮助的。
PJ Brunet

@trusktr我也测试了它,甚至像a > div > a<a> </a> <div> <a> </a> </ div>这样的结构出现了,所以浏览器实际上不允许嵌套链接(即使存在是一个div之间。
G.艾格里

@ G.Egli Ah,你是对的。我一定忽略了它,或者我使用纯JavaScript来做到这一点。解析器不允许这样做(真遗憾,我认为它不应将HTML变形为您未编写的内容)。这是使用JavaScript可以实现的方法:jsfiddle.net/0ozfcn1d
trusktr

21

嵌套链接是非法的。

由A元素定义的链接和锚点不得嵌套;A元素不得包含任何其他A元素。


这可能是什么原因?只想进一步澄清。
Anoop 2012年

1
我不知道其背后的确切原因,但是我至少会说在语义上嵌套链接是没有意义的。更不用说具有href嵌套值的实际链接似乎是毫无意义的。
j08691 2012年

这也是我的假设。只是想更加确定。因为我可以将其他标签(例如span)放在A标签内。
Anoop 2012年

4
一点也不没有意义。假设您有一个外部锚定为大型块级元素。现在,在那个大块中的任意位置的某个位置,您需要一个跨度级别的锚,它将您带到其他位置。例如#comments快捷方式。如果不使用嵌套锚,就无法做到这一点。
DMCoding '16

@DanielJames-毫无意义。
j08691 2016年

10

我遇到了@thinkbonobo相同的问题,并找到了一种无需JavaScript的方法:

.outer {
  position: relative;
  background-color: red;
}
 
.outer > a {
  position: absolute;
  top: 0; left: 0; bottom: 0; right: 0;
}
 
.inner {
  position: relative;
  pointer-events: none;
  z-index: 1;
}
 
.inner a {
  pointer-events: all;
}
<div class="outer">
  <a href="#overlay-link"></a>
  <div class="inner">
    You can click on the text of this red box. It also contains a
    <a href="#inner-link">W3C compliant hyperlink.</a>
  </div>
</div>

诀窍是使锚点覆盖整个.outerdiv,然后为内部div中的所有其他锚点赋予正值z-index。完整功劳归于https://bdwm.be/html5-alternative-nested-anchor-tags/


这很完美。
Pranoy C

7

您可以使用对象标签解决此问题。如

<a><object><a></a></object></a>

1
这出奇地好。但是根据规范,它是否“合法”?规格如此密集和复杂,很难确定。
mpoisot

1
@mpoisot这是非常糟糕的做法,而且很hacky。就HTML语法而言,绝对不合法或不建议使用。如果您需要更多信息,请阅读以下内容:w3.org/TR/html401/struct/links.html#h-12.2.2
朋友

4

当尝试使div面板也可以通过按钮单击时,我偶然发现了此问题。我建议的解决方法是使用javascript事件。

这是我创建的一个Codepen示例。 http

这是它的html部分:

链接示例嵌入链接...

<div class=panel onclick="alert('We\'ll hi-ii-ii-ide')">
  If you say run<br>
  <button onclick="app.hitMe(event)">more</button><br>
  <br>
  And if you say hide...<br>
</div>

请注意如何捕获内部链接的事件并使用stopPropagation()。这对于确保外部触发器不运行至关重要。


1
我不得不使用event.preventDefault(); 在Chrome上
Daniel F

问题在于mmb-click不能在新选项卡中打开链接。
丹尼尔·F

您也可以在没有JS的情况下执行此操作,请参阅我的答案下面的

3

这是无效的HTML。

您不能嵌套a元素。

因此,根据定义,行为是不确定的。


这可能是什么原因?只想进一步澄清。
Anoop 2012年

@Sushil-回答我-嵌套a元素的含义是什么?这可能意味着什么?
Oded 2012年

是的,这没有任何意义,但是对我来说这是新事物,因此我想确保可以将span,img ..标签放在锚标签中。
Anoop 2012年

1
@Sushil-当然,从内容上讲有意义。在命令内部没有命令。
Oded 2012年

@Anoop我知道这是一个非常老的话题,但是无论如何我都会提供建议。我对为什么不能在其他标签内嵌套标签的猜测是,当您单击嵌套链接时,浏览器将检测到同时单击了两个a标签(子标签和父标签)。这意味着他们需要知道某种优先级,例如遵循哪个标签更重要。浏览器也可能会与其他浏览器以不同的方式处理优先级,并且开始为它创建规范变得不必要地棘手,因此最好避免允许嵌套标签在一起。
朋友

1

对于嵌套锚,为防止内部事件冒泡到外部事件,您希望在单击内部事件后立即停止传播。

内部事件的OnClick,请使用e.stopPropagation();


0

不要那样做。我在应用程序中遇到了同样的问题。您可以简单地<div>在顶部添加标签,<a>在子级别添加标签。就像是:

<div id="myDiv"><a href="#"></a>
     <a href="#"></a>
</div>

确保在脚本文件中也添加了myDiv的click事件。

window.location.href = "#dashboardDetails";


0

您不能嵌套“ a”标签。而是将外部容器设置为“ position:relative”,将第二个“ a”设置为“ position:absolute”,并增加其z-index值。您将获得相同的效果。

<div style="position:relative">
<a href="page2.php"><img src="image-1.png"></a>
<a style="position:absolute;top:0;z-index:99" href="page1.php"></a>
</div>

0

我知道这是一篇过时的文章,但是我想指出,user9147812的答案比其他任何建议都有效。这就是我堆叠整个事情的方式。

    <style>
    * {
      padding: 0;
      margin: 0 border:0;
      outline: 0;
    }

    .outer_anchor {
      display: inline-block;
      padding: 5px 8px;
      margin: 2px;
      border: 1px solid #252632;
      border-radius: 3px;
      background: #1c1d26;
      color: #fff;
      text-shadow: 0 1px 0 #616161;
      box-shadow: 1px 1px 3px #000;
      transform: translateY(0);
      transition: background 250ms;
    }
    .inner_anchor {
      display: inline-block;
      padding: 5px 8px;
      margin: 2px;
      border: 1px solid #252632;
      border-radius: 3px;
      background: #1c1d26;
      color: #fff;
      transform: translate(0px);
    }
    .inner_anchor:hover {
      background: #647915;
    }
    </style>


<a href="#">ItemX<object><a class="elim_btn" href="#" title='Eliminate'>&times;</a></object></a>

-6

这是一种不好的编码方式,但是您可以尝试-

<a href="1"> aaaa <table> <tr> <td> <a href="2"> bbbb </a> </ td> </ tr> </ table> </a>


6
就像1996年的浏览器一样,这也不起作用。至少在Firefox中,它将在找到内部锚点的开始时通过关闭外部锚点来尝试了解这一点。这还涉及关闭td,td和table元素,然后在内部锚点关闭后再次将其重新打开。我已经在WooCommerce模板中看到了这种确切的行为,引起了一些非常时髦且不明显的格式问题,这导致我遇到了一个SO问题,试图找到答案。
杰森
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.