这样的情况有效吗?
div#foo
span#foo
a#foo
这样的情况有效吗?
div#foo
span#foo
a#foo
Answers:
没有。
元素ID在整个文档中应该是唯一的。
$('div#car span#size)
和$('div#truck span#size')
。
我认为某些东西应该是唯一的还是必须是唯一的(即由网络浏览器强制执行)之间存在区别。
ID应该是唯一的吗?是。
ID必须唯一吗?不,至少IE和FireFox允许多个元素具有相同的ID。
getElementById
实际上确实定义了必须返回具有给定ID 的第一个元素(无论如何,这是所有浏览器当前如何处理这种情况的方式)-有关更多信息,请参见下面的答案。
多个元素可以具有相同的ID吗?
是的-无论它们是否具有相同的标签,即使多个元素具有相同的ID,浏览器也会呈现该页面。
它是有效的HTML吗?
否。从HTML 5.1规范开始,这仍然是正确的。但是,规范还说getElementById
必须返回具有给定ID 的第一个元素,从而在无效文档的情况下使行为不明确。
这种无效的HTML有什么后果?
大部分(如果不是全部)的浏览器选择,仍然不选择与给定的ID,打电话时的第一要素getElementById
。大多数通过ID查找元素的库都会继承此行为。大多数(如果不是全部)浏览器也应用由id选择器分配的样式(例如#myid
)具有指定ID的所有元素。如果这是您的期望和意图,那么就不会有意外的后果。如果您期望/打算进行其他操作(例如,要返回具有该ID的所有元素,或仅将样式应用于一个元素),则将无法满足您的期望,并且依赖这些期望的任何功能都将失败。
一些JavaScript库也有不符合预期,当多个元素具有相同的ID(见wootscootinboogie的评论关于d3.js)
结论
最好遵循标准,但是如果您知道您的代码在当前环境中可以正常工作,并且这些ID以可预测/可维护的方式使用,则只有两个实际原因不这样做:
力量属于您!
即使元素的类型不同,也可能导致严重的问题。
假设您有3个具有相同ID的按钮:
<button id="myid" data-mydata="this is button 1">button 1</button>
<button id="myid" data-mydata="this is button 2">button 2</button>
<button id="myid" data-mydata="this is button 3">button 3</button>
现在,您设置了一些jQuery
代码来myid
在单击按钮时执行某些操作:
$(document).ready(function ()
{
$("#myid").click(function ()
{
var buttonData = $(this).data("mydata");
// Call interesting function...
interestingFunction();
$('form').trigger('submit');
});
});
您会期待什么?每个单击的按钮都将使用jQuery执行click事件处理程序设置。不幸的是,这不会发生。只有第一个按钮会调用点击处理程序。单击其他2则不执行任何操作。好像它们根本不是按钮!
因此,始终IDs
为HTML
元素分配不同的内容。这将使您免受奇怪的事情的困扰。:)
<button id="button1" class="mybtn" data-mydata="this is button 1">button 1</button>
<button id="button2" class="mybtn" data-mydata="this is button 2">button 2</button>
<button id="button3" class="mybtn" data-mydata="this is button 3">button 3</button>
现在,如果您希望在单击任何按钮时都运行click事件处理程序,那么如果您更改jQuery代码中的选择器以使用CSS
应用于它们的类,则将可以完美地工作:
$(document).ready(function ()
{
$(".mybtn").click(function ()
{
var buttonData = $(this).data("mydata");
// Call interesting function...
interstingFunction();
$('form').trigger('submit');
});
});
HTML的官方规范指出id标签必须是唯一的,并且官方规范还指出,如果可以完成渲染,则它必须(即,HTML中没有“错误”之类的东西,只有“无效” HTML)。 因此,以下是id标签在实践中的实际工作方式。它们都是无效的,但仍然可以工作:
这个:
<div id="unique">One</div>
<div id="unique">Two</div>
在所有浏览器中均可正常渲染。但是,document.getElementById仅返回一个对象,而不返回一个数组。您将只能通过id标签选择第一个div。如果您要使用JavaScript更改第一个div的ID,则可以使用document.getElementById(在Chrome,FireFox和IE11上测试)访问第二个ID。您仍然可以使用其他选择方法选择div,它的id属性将正确返回。
请注意,此问题在呈现SVG图像的网站中打开了一个潜在的安全漏洞,因为允许SVG包含DOM元素以及它们上的id标签(允许通过上传的图像重定向脚本DOM)。只要SVG在替换元素之前位于DOM中,该图像就会收到所有用于另一个元素的JavaScript事件。
据我所知,这个问题目前尚无人问津,但这是真实的。
这个:
<div id="unique" id="unique-also">One</div>
在所有浏览器中也可以正常显示。但是,如果尝试了document.getElementById('unique-also');,则仅使用您以此方式定义的第一个 ID。在上面的示例中,您将返回null(在Chrome,FireFox和IE11上测试)。
这个:
<div id="unique unique-two">Two</div>
在所有浏览器中也可以正常显示,但是,与可以用空格分隔的类标签不同,id标记允许使用空格,因此上述元素的id实际上是“唯一唯一二”,并向dom请求“唯一”或单独的“唯一二”返回null,除非在DOM的其他地方另外定义(在Chrome,FireFox和IE11上测试)。
SLaks的回答是正确的,但作为补充说明,x / html规范指定在一个(单个)html文档中所有id必须唯一。尽管这并不是操作人员要求的,但可能存在有效的实例,其中相同的ID跨多个页面附加到不同的实体。
例:
(适用于现代浏览器)article#main-content { 样式化 }
(适用于旧版)div#main-content { 样式化另一种 }
不过可能是反模式。只是作为恶魔的拥护者离开这里。
值得一提的是,至少在Chrome 26.0.1410.65,Firefox 19.0.2和Safari 6.0.3上,如果您有多个具有相同ID的元素,则jquery选择器(至少)将返回具有该ID的第一个元素。
例如
<div id="one">first text for one</div>
<div id="one">second text for one</div>
和
alert($('#one').size());
有关测试,请参见http://jsfiddle.net/RuysX/。
div#one
That,否则当然不会更改其无效的事实。
好吧,使用w3.org上的HTML验证程序(特定于HTML5),ID必须唯一
考虑以下...
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>MyTitle</title>
</head>
<body>
<div id="x">Barry</div>
<div id="x">was</div>
<div id="x">here</div>
</body>
</html>
验证者以...回应
Line 9, Column 14: Duplicate ID x. <div id="x">was</div>
Warning Line 8, Column 14: The first occurrence of ID x was here. <div id="x">Barry</div>
Error Line 10, Column 14: Duplicate ID x. <div id="x">here</div>
Warning Line 8, Column 14: The first occurrence of ID x was here. <div id="x">Barry</div>
...但是OP特别声明-不同的元素类型呢?因此,请考虑以下HTML ...
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>MyTitle</title>
</head>
<body>
<div id="x">barry
<span id="x">was here</span>
</div>
</body>
</html>
验证者的结果是
Line 9, Column 16: Duplicate ID x. <span id="x">was here</span>
Warning Line 8, Column 14: The first occurrence of ID x was here. <div id="x">barry
在任何一种情况下(相同的元素类型或不同的元素类型),如果多次使用id,则认为该ID不是有效的HTML5。
通常,最好不要在html页面中多次使用相同的ID。即使这样,也可以在一个页面中多次使用相同的ID。但是,当您将ID用作URI / URL的一部分时,如下所示:
https://zh.wikipedia.org/wiki/FIFA_World_Cup#2015_FIFA_corruption_case
并且如果ID('2015_FIFA_corruption_case')仅用于网页中的一个(跨度)元素:
<span class="mw-headline" id="2015_FIFA_corruption_case">2015 FIFA corruption case</span>
不会有问题的。相反,同一ID存在多个地方,浏览器会感到困惑。