【发布时间】:2019-01-16 23:13:54
【问题描述】:
在我的随机测试中,我看到了我将一个锚标记放入另一个锚标记的行为。我做了一个jsfiddle。
<a class="groupPopper">
<a class="name"> content</a>
</a>
但在开发者工具中看起来不同:
我相信我们不能将锚标记放在另一个锚标记中,因为单击内部锚会将单击事件冒泡到父锚标记,这是不允许的。
我的假设正确吗?
【问题讨论】:
标签: html
在我的随机测试中,我看到了我将一个锚标记放入另一个锚标记的行为。我做了一个jsfiddle。
<a class="groupPopper">
<a class="name"> content</a>
</a>
但在开发者工具中看起来不同:
我相信我们不能将锚标记放在另一个锚标记中,因为单击内部锚会将单击事件冒泡到父锚标记,这是不允许的。
我的假设正确吗?
【问题讨论】:
标签: html
正如@j08691 所述,嵌套的a 元素在HTML 语法中是被禁止的。 HTML 规范没有说明原因;他们只是强调规则。
实际上,浏览器在其解析规则中有效地强制执行此限制,因此与许多其他问题不同,违反规范是行不通的。解析器有效地将打开的 a 元素内的 <a> 开始标记视为在开始新元素之前隐式终止打开的元素。
所以如果你写<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 元素作为内部“链接”。或者,您可以复制链接:@987654329 @.)
【讨论】:
a > div > a,Chrome 和 Firefox 在我编写它时都让它存在,并且在解析过程中它们不会解构它(我没有测试 Edge)。
A 元素定义的链接和锚点不能嵌套;一个A 元素不得包含任何其他 A 元素。
【讨论】:
href 值的实际链接似乎完全没有意义。
我将same issue 用作@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>
诀窍是制作一个覆盖整个.outer div 的anchor,然后为内部div 中的所有其他anchor 赋予一个正的z-index 值。全部功劳归https://bdwm.be/html5-alternative-nested-anchor-tags/
【讨论】:
你可以使用对象标签来解决这个问题。 比如
<a><object><a></a></object></a>
【讨论】:
我在尝试通过也有按钮来使 div 面板可点击时偶然发现了这个问题。我推荐的解决方法是使用 javascript 事件。
这是我创建的一个 codepen 示例.... http://codepen.io/thinkbonobo/pen/gPxJGV
这是它的 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()。这对于确保外部触发器不运行至关重要。
【讨论】:
这是无效的 HTML。
您不能嵌套 a 元素。
因此,根据定义,行为是未定义的。
【讨论】:
a 元素是什么意思?这可能意味着什么?
对于嵌套锚点,为了防止内部事件冒泡到外部事件,您希望在单击内部事件后立即停止传播。
内部事件的OnClick,使用e.stopPropagation();
【讨论】:
不要那样做。我在我的应用程序中遇到了同样的问题。
您可以简单地在顶部添加<div> 标签,在子级别添加<a> 标签。
类似:
<div id="myDiv"><a href="#"></a>
<a href="#"></a>
</div>
确保在脚本文件中也为 myDiv 添加点击事件。
window.location.href = "#dashboardDetails";
【讨论】:
您不能嵌套“a”标签。而是将外部容器设置为“位置:相对”,将第二个“a”设置为“位置:绝对”并增加其 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>
【讨论】:
我知道这是一篇旧帖子,但我想指出 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'>×</a></object></a>
【讨论】: