Неопределенное поведение в (X) HTML? - PullRequest
25 голосов
/ 19 февраля 2011

Я знаю, что этот вопрос в значительной степени требует отрицательных голосов, но ...

Есть ли такая вещь, как неопределенное поведение в (X) HTML?

Я задумался об этом после игры с тегом <button>, который позволяет отображать HTML как кнопку. Пока ничего нового ...

Но я заметил, что можно также использовать тег <a>. Полный пример:

<button>
    normal text
    <b>bold text</b>
    <a href="http://www.example.com/">linked text</a>
</button>

Это выглядит следующим образом в Firefox:
http://img6.imagebanana.com/img/aq10duov/Selection_005.png

А в Google Chrome:
http://img6.imagebanana.com/img/vdlak82n/Selection_008.png

Теперь в Firefox цель ссылки - НЕ , кликабельная, только кнопка ... Однако в Chrome ссылка кликабельна и будет перенаправлена ​​на страницу IANA RFC2606 .

Это неопределенное поведение? Есть ли еще случаи в (X) HTML, которые можно описать как неопределенное поведение?

Ответы [ 4 ]

25 голосов
/ 19 февраля 2011

Это немного сложнее, чем просто проверка DTD, заданная Yi Jiang и mu слишком короткая .

Это правда, что DTD XHTML 1.0 явноЗапретите <a> элементы как дочерние элементы <button> элементов, как указано в вашем вопросе.Однако он не запрещает <a> элементам как потомкам из <button> элементов.

То есть

<button>
    normal text
    <b>bold text</b>
    <span><a href="http://www.example.com/">linked text</a></span>
</button>

соответствует XHTML 1.0 Strict DTD.Но он имеет такое же поведенческое различие между Firefox и Chrome, что и фрагмент кнопки в вопросе.

Теперь известно, что DTD имеют проблемы с описанием ограничений на отношения потомков, поэтому, возможно, не удивительно, что приведенный выше примерDTD соответствует.

Однако. Приложение B спецификации XHTML 1.0 нормативно описывает ограничения потомков в дополнение к DTD.В нем говорится:

Следующие элементы имеют запреты на то, какие элементы они могут содержать (см. Исключения SGML).Этот запрет распространяется на все глубины вложения, т. Е. Содержит все элементы-потомки.

кнопка
не должна содержать ввод, выбор, текстовое поле, метку, кнопку, форму, набор полейэлементы iframe или isindex.

Обратите внимание, что не содержит исключение для элемента <a>.Таким образом, кажется, что XHTML 1.0 не запрещает элементу <a> быть не дочерним потомком <button>, и поведение в этом случае действительно не определено.

Это упущение почти наверняка является ошибкой.Элемент <a> должен был в списке элементов, запрещенных в качестве потомков кнопки в Приложении B.

HTML5 (включая XHTML5) гораздо более подробнопричина.В нем говорится:

4.10.8 Элемент кнопки

Модель содержимого: Фразовое содержимое, но не должно быть потомка интерактивного содержимого.

где интерактивный контент определяется как

Интерактивный контент - это контент, специально предназначенный для взаимодействия с пользователем.

  • a
  • audio (при наличии атрибута controls)
  • button
  • details
  • embed
  • iframe
  • img (если присутствует атрибут usemap)
  • input (если атрибут type не находится в состоянии Hidden)
  • keygen
  • label
  • menu (если атрибут type находится в состоянии toolbar)
  • object (если атрибут usemap
  • select
  • textarea
  • video (при наличии атрибута controls)

Таким образом, в (X) HTML5 элемент <a> является запрещенным быть потомком элемента <button>.

4 голосов
/ 19 февраля 2011

XHTML говорит об этом <button>:

<!-- button uses %Flow; but excludes a, form and form controls -->
<!ENTITY % button.content
   "(#PCDATA | p | %heading; | div | %lists; | %blocktext; |
    table | %special; | %fontstyle; | %phrase; | %misc;)*">

Так что <a> явно исключен и из XHTML. Допустимые элементы внутри <button> в XHTML-1.0 выглядят почти так же, как и в HTML-4.0.

4 голосов
/ 19 февраля 2011

Спецификации HTML 4 объявляют <button> следующим образом:

<!ELEMENT BUTTON - -
     (%flow;)* -(A|%formctrl;|FORM|FIELDSET)
     -- push button -->

Что, , если мое чтение DTD правильное (и я 'я не совсем знаком с этим), элементы <a> явно запрещены для вложенности в button s, поэтому то, что вы просматриваете, это недопустимый HTML, и, следовательно, это неопределенное поведение.

3 голосов
/ 27 февраля 2011

Чтобы добавить к хорошему ответу Алохчи, но более конкретно, чтобы ответить на вопрос: Если ваш (X) HTML равен недопустимый , поведение всегда, для определения , не определено. В этом случае браузеры могут свободно интерпретировать разметку так, как им нравится (или любой другой шанс сделать из нее), или даже отклонять ее (что не делает ни один настоящий браузер).

Это именно та проблема, которая появилась в супе тегов и послужила источником строгих правил синтаксического анализа XML и спецификации HTML5, выросшей до> 500 страниц.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...