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 — юли 26 @ 19:09
имах пред вид: „ограждай Ñ CDATA“, ама не излезе
Comment by ngn_rousse — юли 26 @ 19:11
ÐÑма как вÑичко да Ñе прави
onload
, защото вече както казах, ползва Ñе AJAX, демек правÑÑ‚ Ñе заÑвки Ñлед като Ñтраницата вече е заредена.За коментарите – проÑто Ñтар навик е.
Рза вмъкването на
<script>
елементи – вече пиÑах, че не Ñе прави така: кода Ñе претърÑва за<script>
блоковете, и те Ñеeval()
-ват, така че това работи навÑÑкъдеComment by Kaloyan — юли 27 @ 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 Ира — юли 28 @ 17:30
Спецификации и IE ? Хайде Ñега ;)
Comment by Kaloyan — юли 28 @ 18:10
ПроÑто за миг Ñе притеÑних да не би пък IE да Ñе държи както трÑбва – Ñ‚.е. коректното да приема Ñамо валиден програмен код без коментари, а другите браузъри да ни защитават от ÑобÑтвените ни грешки като от добра душа приемат и коментарите.
Важно е да не робуваш на предразÑъдъци Ñи ;)
Comment by Ира — юли 28 @ 18:34
Мен ме е Ñд колко е тъп този бъг .. да беше нÑкой извратен overflow или нещо такова, ок … а то едни тъпи коментари, Ñ Ð¾Ñ‰Ðµ по-тъпо Ñъобщение за грешка.
Да помечтаем колко хубав ще е Ñвета, ако Windows-а Ñе разпроÑтранÑваше Ñ Ð½Ñкой по-нормален браузър ;)
Comment by Kaloyan — юли 28 @ 18:47