Могу ли я обнаружить ошибки синтаксического анализа XHTML, используя Javascript?

Когда у меня появляется ошибка разметки на моей странице XHTML, Mozilla Firefox отображает "Желтый экран смерти", показывая только большое красное сообщение об ошибке на желтом фоне.

Хотя эти ошибки редки, они крайне недружественны для пользователя.

Есть ли способ, которым я могу обнаружить их с помощью Javascript и, таким образом, отправить сообщение обратно на сервер?

Что я обнаружил до сих пор: - Сценарии, помещенные до ошибки синтаксического анализа, все еще выполняются. (Конечно.) - Тайм-ауты и интервалы, которые были установлены в этих сценариях, все еще будут выполняться после ошибки синтаксического анализа. - В Firefox DOM является <parsererror> с <sourcetext> внутри него. Я могу обнаружить это, если я сделаю запрос document.firstChild.tagName,

Остальные вопросы: - Какие есть события, которые я мог бы прослушать, чтобы обнаружить это? (Опрос отстой.) - Как я могу обнаружить это в других браузерах?

5 ответов

Решение

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

Я знаю, что это не то, что вы просили, но если вы не делаете что-то действительно специфичное для XHTML, например, встраиваете какой-то другой язык разметки, вы должны использовать свою страницу как text / html вместо application / xhtml + xml. Даже если это XHTML. Используя его как text / html, вы избежите проблемы, с которой сталкиваетесь, и позволите вашей странице работать в IE. Обратите внимание, что именно тип MIME, а не объявление doctype определяет, какой синтаксический анализатор используется - использование переходного типа документа не сделает этого.

Тем не менее, если вы действительно уверены, что хотите, чтобы ваша страница анализировалась как XHTML, лучше обработать такого рода ошибки на сервере. Создайте свою страницу, создав DOM, а затем отправьте результат ее сериализации. Если это не вариант, начните с создания страницы, как вы делаете сейчас, но пока не передаете ее клиенту. Возьмите созданный вами XHTML и проанализируйте его на стороне сервера с проверяющим анализатором XHTML (или, по крайней мере, универсальным анализатором XML). Если вы получаете ошибки, отобразите любую страницу ошибок, которую вы хотите. В противном случае сериализуйте проанализированный DOM и отправьте его клиенту.

Итак, основные правила использования application / xhtml + xml:

  1. Не.
  2. (Для продвинутых пользователей) Нет, если только вы не доказали, что делаете что-то, что не будет работать, если страница обслуживается как text / html. Это относится к крошечной, крошечной доле процента документов XHTMl.
  3. Если вы должны использовать свою страницу как application / xhtml + xml, сгенерируйте ее с помощью какого-либо метода, который гарантирует достоверность.
  4. Если вы действительно не знаете, что делаете, никогда не используйте application / xhtml + xml для страницы, которая включает ввод пользователя.

Помните, что XHTML - это просто переформулировка HTML 4 плюс возможность встраивания других языков. Если вы не используете встраивание, то у вас есть HTML 4 с другим, но почти полностью совместимым синтаксисом. Подавляющее большинство документов XHTML там представлены как text / html и, таким образом, обрабатываются браузерами как HTML 4.

Мой первый вопрос был бы таков: поскольку Internet Explorer не позволяет вам просто указывать application/xhtml+xml в качестве mime-типа и не поддерживать его так хорошо, зачем вам нужно обнаруживать ошибки синтаксического анализа XHTML?

Что касается обнаружения ошибок - взгляните на http://www.quirksmode.org/

Я бы порекомендовал проверить документ на стороне сервера. Но если вы действительно хотите сделать это на стороне клиента, нет ничего плохого в опросе, если все сделано правильно (это означает, что опрос гарантированно завершится).

Следующее должно работать как минимум в Firefox и Opera:

(function() {
    if(document.documentElement &&
        document.documentElement.getAttribute('xmlns') !==
        'http://www.w3.org/1999/xhtml') {
        alert('parsing errors');
    }
    else if(document.body && document.body.lastChild) {
        alert('no parsing errors');
    }
    else setTimeout(arguments.callee, 100);
})();

Это не отвечает на ваш вопрос, но вместо этого, почему бы не проверить ваш XHTML на вашем сервере, после / когда вы его сгенерируете и перед тем, как отправить его в браузер?

Я знаю, что это, вероятно, не самый полезный ответ, но вы рассматривали возможность перехода на переходный тип документа?

Во что бы то ни стало, поместите ваши файлы через анализатор для обнаружения ошибок, но делайте это в автономном режиме - риск показать пользователям YSOD не стоит!

Другие вопросы по тегам