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) не се чупи. Шибана мръстна групост.


Няма смисъл от ограждане на скрипта с коментар, онези антични браузъри са отдавна мъртви. По-добре ограждай със , особено ако е XHTML.
Иначе имам спомен за подобни проблеми и се беше оказало че променям DOM-а преди страницата да се е заредила. Надявам се при теб всичко да се прави onload. Също, при Safari мисля че е невъзможно да добавиш script елемент динамично и той да се изпълни.
Comment by ngn_rousse — July 26, 2008 @ 19:09
имах пред вид: “ограждай с CDATA”, ама не излезе
Comment by ngn_rousse — July 26, 2008 @ 19:11
Няма как всичко да се прави
onload, защото вече както казах, ползва се AJAX, демек правят се заявки след като страницата вече е заредена.За коментарите - просто стар навик е.
А за вмъкването на
<script>елементи — вече писах, че не се прави така: кода се претърсва за<script>блоковете, и те сеeval()-ват, така че това работи навсякъдеComment by Kaloyan — July 27, 2008 @ 10:22
Същото нещо ми чупи и на мен нервите преди около година! Най-неприятното беше, че до колкото помня самата аз минах и добавих липсващите коментари и в кода на останалите колеги. И после направо бях бясна като след дълго дебъгване открих де е проблема. При нас беше с ползване на 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 Ира — July 28, 2008 @ 17:30
Спецификации и IE ? Хайде сега ;)
Comment by Kaloyan — July 28, 2008 @ 18:10
Просто за миг се притесних да не би пък IE да се държи както трябва - т.е. коректното да приема само валиден програмен код без коментари, а другите браузъри да ни защитават от собствените ни грешки като от добра душа приемат и коментарите.
Важно е да не робуваш на предразсъдъци си ;)
Comment by Ира — July 28, 2008 @ 18:34
Мен ме е яд колко е тъп този бъг .. да беше някой извратен overflow или нещо такова, ок … а то едни тъпи коментари, с още по-тъпо съобщение за грешка.
Да помечтаем колко хубав ще е света, ако Windows-а се разпространяваше с някой по-нормален браузър ;)
Comment by Kaloyan — July 28, 2008 @ 18:47