2010-03-21 3 views
6

Любопытно узнать, какие именно проблемы я вызову, если я включу несколько элементов на моей веб-странице с тем же идентификатором?Каковы побочные эффекты использования нескольких экземпляров одного имени в HTML?

, например:

<div id='someID'>Some Content</div> 
<div id='someID'>Some Other Content</div> 
+1

Зачем вам это нужно? – RichardOD

+4

Мне нехорошо знать, почему я этого не делаю. –

+1

Незначительный комментарий: это условное соглашение HTML, чтобы использовать doublequotes, а не singlequotes, чтобы разграничить значения атрибутов. – BalusC

ответ

7

При попытке ссылки на эти элементы из JavaScript он не сможет решить, к какому элементу вы обращаетесь. В зависимости от конкретного интерпретатора JavaScript, который вы используете, вы можете либо получить ошибки, либо неопределенное поведение - оба случая нежелательны.

Спецификация HTML указывает, что идентификатор должен быть уникальным, поэтому ваш HTML будет считаться недействительным и может привести к откату браузеров в рендеринг режима quirks или даже полностью отказаться от рендеринга вашей страницы (хотя это маловероятно, и все текущие браузеры будут делать что-то - технически, если вы не будете следовать спецификации, браузер не обязан ничего делать, кроме как отклонить вашу страницу).

Вы должны рассмотреть вопрос об использовании имен классов вместо этого, если вы хотите что-то, чтобы определить несколько элементов с помощью:

<div class="someClass">Some Content</div> 
<div class="someClass">Some Other Content</div> 

Blair указал в комментариях ниже, что, если вам нужно искать элементы по классам от JavaScript, вы можете ускорить поиск, перейдя от ближайшего элемента с идентификатором, а также скажите, какой тип узла искать.Это может держать скорость доступа быстро в большинстве случаев, но не нарушает никаких правил на дублирующих идентификаторами:

HTML: 
<div id="myNearestID"> 
    <div class="someClass">Some Content</div> 
    <div class="someClass">Some Other Content</div> 
</div> 

JavaScript+JQuery: 
$('#myNearestID div.someClass') 
+0

true, нет встроенного javascript для целевых элементов по классу. jQuery очень медленный, чтобы идти, хотя они, так что это не совсем то же самое. –

+0

Я получаю намного быстрее, хотя, если вы переходите от ближайшего элемента с идентификатором, а также рассказываете, какой тип узла искать. '$ ('# myNearestID div.someClass')' в этом случае. –

+0

@ user278457: Да, но если вы используете дублированный идентификатор, нет гарантии, что он даже сработает. Это похоже на то, что вы хотите использовать один и тот же URL для двух веб-сайтов, потому что это избавляет от необходимости выполнять несколько запросов DNS. Что бы вы предпочли, быстро или правильно. @Blair. Хорошее предложение. Спасибо за это, я включу его в ответ. –

0

Затем, который один контроль вы хотите обратиться, когда вы делаете что-то подобное в Javascript: -

document.getElementById("someID") 
1

Я не уверен, как браузеры отображают правила CSS типа #someID (они, вероятно, применит правило ко всем таким элементам), но у вас наверняка возникнут проблемы с JavaScript и getElementById.

6

IE будет иметь серьезные проблемы с любым javascript, используя ID, это основной побочный эффект.

В целом, идентификаторы уникальны, согласно спецификации ... браузер производитель волен сделать это предположение в коде, и любых ошибок (Javascript, CSS и т.д.), которые возникают в результате недопустимого HTML с участием их .. .Вы, это ваша проблема :)

Браузер не обязан это исправлять, и я не думаю, что они тоже должны.

1

Я читал в другом месте, что IE создает глобальную переменную для каждого элемента с идентификатором.

Я ошибаюсь, говоря, что это тоже проблема?

0

Я не думаю, что браузеры будут жаловаться, но и другие проблемы, которые вы бы наблюдать являются:

  • страница может не подтвердить из-за dulicate ID декларации
  • The JavaScript, который может работать на странице может перестать работать правильно, если они находят элементы по идентификатору так как в это время, он получит неправильный элемент
  • Правила использования CSS ed в #ID будет повторяться ко всем элементам, которые имеют одинаковый идентификатор

Я думаю, что для этого достаточно проблем, чтобы не использовать один и тот же идентификатор для всех элементов.

HTH.

1

Еще пару пунктов, которые еще не были указаны.

Идентификаторы фрагментов: Как браузер обработает ссылку на http://www.example.com#someID?

Внутренние ссылки: Если какой-либо идентификатор был на двух входных элементах, а у вас был < ярлык for = "someID" > ... если пользователь нажал на метку, браузеру пришлось бы решить, какой вход должен получать фокус. (В HTML5 это определяется как первый вход, что не обязательно то, что вы хотите). Аналогично, для поддержки ARIA некоторые атрибуты, такие как aria-labelledby и aria, описаны, опираясь на то, чтобы указывать на одно место.

+0

Я узнал свой html в 1994 году, тогда www.example.com # someID прыгнул бы до Section headline , За последние годы это изменилось? Я не знал, что вы можете перейти к тегу, указав его идентификатор в Url. –

+1

Да. Спецификация HTML4.01 говорит: «Целевые привязки в HTML-документах могут быть указаны либо элементом A (именованием его с атрибутом имени), либо любым другим элементом (именованием атрибута id)». В HTML5 атрибут «name» для элемента «a» устарел. (http://dev.w3.org/html5/spec/obsolete.html#obsolete) – Alohci

+0

Спасибо! Раньше я не знал об этом изменении в HTML5. – stefanglase

0

Браузер сойдет с ума, когда мы ссылаемся на него через JavaScript или где-то еще в файле с кодом.

Смежные вопросы