IE9 ошибка с необязательным закрытием </p> - PullRequest
2 голосов
/ 08 октября 2011

Я попробовал этот код в IE9, неожиданно он облажался из-за отсутствия </p> после заголовка.

живое демо

<style>
#MyForm div {
    width: 200px;
    height: 30px;
    float: left;
}
</style>
<div>
    <p><b>Login</b>
    <form id="MyForm" action="test.html">
        <div>
            <label>My Email</label>
            <input />
        </div>
        <div>
            <label>My Password</label>
            <input type="password">
        </div>
    </form>
</div>

Это ошибка или только у меня?

Обновление

Элемент уровня блока недопустим внутри тега "p" согласно W3C

<P>
    <DIV>...</DIV>
</P>

Но закрывать тег <p> необязательно,

<p>content block 1
<p>content block 2
<p>content block 3
<form> ..... </form>

Это кажется действительным. Элемент блока должен автоматически закрыться <p>, если он не закрыт явно, как в первом примере.

Ответы [ 5 ]

6 голосов
/ 08 октября 2011

Это похоже на ошибку IE9.

После дополнительного тестирования (и добавления в форму нескольких <span>) в режиме стандартов IE9 создается впечатление, что IE9 не может распознать, что <form> не разрешено как потомок <p>, но признает, что <div> также не допускается.

Следовательно, он вставляет элементы в качестве потомков узла p-элемента, пока не встретит первый <div>, после чего он завершает <form> и <p>, а затем вставляет оставшуюся часть тело формы после формы.

Когда он встречает </form>, он обрабатывает его как конечный тег для неоткрытого элемента и игнорирует его.

4 голосов
/ 08 октября 2011

После работы с образцом Fiddle в течение минуты я могу подтвердить, что IE9 имеет проблемы с ним.Однако другие браузеры также могут иметь такую ​​же проблему, хотя я не подтвердил.Проблема в том, что IE9 считает, что вы вложили элемент уровня блока (div) в тег p.Это не правильно.Это то, что вызывает ошибки макета.Я даже оставил p закрытым и изменил div на span, и он работал просто отлично.Вы также можете закрыть тег p.

2 голосов
/ 08 октября 2011

Старые версии браузеров не заботились так сильно, если вы упускали такие вещи, как </p>; они будут пытаться исправить это. Это плохая практика, которая начинает подавляться, поэтому она не работает в новых браузерах / версиях HTML.

1 голос
/ 08 октября 2011

Хотя я ценю сарказм в ответе Джона, для ясности, на самом деле это не ошибка в браузере.

То, что происходит, - браузер написан, пытаясь соответствовать стандартам. Стандарты определяют ожидаемое поведение при наличии действительного HTML. Когда задан неработающий HTML, стандарт молчит, и поэтому, если IE9 пытается исправить отсутствующий тег, он предполагает, что он принадлежит в другом месте, и IE9 отображает его неправильно.

Вы можете заставить IE9 попытаться исправить плохой HTML, нажав F12 и изменив настройки совместимости.

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

0 голосов
/ 08 августа 2017

Я периодически сталкиваюсь с этой ошибкой. Если вы закроете свои P или просто удалите их, если это возможно, ФОРМА будет вести себя нормально. Может быть трудно отследить эту проблему, потому что она может проявляться во множестве разных способов. Совсем недавно для меня не было визуального сигнала рендеринга, но я получал бессмысленные ошибки javascript только в IE9.

Обычно я могу просто удалить тег P прямо перед формой, чтобы решить проблему.

...