Причина, по которой вы получаете это, состоит в том, что вы запутали .innerHTML в значении исходного кода div - .innerHTML содержит HTML , а не текст исходного кода. Это могут быть две разные вещи. В этом случае лишний пробел не имеет смысла для парсера HTML - он может отказаться от бессмысленного лишнего пробела.
В другом примере посмотрите на заглавные буквы - вы, возможно, этого не заметили, но в вашем диалоговом окне с предупреждением, вероятно, отображаются имена тегов с заглавной буквы в IE.
И перед тем, как вы начнете на "вину IE", я предлагаю вам попробовать следующее в FireFox:
<div onclick="alert(this.innerHTML);">
<p>Since you saw <span title=":P" class="emoticon tongue"></span> if <strong>you read</strong> the intro post <span title=":D" class="emoticon laugh"></span><span title=":D" class="emoticon laugh"></span><u<i> a</p>
</div>
Я добавил сломанный тег рядом с: <u<i>
В IE, Safari, Opera и Chrome браузер правильно интерпретирует это как неверное имя тега (это не подчеркивание или курсив). Однако у движка Mozilla была длительная ошибка, из-за которой он не только видит тег подчеркивания (он не должен этого делать, поскольку технически является частью имени, а допустимый тег с именем «u <» отсутствует) равен <em>также интерпретирует там курсив. Запустите код в Mozilla / FireFox, и ваше диалоговое окно с предупреждением будет содержать следующую строку: <u ><i> a</i></u>
. Вы, конечно, не написали это, не так ли? Однако это правильное поведение; innerHTML возвращает HTML , полученный браузером, а не исходный код. Поскольку Mozilla извлекает эти теги, они возвращаются правильно, когда вы их запрашиваете.
РЕДАКТИРОВАТЬ: чтобы уточнить мою терминологию, я использую «HTML» для ссылки на дерево DOM HTML (конечно, для создания дерева DOM синтаксический анализатор HTML не требуется, но в какой-то момент он преобразует текст в менее двусмысленную проанализированную форму, которую я называю HTML ), и «Исходный код» для ссылки на текст исходного кода HTML, который анализируется для его создания.