Чи слід робити HTML-якіри з 'name' або 'id'?


783

Коли ви хочете звернутися до певної частини веб-сторінки http://example.com/#fooметодом " ", слід скористатися

<h1><a name="foo"/>Foo Title</h1>

або

<h1 id="foo">Foo Title</h1>

Вони обидва працюють, але вони рівні, чи мають смислові відмінності?


2
Посилання насправді має бути http://example.com#foo(так без / до #)
Dana

71
Насправді http://example.com#fooі http://example.com/#fooвони еквівалентні, як визначено в одному з RFC на URI.
Олівер

Відповіді:


616

Відповідно до специфікації HTML 5, 5.9.8 Навігація до ідентифікатора фрагмента :

Для документів HTML (і типу MIME text / html) слід дотримуватися наступної моделі обробки, щоб визначити, що є зазначеною частиною документа.

  1. Проаналізуйте URL-адресу, і нехай fragid буде <fragment> компонентом URL-адреси.
  2. Якщо непомітним є порожній рядок, то зазначена частина документа - це верхня частина документа.
  3. Якщо в DOM є елемент, який має ідентифікатор, точно рівний fragid, тоді першим таким елементом у порядку дерева є зазначена частина документа; зупиніть алгоритм тут.
  4. Якщо в DOM є елемент, який має атрибут імені, значення якого точно дорівнює fragid, то першим таким елементом у порядку дерева є зазначена частина документа; зупиніть алгоритм тут.
  5. В іншому випадку не зазначена частина документа.

Отже, це буде шукати id="foo", а потім буде слідуватиname="foo"

Редагування: Як вказував @hsivonen, у HTML5 aелемент не має атрибута імені. Однак вищезазначені правила все ще застосовуються до інших названих елементів.


76
Між цим алгоритмом і дійсністю не мається на увазі. <a name> недійсний у HTML5, як наразі створено.
hsivonen

13
Насправді це не стосується інших "названих елементів". Що стосується атрибутів імені, то це стосується лише <a name>. Однак цей атрибут може не використовуватися авторами. Її просто повинні шанувати користувальницькі агенти для старих HTML-сторінок.
Енн

19
@RafaelSoares <h1 id="foo">Foo Title</h1>працює навіть в IE6 і є частиною специфікації HTML 4.01
1313

4
Він шукатиме не ім'я = "foo", а <a name="foo">. Дивіться посилання
Даніель Герцог

3
У документі HTML5 з a name="foo"і a id="foo"(незалежно від їхнього порядку на сторінці) Chrome і Firefox перейдуть до id, але IE (перевірено в 11), а Edge перейде доname
Alvaro Montoro

182

Ви не повинні використовувати <h1><a name="foo"/>Foo Title</h1>жоден аромат HTML, який використовується text/html, оскільки синтаксис порожнього елемента XML не підтримується в text/html. Однак <h1><a name="foo">Foo Title</a></h1>у HTML4 гаразд. Він недійсний у HTML5, як зараз розробляється.

<h1 id="foo">Foo Title</h1>добре в HTML4 та HTML5. Це не буде працювати в Netscape 4, але ви, ймовірно, буде використовувати десяток інших функцій, які не працюють у Netscape 4.


6
+1 для розмови про підтримку браузера. Чи є NS4 єдиним, що не підтримує URL-адресу # id => element.id?
Hashbrown

14
@Hashbrown Не вдалося знайти відповіді, тому я зробив тестування. Я виявив, що навіть дуже старі веб-переглядачі ставляться до ids як подібно до nameякорів з точки зору фрагментів URL та сумісності:target селектора CSS . Тестовано: Chrome 6, Firefox 1.5, IE6, Opera 8.02, Safari 3.1.2, Netscape 7.2, Lynx 2.24 та мобільні браузери: Android 2.2, Chrome 26, Dolphin 9.3, Firefox 19, IE10, Safari 4 та Opera Mini 5.1.
Стівен М. Харріс

