юли 26

Internet Explorer, jQuery, AJAX … егати комбинацията

Няма такава боза като Internet Explorer. Просто няма. Супер непредсказуемо се дъни на най-неочакваните места, което прави дебъгването истински кошмар. Ето последното ми преживяване: работя върху интерфейс, който е супер тежко натоварен със всякакви AJAX и DHTML красоти, и който е много важно да работи навсякъде. Най-големия помощник в тази задача е jQuery, който работи супер стабилно навсякъде, и може да ти спести по-голямата част от cross-compatibility проблемите при „мултиплатформеността“ да се работе с много браузъри. За съжаление, това не винаги помага. При рутинна проверка за това как върви интерфейса под IE6, излиза следната грешка:

Could not complete the operation due to error 80020101

При проверка с IE7, отново на същото място от тестовете излиза същата грешка. Така, супер описателно съобщение, нали … Преравям интернета да търся хора с моя проблем, и да видя как може да се реши, обаче не намерих нищо – само оплаквания, и разни хленчения по форумите. Ами като не мога да го реша проблема, да пробвам да го заобиколя, а ? Грешката се проявява, когато jQuery получи като резултат от AJAX заявка HTML, който след това се инжектира в кода. Всичко това се прави супер кадърно от jQuery, като кода който ще се инжектира се проверя за <script> блокове, които се интерпретират (Ñ‚.е. eval()-ват се), така че всичко работи все едно че кода си е бил там още при зареждането на страницата. Първо проверих дали кода е валиден (`щото IE има навика да забива при определина счепина структура), а длед това започнах да махам едно по едно нещата от кода и да гледам кога няма да се появи грешката. За мой късмет махнах <script>-овете първо, и след като видях, че проблема не е от викането на външни *.js файлове, оказа се че именно eval()-натите блокове чупят нещата. Тестването обаче ми разгонва фамилията, защото се скъсах да цъкам докато стане време да се появи грешката. Както и да е, видях какво предизвиква проблема, и реших да тествам „контролно“ дали IE по принцип имат проблеми с eval()-ването от AJAX отговори. Познайте … няма! Сега, познайте къде е проблема … в коментарите! Удивително, а ? Значи, от дълбока древност, при писането на JavaScript в inline блокове в кода винаги слагам HTML коментари. Верно, че главно античните браузъри имаха проблеми с показването на JavaScript-а, и заради това се слагат тези коментари. Има и други причини, но те изглеждат много невероятни – като например някой да напише такъв CSS:

script {display: block;}

Както и да е. Имено тези коментари оцапват положението. Пример – ето това не работи:

<script  type="text/javascript"><!--//
alert(123);
//--></script>

а ето това работи:

<script  type="text/javascript">
alert(123);
</script>

Правете си изводите. Този тъп проблем го има не само в IE6, но и в IE7 (интересно има ли го в IE8). Никой друг браузър (Firfox 2, Firefox 3, Safari 3) не се чупи. Шибана мръстна групост.

7 коментара

  1. Няма смисъл от ограждане на скрипта с коментар, онези антични браузъри са отдавна мъртви. По-добре ограждай със , особено ако е XHTML.

    Иначе имам спомен за подобни проблеми и се беше оказало че променям DOM-а преди страницата да се е заредила. Надявам се при теб всичко да се прави onload. Също, при Safari мисля че е невъзможно да добавиш script елемент динамично и той да се изпълни.

    Comment by ngn_rousse — юли 26 @ 19:09

  2. имах пред вид: „ограждай с CDATA“, ама не излезе

    Comment by ngn_rousse — юли 26 @ 19:11

  3. Няма как всичко да се прави onload, защото вече както казах, ползва се AJAX, демек правят се заявки след като страницата вече е заредена.

    За коментарите – просто стар навик е.

    А за вмъкването на <script> елементи – вече писах, че не се прави така: кода се претърсва за <script> блоковете, и те се eval()-ват, така че това работи навсякъде

    Comment by Kaloyan — юли 27 @ 10:22

  4. Същото нещо ми чупи и на мен нервите преди около година! Най-неприятното беше, че до колкото помня самата аз минах и добавих липсващите коментари и в кода на останалите колеги. И после направо бях бясна като след дълго дебъгване открих де е проблема. При нас беше с ползване на Prototype фреймуърка за Ajax, но идеята е същата. Реално фреймуърка парсва парчето HTML, с което ще замести текущото съдържание на страницата. Взима от него всички секции и директно ги подава на eval(). И явно IE очаква там чист код с премахнати коментари!

    От ECMAScript спецификацията:
    Eval code is the source text supplied to the built-in eval function. More precisely, if the parameter to the built-in eval function is a string, it is treated as an ECMAScript Program. The eval code for a
    particular invocation of eval is the global code portion of the string parameter.

    Според мен това означава, че може да се подават и коментари на eval, понеже те са си част от програмата.

    Comment by Ира — юли 28 @ 17:30

  5. Спецификации и IE ? Хайде сега ;)

    Comment by Kaloyan — юли 28 @ 18:10

  6. Просто за миг се притесних да не би пък IE да се държи както трябва – Ñ‚.е. коректното да приема само валиден програмен код без коментари, а другите браузъри да ни защитават от собствените ни грешки като от добра душа приемат и коментарите.

    Важно е да не робуваш на предразсъдъци си ;)

    Comment by Ира — юли 28 @ 18:34

  7. Мен ме е яд колко е тъп този бъг .. да беше някой извратен overflow или нещо такова, ок … а то едни тъпи коментари, с още по-тъпо съобщение за грешка.

    Да помечтаем колко хубав ще е света, ако Windows-а се разпространяваше с някой по-нормален браузър ;)

    Comment by Kaloyan — юли 28 @ 18:47

RSS feed for comments on this post.

Sorry, the comment form is closed at this time.