Чи може html-елемент мати декілька ідентифікаторів?


310

Я розумію, що ідентифікатор повинен бути унікальним на сторінці HTML / XHTML.

Моє запитання: чи для цього елемента я можу призначити кілька ідентифікаторів?

<div id="nested_element_123 task_123"></div>

Я усвідомлюю, що у мене є просте рішення з просто використанням класу. Мені просто цікаво використовувати ідентифікатори таким чином.


Я майже на деякий час програмую в html css та js, у мене часто виникає потреба у використанні декількох класів, але я дійсно ніколи не використовую і не маю потреби використовувати декілька ідентифікаторів. Тим не менш я трохи цікавий: чи можу я запитати, яка ситуація, з якою ви зіткнулися з такої нагоди, потребує декількох посвідчень?
willy winka

У рідкісному сценарії, коли у вас немає доступу до вихідного HTML (наприклад, при створенні проксі-серверів), якщо вам потрібно націлити на елемент, який має кілька ідентифікаторів, слід вибрати елемент css [id = "один два три" '].
JisuKim82

Це дійсно залежить від цитованих специфікацій (і, ймовірно, впроваджених) та контексту в них. тобто w3.org/TR/html5/dom.html#the-id-attribute та старіший, який вказує на "так"? w3.org/TR/2011/WD-html5-20110525/elements.html#the-id-attribute
Марк

1
@willywonka Я знаю, що це як через 2 роки, але я наткнувся на цю статтю, зараз шукаючи відповідь на це, і відчув, як поділитися сценарієм з вами, я натрапив, оскільки ви ніколи не отримали відповіді. Я роблю проект для freecodecamp для створення калькулятора JS. Вони хочуть, щоб ідентифікатор для виводу був "відображенням", щоб вони могли запустити свої тести проти нього, але я створюю науковий калькулятор з двома дисплеями: #input та #output, тому дисплей #input ТАКОЖ потребує "display" id значення на додаток до значення "введення" я хочу надати його для узгодженості.
Tara Stahler

1
Привіт @TaraStahler ! Наскільки я знаю, браузер видасть перше, лише якщо ви використовуєте позначення <... id = "input" id = "display" ...>, а також ідентифікатор не повинен містити пробілів (ні вкладок), так позначення <... id = "відображення входу" ...> взагалі недійсне. Просто експериментував Javascript з консоллю Chrome, і він повертає "Uncaught ReferenceError: дисплей не визначений" в обох випадках. Тільки перший випадок повертає об'єкт, якщо я отримую його з першим ідентифікатором, другий - недосяжний. У другому випадку жоден ідентифікатор не досяжний. Можливо, вам потрібно переробляти код?
willy winka

Відповіді:


205

Ні. Від XHTML 1.0 Spec

У XML ідентифікатори фрагментів мають ідентифікатор типу, і на елемент може бути лише один атрибут типу ID. Тому в XHTML 1.0 атрибут id визначається як ідентифікатор типу. Щоб гарантувати, що документи XHTML 1.0 є добре структурованими документами XML, документи XHTML 1.0 ОБОВ'ЯЗКОВО використовувати атрибут id при визначенні ідентифікаторів фрагментів на перелічених вище елементах. Інформацію щодо забезпечення таких якорів є сумісними назад при поданні XHTML-документів у вигляді медіатексту / html-інформації, див.


7
"ідентифікатори фрагментів мають ідентифікатор типу, і може бути лише один атрибут ідентифікатора типу на елемент." Тут сказано, що один атрибут та атрибут відрізняються від значень атрибута. Він не говорить, що те значення атрибута не повинно в жодному контексті припускати багатозначне або через пробіл, або через будь-яке розділення символів. Хоча в специфікації сказано, що для зворотної сумісності він не повинен містити символу пробілу в значеннях атрибутів Ідентифікатори фрагментів (w3.org/TR/xhtml1/#guidelines) Отже, якщо ви хочете висловити багатозначні ідентифікатори, ви повинні виразити його інакше
Рішев Бебедор

2
Залежить від специфікації, яку ви цитуєте, я думаю. "Ця специфікація не перешкоджає наявності елемента з декількома ідентифікаторами ..." w3.org/TR/2011/WD-html5-20110525/elements.html#the-id-attribute
Марк

Дивіться тут, де вилучено це речення w3.org/TR/html5/dom.html#the-id-attribute
Марк

Гаразд, я зробив, що ця відповідь підкреслила позначку в 200 нагород. Все добре. Я бачу себе поза межами.
Хофі

196

Всупереч сказаному всіма, правильна відповідь ТАК

Специфікація селекторів дуже чітка щодо цього:

Якщо в елементі є кілька атрибутів ідентифікатора, усі вони повинні розглядатися як ідентифікатори цього елемента для цілей селектора ідентифікаторів. Така ситуація може бути досягнута за допомогою сумішей xml: id, DOM3 Core, XML DTD та конкретного простору імен знання.


Редагувати

Просто для уточнення: Так, елемент XHTML може мати кілька ідентифікаторів, наприклад

<p id="foo" xml:id="bar">

але присвоєння декількох ідентифікаторів одному і тому ж idатрибуту за допомогою розділеного пробілом списку неможливо.


7
Чудова відповідь - тепер це поставило кота серед голубів.
TrojanName

3
На жаль, це не специфікація CSS, яка тут діє. Для HTML / XHTML ви повинні подивитися на цю специфікацію, і специфікація там точно говорить про те, що кожен елемент може мати максимум один ідентифікатор, і цей ідентифікатор повинен бути унікальним на сторінці: w3.org/TR/html401/struct/global. html # h-7.5.2 (для HTML 4)
tvanfosson

9
@tvanfosson: Дивно, але специфікація HTML4 НЕ говорить про те, що кожен елемент може мати не більше одного ідентифікатора. Якщо ви подивитеся на специфікації HTML5 , ви навіть побачите, що This specification doesn't preclude an element having multiple IDs, if other mechanisms (e.g. DOM Core methods) can set an element's ID in a way that doesn't conflict with the id attribute.(що відповідає специфікаціям CSS)
user123444555621

1
у вас може бути лише один атрибут id, а формат вмісту атрибута id виключає наявність пробілів. У контексті запитання - надання ідентифікаторів HTML-елемента 2 - це неможливо зробити ні в HTML 4, ні в HTML 5. Ви припускаєте, що надання йому ідентифікатора, який працює з CSS, достатньо для що він намагається зробити, і може бути, що мати xmlid спрацювало б, але я не бачу, як ви це не зможете зрозуміти як написано. Приклад, який він показує, не працюватиме ні в HTML 4, ні в HTML 5, і немає можливості змусити його виконати те, що показано.
tvanfosson

6
Я upvoted цієї відповіді , як він відповідає на питання: « може вам призначити кілька ідентифікаторів елемент?» Однак слід додати, що це виходить за рамки простих специфікацій; як показано у прийнятій відповіді, коли мова заходить про сам HTML / XHTML, специфікація говорить, що ви можете призначити ідентифікатор лише за допомогою idатрибута. Для уточнення, xml:idатрибут (а насправді будь-який атрибут за межами простору імен за замовчуванням) недійсний у XHTML. Однак, як ви цитуєте з специфікації HTML5, це жодним чином не призводить xml:id="bar"до того, що мовчки виходять з ладу; він все одно додасть barідентифікатор до цього елемента, що дозволить йому відповідати #bar.
BoltClock

28

Моє розуміння завжди було:

  • Ідентифікатори одноразові і застосовуються лише до одного елемента ...

    • Кожному приписується як Унікальний ідентифікатор (лише) одному єдиному елементу .
  • Заняття можна використовувати не раз ...

    • Тому вони можуть бути застосовані до більш ніж одного елемента , і аналогічно все ж різного, на елемент може бути більше одного класу (тобто декількох класів) .

18
Я не думаю, що це може бути відповіддю на питання. Питання: "Чи можна використовувати кілька ідентифікаторів для одного елемента?"
Кевін

4
@kevin Ця відповідь припускає, що ОП стикається з проблемою XY і напевно може допомогти тому, хто намагається досягти поведінки класу за допомогою ідентифікаторів - з будь-якої причини.
Махді

Ви посилаєтесь на "разове використання", але це може спричинити плутанину. Ви можете і є частою і правильною річчю використовувати кілька разів один елемент за своїм ідентифікатором. Я думаю, що ви звертаєтесь до іншої інтерпретації: ви можете використовувати один (і лише один) ідентифікатор для елемента і ТОЛЬКО для цього елемента.
Mbotet

27

Ні. Хоча визначення w3c для HTML 4, схоже, явно не охоплює ваше запитання, визначення атрибута імені та id говорить про відсутність пробілів в ідентифікаторі:

Токени ID та NAME повинні починатися з літери ([A-Za-z]) і може супроводжуватися будь-якою кількістю літер, цифр ([0-9]), дефісів ("-"), підкреслення ("_") , двокрапки (":") та періоди (".").


20

Ні. Кожен елемент DOM, якщо він має ідентифікатор, має єдиний унікальний ідентифікатор. Ви можете наблизити це, використовуючи щось на кшталт:

<div id='enclosing_id_123'><span id='enclosed_id_123'></span></div>

а потім скористайтеся навігацією, щоб отримати те, що ви дійсно хочете.

Якщо ви просто хочете застосувати стилі, імена класів краще.


Це б порушило перевірку дій.
Aupajo

3
Що є протиправним у цій відповіді? Чи може хтось пояснити голосування проти?
tpower

19
Не я. :-) І я не впевнений, що ти маєш на увазі про порушення перевірки? Ідентифікатори Div та Span відрізняються (додаються проти додаються), тому не виникає проблем з дублюючими ідентифікаторами. Можливо, деякі люди читають не дуже уважно.
tvanfosson

4
Пограбувати банк незаконно, питання програмного забезпечення ніколи не є незаконним. Це знову ця стара віртуальна реальність проти фактичної реальності:
P

@BrianFenton налагодження коду elses код змусив мене зрозуміти, що це має бути незаконним. Я кажу, що 5 років тюремного ув'язнення за те, щоб не дотримуватися специфікацій без поважних причин не робити цього.
ПроблемиOfSumit

18

Ви можете мати лише один ідентифікатор на елемент, але ви можете мати більше одного класу. Але не майте декількох атрибутів класу, покладіть кілька значень класу в один атрибут.

<div id="foo" class="bar baz bax">

є абсолютно законним.


4

Ні, ви не можете мати кілька ідентифікаторів для одного тегу, але я бачив тег з nameатрибутом та idатрибутом, які деякі програми обробляють однаковим чином.


1
в IE, перед IE8, так. але вони виправили цю помилку в стандартному режимі зараз. getElementById () використовується для неправильного повернення елем, що відповідають регістру, нечутливим до імені та ідентифікатора.
сканліфф

4

Ні, вам слід використовувати вкладені DIV, якщо ви хочете рухатися вниз по цьому шляху. Крім того, навіть якби ви могли, уявіть собі плутанину, яку вона може спричинити при запуску document.getElementByID (). Який ідентифікатор збирається, якщо є кілька?

У дещо пов'язаній темі ви можете додати кілька класів до DIV. Дивіться дискусію Еріка Майєрса на,

http://meyerweb.com/eric/articles/webrev/199802a.html


1
Чи не отримав би ідентифікатор, вказаний між круглими дужками? getElementById();не робить нічого без рядка із зазначенням, що отримати ?! getElementById('foo');отримає елемент з foo як ідентифікатор! Тут не має значення декілька ідентифікаторів. Ще б шукали "foo".
Рін і Лен

3
Any ID assigned to a div element is unique.
However, you can assign multiple IDs "under", and not "to" a div element.
In that case, you have to represent those IDs as <span></span> IDs.

Say, you want two links in the same HTML page to point to the same div element in  the page.

The two different links
<p><a href="#exponentialEquationsCalculator">Exponential Equations</a></p>         

<p><a href="#logarithmicExpressionsCalculator"><Logarithmic Expressions</a></p>

Point to the same section of the page. 
<!-- Exponential / Logarithmic Equations Calculator -->
<div class="w3-container w3-card white w3-margin-bottom">      
   <span id="exponentialEquationsCalculator"></span>
   <span id="logarithmicEquationsCalculator"></span>
</div>

2

http://www.w3.org/TR/REC-html40/struct/global.html#h-7.5.2

Атрибут id присвоює унікальний ідентифікатор елементу (який може бути підтверджений аналізатором SGML).

і

Токени ID та NAME повинні починатися з літери ([A-Za-z]) і може супроводжуватися будь-якою кількістю літер, цифр ([0-9]), дефісів ("-"), підкреслення ("_") , двокрапки (":") та періоди (".").

Отже, "id" повинен бути унікальним і не може містити пробілів.


1

Я б хотів сказати технічно так, оскільки дійсно те, що отримується, технічно завжди залежить від браузера. Більшість браузерів намагаються дотримуватися технічних характеристик якнайкраще, і наскільки я знаю, у специфікаціях css нічого проти цього немає. Я збираюся поручитися лише за фактичний html, css, код JavaScript, який надсилається до браузера перед будь-яким іншим кроком інтерпретатора.

Однак я також кажу "ні", оскільки кожен браузер, на який я зазвичай тестую, насправді не дозволяє. Якщо вам потрібно переконатися, збережіть таке у форматі .html та відкрийте його в основних браузерах. У всіх браузерах, які я перевіряв, функція javascript не відповідає елементу. Однак видаліть або "hunkojunk" з тегу id, і все працює добре. Зразок коду

<html>
<head>
</head>
<body>
    <p id="hunkojunk1 hunkojunk2"></p>

<script type="text/javascript">
    document.getElementById('hunkojunk2').innerHTML = "JUNK JUNK JUNK JUNK JUNK JUNK";
</script>
</body>
</html>

1

Немає.

Сказавши це, ніщо не заважає вам це робити. Але ви отримаєте непослідовну поведінку з різними браузерами. Не робіть цього. 1 ідентифікатор на елемент.

Якщо потрібно декілька призначень елемента, використовуйте класи (розділені пробілом).


0

Це цікаво, але наскільки я знаю, відповідь є твердою "ні". Я не бачу, для чого вам потрібен вкладений ідентифікатор, оскільки ви зазвичай перетинаєте його з іншим елементом, який має той самий вкладений ідентифікатор. Якщо у вас немає сенсу, якщо ви все ще маєте дуже мало сенсу.


1
Мені б хотілося також використовувати 2 ідентифікатора для зворотної сумісності. наприклад, у попередній версії те, що раніше було у статті 8, але тепер називається node-8, що має 2 ідентифікатора одного елемента, запобігає кодування обхідного рішення, щоб зробити його сумісним назад. Хоча обидва ідентифікатори залишатимуться унікальними ідентифікаторами.
ЛЕТ

0

Я знаю, що це рік, але мені було цікаво про це самому, і я впевнений, що інші знайдуть тут свій шлях. Проста відповідь - ні, як казали переді мною інші. Елемент не може мати більше одного ідентифікатора, а ідентифікатор не можна використовувати більше ніж один раз на сторінці. Спробуйте, і ви побачите, як добре це не працює.

У відповідь на відповідь tvanfosson щодо використання одного і того ж ідентифікатора у двох різних елементах. Наскільки мені відомо, ідентифікатор може бути використаний лише один раз на сторінці, незалежно від того, доданий він до іншого тегу.

За визначенням, елемент, який потребує ідентифікатора, повинен бути унікальним, але якщо вам потрібні два ідентифікатори, то він насправді не унікальний і натомість потрібен клас.


1
Але, якщо ви читаєте відповідь tvanfosson, два ідентифікатори явно відрізняються "enclosing_id_123"! = "Enclosed_id_123"
Ben

0

класи спеціально для цього зроблені, ось код, з якого можна зрозуміти

<html>
<head>
    <style type="text/css">
     .personal{
            height:100px;
            width: 100px;   

        }
    .fam{
            border: 2px solid #ccc;
        }   
    .x{
            background-color:#ccc;
        }   

    </style>
</head>
<body>

    <div class="personal fam x"></div>

</body> 
</html>


-1

Ідентифікатори повинні бути унікальними, тому вам слід використовувати певний ідентифікатор лише один раз на сторінці. Заняття можуть використовуватися неодноразово.

перевірте https://www.w3schools.com/html/html_id.asp для отримання більш детальної інформації.


-4

Я не думаю, що у вас може бути два Id, але це повинно бути можливим. Використання одного і того ж ідентифікатора двічі - це інший випадок ... як двоє людей, які використовують один і той же паспорт. Однак одна людина може мати декілька паспортів. Прийшов шукати це, оскільки у мене ситуація, коли один працівник може мати кілька функцій. Скажіть, "sysadm" і "Координатор команди", що мають id = "sysadm teamcoordinator", дозволить мені посилатись на них з інших сторінок, щоб службовці.html # sysadm і службовці. інше може взяти на себе функцію координатора команди, поки система залишається системою ... тоді мені потрібно лише змінити ідентифікатори на сторінці Employ.html ... але, як я вже сказав, це не працює :(

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.