1
@smhmic, я знайшов його. Веб-браузер Off-By-One розпізнає якіри, визначені за допомогою <a name="foo"/>, але не розпізнає анкери, визначені за допомогою <sometag id = "foo"> OB1 востаннє оновлено> 8 років тому. Його автор може похвалитися, що "це, можливо, найменший та найшвидший веб-браузер із повною підтримкою HTML 3.2". Він вимагає підтримки Win95 через XP, але він працює добре з 64-бітним Win7. Отже, навіщо такий динозавр? Звичайно, для тестування, щоб переконатися, що мої веб-сайти не надто погано спрацьовують з антикваріатними браузерами. Крім того, я також несу OB1 на флешці. Він крихітний, автономний та захищений від інфекцій.
Дейв Бертон

26
Читати це у 2016 році буде як .. Netscape 4?
ADTC

1
використання `<a name="something" id="something> </a> [ЕЛЕМЕНТ ДЛЯ СКОРОСТІ], мабуть, найкраще, оскільки він сумісний, і він не
стилює

52

Я мушу сказати, якщо ви збираєтеся посилатися на цю область на сторінці ... наприклад, page.html # foo та Foo Title не є посиланням, яке ви повинні використовувати:

<h1 id="foo">Foo Title</h1>

Якщо замість цього поставити <a>посилання навколо нього, на заголовок буде впливати <a>конкретна CSS на вашому веб-сайті. Це просто додаткова розмітка, і вона вам не потрібна. Я настійно рекомендую розміщувати ідентифікатор на заголовку не тільки, що він краще формується, але він дозволить вам або адресувати цей об’єкт у Javascript або CSS.


Мало того, але я зіткнувся з дивною помилкою, де відображення: жоден матеріал не відображався в IE. Відсутність будь-якої ідеї точки атаки, я кинув її на валідатор, який позначив записи <a name="foo">, щоб я змінив їх - і тепер дисплей: жоден не працює нормально.
Лорен Печтел

Цього більш ніж достатньо, для досягнення ефекту не потрібна яка-небудь прив'язка.
Уоллес Сідрее

27

У Вікіпедії активно використовується ця функція:

<a href="#History">[...]</a>
<span class="mw-headline" id="History">History</span>

І Вікіпедія працює для всіх, тому я б почувався безпечним дотримуватися цієї форми.

Крім того, не забувайте, ви можете використовувати це не тільки з прольотами, але і з divs або навіть клітинками таблиці, і тоді у вас є доступ до: target pseudo-class на елементі. Просто слідкуйте за тим, щоб не змінювати ширину, як, наприклад, жирним текстом, тому що переміщується вміст навколо, що турбує.

Іменні якіри - мій голос - уникнути:

  • "Імена та ідентифікатори знаходяться в одному просторі імен ..." - Два атрибути з однаковим простором імен просто божевільні. Скажімо, вже застарілі.
  • "Прив’язуючі елементи без href atribute" - І знову ж таки, характер елемента (гіперпосилання чи ні) визначається тим, що має атрибут ?! Подвійний божевільний. Здоровий глузд говорить уникати цього взагалі.
  • Якщо ви коли-небудь стиліть якір без псевдокласу, стайлінг стосується кожного. У CSS3 ви можете обійти це за допомогою селекторів атрибутів (або однакового стилю для кожного псевдокласу), але все-таки це вирішення. Зазвичай це не виходить, оскільки ви вибираєте кольори за псевдокласом, а підкреслення, яке присутнє за замовчуванням, його має лише сенс видалити, що робить його таким же, як і інший текст. Але ви коли-небудь вирішите зробити свої посилання жирними, це спричинить проблеми.
  • Netscape 4 може не підтримувати функцію id, але все ж невідомий атрибут не спричинить жодних проблем. Це те, що для мене викликало сумісність.

1
Запропонуйте редагувати кулю 3 з 4: Якщо ви коли-небудь стилі, a {color:red}вона забарвить як ваші <a href> посилання, так і ваші <a name> фрагменти. Ви можете обійти це за допомогою класів псевдо a:link {color:red]}або атрибутівa:not([href]) {color:red;}
Bob Stein

Ви маєте рацію, але для мене куля 3 говорить саме це. Може бути моєю англійською, хоча ...
Zoltán Morvai,

Нарешті, я зрозумів, що "Якщо ви коли-небудь стиліть якір без псевдокласу, стайлінг стосується кожного". Неоднозначно: Ви можете подумати "кожен псевдоклас". Правильно. Але я думав про "кожен випадок" використання якоря, що означає ім'я та href-ed. Уточнено. :) Не потрібно редагувати після вашого коментаря, але я можу, якщо ви наполягаєте. Але також все ще не схильні траплятися з кольорами, як ви зазвичай маєте намір тримати їх різними, але все-таки однаковими
випадками

сподобалось читати ваші коментарі @ ZoltánMorvai. "подвійний божевільний" і "netscape 4" doubleplusgood.
Ренді Л

1
Два атрибути з однаковим простором імен шалено - насправді. Роблячи створений користувачем вміст, дуже корисно мати можливість вказати щось як посилання на фрагмент <a name="heading1"></a> ... document.html#heading1без встановлення ідентифікатора, оскільки ідентифікатор може зіткнутися з іншим ідентифікатором на сторінці. Прикро, що вони не помістили nameатрибут у HTML5.
Їжак

14
<h1 id="foo">Foo Title</h1>

це те, що слід використовувати. Не використовуйте якір, якщо не хочете посилання.


Ідентична відповіді Тіма Найта, опублікованій за півроку до цього. -1
Люк

13

Голова для користувачів JavaScript: всі ідентифікатори стають глобальними змінними під вікном .

<h1 id="foo">Foo Title</h1>

Щойно створений глобальний JS:

window.foo

Значення window.fooбуде значення HTMLElementдля h1.

Якщо ви не можете гарантувати, що всі значення, використані в idатрибутах, є безпечними, ви можете віддати перевагу дотримуванню name:

<h1 name="foo">Foo Title</h1>

12
Хороша новина полягає в тому, що ви не можете перезаписати функції, визначені в window. Наприклад, <div id="open"></div>функція не буде перезаписана window.open.
Flimm

8

Семантичної різниці немає; тенденція стандартів спрямована на використання, idа не на використання name. Однак існують відмінності, які можуть nameу деяких випадках віддати перевагу . Специфікація HTML 4.01 пропонує такі підказки :

Використовувати idабо name? Автори повинні враховувати такі питання, вирішуючи, використовувати idчи використовувати nameім'я якоря:

  • Атрибут id може виступати не тільки як ім'я якоря (наприклад, селектор аркушів стилів, ідентифікатор обробки тощо).
  • Деякі старші користувацькі агенти не підтримують якір, створений за допомогою атрибута id.
  • Атрибут name дозволяє багатшими якорями імен (з сутностями).

14
Щоб було зрозуміло, коли вони говорять про "агентів старішого користувача", вони означають дійсно старі агенти користувачів. Я б не хвилювався з цього приводу.
Елі

1
HTML5 дозволяє також "багаті" ідентифікатори. Хтось має кількість версій веб-переглядачів із часткою ринку, що перевищує 0,1%, які не можуть обробляти фрагменти, прив’язані до ідентифікації - Або динозавр Netscape 4.7 насправді найбільш поширений?
Роберт Сімер

7
FWIW, я не міг змусити idякоря працювати в Safari для iOS 5, тому це не просто браузери, які вже були "справді старими" в '09. Мені довелося додати names, щоб мій сайт працював належним чином на iPad. Це, можливо, вже було виправлено, я не маю жодного пристрою iOS 6 для перевірки.
Даніель Санер

@DanielSaner насправді? так en.wikipedia.org/wiki/IPad#Applications не працює на вашому iPad?
1313

1
@DanielSaner Я використовував тренажери для тестування мобільних Safari 5.02 і 5.1, а також браузера Android 2.2 і 2.3, а idякорі, здається, працюють універсально. Якщо цей простий приклад не працює на вашому мобільному телефоні, я перевірив би налаштування доступності пристрою. (На мобільному сайті @deathApril у Вікіпедії є Javascript, який ефективно ігнорує фрагмент URL-адреси.)
Стівен М. Харріс

8

Метод ідентифікації не працюватиме на старих браузерах, метод нових імен якоря буде застарілим у нових версіях HTML ... Я б пішов з id.


2
Чи є у вас джерело для цих претензій? Не розумій мене; Мені просто взагалі цікаво.
Генрік Пол

11
Якщо прожектор не просвічує "не працюватиме на старих браузерах". - Які браузери це, крім Netscape 4 ??
Роберт Сімер

3
Я спробував використовувати ідентифікатор на діві, і він працює навіть у IE 7. Не вдалося протестувати в IE 6, хоча .. але хто зараз використовує IE 6 ...
Гіллі

@deathApril у певних випадках (залежить від HASLAYOUT) - це баггі.
Кну

@RobertSiemer Працює майже повсюдно - дивіться мій коментар під цією відповіддю .
Стівен М. Харріс

3

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

<div id="[serial number]" class="topic_wrapper">

2

Лише спостереження щодо розмітки Форма розмітки у попередніх версіях HTML надала опорну точку. Форми розмітки в HTML5 за допомогою атрибута id, хоча в основному є еквівалентними, потребують елемента для ідентифікації, майже всі з яких, як очікується, містять вміст.

Наприклад, може бути використаний порожній проміжок або div, але таке використання виглядає і пахне виродженим.

Одна з думок - використовувати елемент wbr для цієї мети. Wbr має порожню модель вмісту і просто заявляє, що можливий розрив рядка; це все ще трохи безоплатно використання тегів розмітки, але набагато менше, ніж безоплатно ділення документів або порожній проміжок тексту.


Це хороший момент. Більше інформації про wbr: w3.org/TR/html-markup/wbr.html Використовуйте, <wbr id="foo" />а не<a name="foo"></a>
Лука

1

Другий зразок присвоює унікальний ідентифікатор цьому елементу. Потім цим елементом можна керувати або отримати доступ за допомогою DHTML.

Перший, з іншого боку, встановлює назване місце в документі, схоже на закладку. Прикріплений до «якоря», має ідеальний сенс.


1

У html 5 id=""атрибут визначає унікальний ідентифікатор для елемента, який також є якорем для фрагмента зв'язку. У попередніх стандартах html name=""атрибут <a>елемента визначає якір для посилання на фрагмент. Я рекомендую щось на кшталт:
<a name="foo" id="foo"></a><h1>Foo Title</h1>
Оскільки підтримка id=""атрибуту є дещо плямистою (навіть якщо останні версії всіх основних браузерів підтримують його, випуски, які не мають кількох років [І найкраще щось не порушувати) якщо немає вагомих причин]). Він сумісний, і він не стилює те, що є в елементі посилання, оскільки закриття </a> все ще знаходиться поза елементом, але воно все ще діє у всіх чинних стандартах.

Переконайтесь, що name=""і id=""атрибути <a>елемента однакові.


2
Не все, що використовує HTML, - це браузер. Я використовую бібліотеку Java, яка відображає інформацію у вікні за допомогою HTML. Це єдиний метод, який спрацював. Це nameатрибут потрібного тегу прив’язки; розміщення атрибутів на hNабо spanне працює.
Марс

0

Як щодо використання атрибута name для старих браузерів та атрибута id для нових браузерів. Будуть використані обидва варіанти, і за замовчуванням буде застосовано резервний метод !!!


-3

Вся концепція "названий якор" використовує атрибут name за визначенням. Вам слід просто дотримуватися використання імені, але атрибут ID може бути корисним для деяких ситуацій javascript.

Як і в коментарях, ви завжди можете використовувати обидва, щоб хеджувати свої ставки.


Чи використовуються обидва, чи є id: s та імена глобально унікальними? як у, чи можу я використовувати той самий рядок, що і id і ім'я?
Генрік Пол

Можна, але деякі люди вважають, що це погана практика.
Алекс Форт

9
Відповідно до специфікації HTML, якщо вони є обома, ім'я та ідентифікатор повинні бути однаковими. Це також говорить, що імена та ідентифікатори знаходяться в одному просторі імен. Служба перевірки HTML не перевіряє їх на це, і я сумніваюся, що браузер доглядає, але, здається, все-таки хороші вказівки.
Еріксон

3
Реальність переосмислена! <ім'я ... хворіло з самого початку, і стилізація CSS-посилань робить його ще гіршим.
Роберт Сімер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.