Почему форма, вложенная в p, не проверяется как XHTML - PullRequest
30 голосов
/ 20 июня 2009

Возьмем, к примеру, этот фрагмент XHTML:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
  <title>A webpage</title>
</head>
<body>
  <p>
    <form action="something.php" method="get">
      <input type="submit" value="Hello"/>
    </form>
  </p>
</body>
</html>

Дерево должно быть допустимым, однако оно не будет правильно обрабатываться в браузере.

Ответы [ 5 ]

57 голосов
/ 20 июня 2009

Посмотрите на сообщения об ошибках, которые вы получаете при попытке http://validator.w3.org

Помимо предупреждения о том, что вы не указали кодировку символов (и, следовательно, предполагается, что используется UTF-8), основная ошибка заключается в том, что <p> не может содержать не встроенное содержимое. Вы можете либо полностью удалить <p> и </p>, либо переместить их внутрь <form>.

Что касается «почему», то это потому, что именно так оно определено в схеме, которая определяет, что является и что не является допустимым XHTML. Если вы посмотрите на этот раздел определения XHTML , вы увидите, что <p> может содержать только текстовые или встроенные (не блокирующие) теги. Однако <form> считается содержимым «блока», а не «встроенным» содержимым.

Другими словами, форма может содержать абзацы, но абзац не может содержать формы.

1 голос
/ 20 июня 2009

Согласно это , потому что:

Строка 8, столбец 44: тип документа не разрешать элемент "форма" здесь; отсутствует один из "объекта", "ins", "del", "map" Старт-тег ✉ Упомянутый элемент не допускается появляться в контексте, в котором Вы поместили это; другой упомянутый элементы являются единственными, которые как разрешено там, так и может содержать элемент упоминается. Это может означать что вам нужен содержащий элемент, или возможно, что вы забыли закрыть предыдущий элемент.

Одна из возможных причин этого сообщения что вы пытались поставить элемент уровня блока (например, "p" или «таблица») внутри встроенного элемента (например, "a", "span" или "Шрифт").

Строка 9, столбец 40: тип документа не разрешать элемент «ввод» здесь; отсутствует один из «p», «h1», «h2», «h3», «h4», «h5», «h6», «div», «pre», "address", "fieldset", "ins", "del" старт-тег input type = "submit" value = "Hello" Упомянутый элемент не может появляться в контекст, в котором вы его поместили; другие упомянутые элементы только те, которые разрешены там и может содержать упомянутый элемент. Это может означать, что вам нужен содержащий элемент, или, возможно, что Вы забыли закрыть предыдущее элемент.

Одна из возможных причин этого сообщения что вы пытались поставить элемент уровня блока (например, "p" или «таблица») внутри встроенного элемента (например, "a", "span" или "Шрифт").

0 голосов
/ 20 июня 2009

Я выполнил тест с вашим HTML-кодом через validator.w3.org , и в результате вам нужно поменять теги P и FORM, чтобы он передавался как действительный HTML W3C.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
  <title>A webpage</title>
</head>
<body>
  <form action="something.php" method="get">
    <p>
      <input type="submit" value="Hello"/>
    </p>
  </form>
</body>
</html>
0 голосов
/ 20 июня 2009

Попробуйте использовать W3C Markup Validator , который сообщит вам, что недопустимо с большинством (X) HTML и CSS документов.

0 голосов
/ 20 июня 2009

Вы не можете поместить форму внутри абзаца. Напишите так:

<body>
  <form action="something.php" method="get">
  <p>
    <input type="submit" value="Hello"/>
  </p>
  </form>
</body>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...