Подтвердить что ты не робот

Undefined поведение в (X) HTML?

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

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

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

<button>
    normal text
    <b>bold text</b>
    <a href="#" onclick="location.href='http://www.example.com/'; return false;">linked text</a>
</button>

На Firefox это выглядит следующим образом:

И в Google Chrome:

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

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

4b9b3361

Ответ 1

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

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

So

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

- XHTML 1.0 Строгое DTD-совместимое. Но он имеет ту же поведенческую разницу между Firefox и Chrome как фрагмент кнопки в вопросе.

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

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

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

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

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

Это упущение - почти наверняка ошибка. Элемент <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>.

Ответ 2

спецификации HTML 4 объявляет <button> как таковой:

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

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

Ответ 3

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

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

Это именно та проблема, которую представил суп-тег, и это стало началом строгих правил синтаксического анализа XML, а спецификация HTML5 увеличилась до 500 страниц.