Почему тег ввода не разрешен непосредственно внутри тега формы?

Я только что прочитал следующее на http://w3fools.com/#html_forms:

Элементы неблочного уровня (такие как <input>) недействительны непосредственно внутри тегов <form> до HTML5.

Я никогда не слышал ничего подобного, и каждый базовый учебник по HTML, который я видел, кажется, прекрасно справляется с размещением тегов ввода непосредственно внутри тега формы. Итак, мой вопрос состоит из трех частей:

  • Правомерно ли приведенное выше утверждение?
  • Почему это так? (Был ли это просто недосмотр или создатели спецификации HTML пытались предотвратить определенные проблемы, создавая это правило?)
  • Каков рекомендуемый способ создания формы с входными данными? (Мы просто должны создать div или таблицу непосредственно внутри тега формы?)

person StriplingWarrior    schedule 25.03.2011    source источник
comment
Да, прямые потомки элементов FORM должны быть элементами блочного уровня. См. здесь: vidasp.net/HTML-structure-diagram.html   -  person Šime Vidas    schedule 26.03.2011


Ответы (4)


Это педантизм стандартов.

  • Заявление является законным в соответствии со стандартом: в HTML 4.01 определение для <form> указывает, что оно может содержать только блочные элементы или <script>. Насколько позволяет каждый браузер в мире, все в порядке.
  • Я могу только догадываться, что они считают, что <form> вообще не является тегом макета, и они хотят, чтобы все встроенные элементы содержались внутри блочного элемента.
  • Да, вы должны поместить <div>, <table>, <p> или какой-либо другой блочный презентационный элемент внутри <form>.
person Anomie    schedule 25.03.2011
comment
Для меня так странно, что спецификация говорит, что элемент FORM действует как контейнер для элементов управления, а форма может содержать текст и разметку (абзацы, списки и т. д.) в дополнение к элементам управления формы, но тогда они этого не разрешают. содержать элементы управления напрямую. - person StriplingWarrior; 27.03.2011

Вышеприведенное утверждение верно. В HTML тег ‹input› не является допустимым элементом тега ‹form›. Чтобы это проверить, вам нужно заключить тег ‹input› либо с ‹fieldset›, либо с ‹div›. Что продемонстрировано ниже.

<form action="/" method="post">
    <fieldset>
        Field: <input type="text" name="field" />
        <br />
        <input type="submit" value="Submit" />
    </fieldset>
</form>
person Community    schedule 25.03.2011

Прежде всего, я хотел бы отметить, что нет ничего удивительного в том, что учебные пособия по HTML учат вас делать что-то неправильно — HTML практически был разработан, чтобы принимать любые способы выполнения действий. Вы можете оставлять теги незакрытыми, вы можете неправильно вкладывать их и так далее, что является одной из причин, по которым я лично использую XHTML.

Это утверждение кажется верным, но из-за того, как устроен HTML, на практике это не имеет значения. XHTML, вероятно, запрещает это.

Форма на самом деле не является контейнером любого рода. Похоже, что создатели спецификации HTML любили такие вещи, как блочные элементы, в которые вы должны помещать все. Это всего лишь мой взгляд на это, но, насколько я заметил, неблочные элементы не следует использовать без надлежащего контейнера для них. Это точно так же, как вы не должны помещать элементы неблочного уровня в <blockquote>. Элементы уровня блока являются контейнерами для других элементов.

Блок div, таблица — я думаю, что здесь даже <p> делает свое дело.

person Community    schedule 25.03.2011

Ну, в соответствии со спецификацией HTML 4.01 (в частности, раздел 17.3), это технически верно. Однако я не знаю ни одного веб-браузера, который действительно вызвал бы у вас проблемы.

person Harry Steinhilber    schedule 25.03.2011