Несовместимость jQuery и XHTML по вине Opera

Sep 05, 2009 08:49


У меня всегда было предубеждение против этого браузера (а его распространённость в России по контрасту с грызущей Европу кавайной красной пандой Firefox казалась досадной несуразностью) и вот - реальная подлянка в реальном проекте.

Итак: я стараюсь придерживаться новейших принятых стандартов. В области Web-вёрстки это XHTML (недавно всплыла перспектива HTML 5, но это ещё не вполне сегодняшний день). Версия 1.1 не годится из-за IE, который не понимает MIME-тип application/xml+xhtml, с коим XHTML 1.1 в обязательном порядке должен быть поставляем. Посему я выбираю XHTML 1.0 Strict, поставляя его нормальным (казалось бы) браузерам с родным MIME-типом, а IE - как text/html. С этим всё в порядке, это часто делают прямо через PHP, но я выпендрился и написал .htaccess. Это работает (у Opera есть ещё закидон, связанный с методом setRequestHeader объекта XMLHttpRequest, но с этим я ещё не разобрался и это тут не мешает, так что об этом как-нибудь отдельно).

На клиентской стороне используется jQuery. Если нужно вставить в документ новый код (там, методом load или html), он прибегает к свойству innerHTML - и вот тут-то начинается веселье. IE нормально вставляет в свой HTML-документ HTML-фрагмент, прочие браузеры (Firefox, Safari) нормально вставляют в свой XHTML-документ XHTML-фрагмент, но Opera… Она за каким-то чёртом преобразует вставляемый через innerHTML текст в соответствии со своим (и не сказать, что неправильным) представлением о HTML (кстати, можно подсунуть любой non-well-formed tag soap!); и её ещё за это хвалили! И это полбеды, что там автоматически вставляются теги (в конце концов, IE делает так же, так что их просто следует ставить сразу и рассчитывать потом встретить в DOM-дереве). Но вот все теги оказываются в верхнем регистре (само собой, после этого XHTML-документ перестаёт быть XHTML-документом)!

И попробуйте-ка после этого сделать выборку по какому-нибудь сложному селектору! Ведь jQuery продолжает считать документ XML-ем, а значит проводит сравнение с учётом регистра. А регистр другой, неправильный.

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

Всё это весьма огорчительно. Неужто придётся отказываться от XHTML и в 2009 г. возвращаться к ветхозаветному HTML 4.01? А что? Вот, другой же наш сотрудник лихо пишет deprecated даже уже в этой «четвёрке» тег и не парится. Но у меня, хм, другое мировоззрение…

P. S. Кстати, ещё одна досадная недоработка в jQuery 1.3.2. Он не использует нативную для браузеров (Safari 3.1+, Firefox 3.1+, Opera 10+ и частично даже IE 8+) выборку по селекторам посредством querySelectorAll в XML-документах, предпочитая собственный (очевидно, более медленный) движок Sizzle. Под странным предлогом: «Only use querySelectorAll on non-XML documents (ID selectors don't work in non-HTML documents)». Да кто же вам сказал, что XML-документы уже обязательно не есть HTML-документы?! XHTML-документы как раз являются и теми и другими одновременно.

javascript, jquery, opera, html, Web-программирование, xhtml

Previous post Next post
Up