Совместимость с Javascript в IE - PullRequest
       3

Совместимость с Javascript в IE

0 голосов
/ 17 сентября 2010

Почему мой виджет Javascript не работает должным образом в IE, но хорошо работает в Firefox? Более того, Firebug не выдает никаких ошибок. Что я могу сделать, чтобы убедиться, что мой виджет Javascript работает в IE? Есть какие-нибудь инструменты, чтобы помочь мне?

Ответы [ 6 ]

3 голосов
/ 17 сентября 2010

Общая проблема с JS в IE - запятые в литералах объектов и массивов: IE задыхается и умирает.Все остальные браузеры в порядке.Ищите:

an_array = [1,2,3,];  // Trailing comma kills IE!

an_obj = {foo: "This is foo",
          bar: "This is bar",  // Trailing comma kills IE!
         };
2 голосов
/ 17 сентября 2010

IE 6+ очень хорошо соответствуют спецификации ECMA (по существу, охватывает все основные объекты programmey в Javascript, такие как объекты Date, Math и Array - все, что связано с Math или типами данных).Однако, если вы имеете дело со всем, что касается стандартного DOM W3C (те объекты, которые связаны с доступом к любой части HTML-документа или событиями, которые в нем происходят), скорее всего, ваши функции потерпят крах в IE, который отстает от спецификации DOMна протяжении более десяти лет.Целые рамки были построены, чтобы компенсировать это.Если вы имеете дело с событиями или обращаетесь к элементам HTML или их атрибутам, вам нужно использовать такую ​​среду, как JQuery, или начать читать некоторые книги по JavaScript, чтобы узнать, какие объекты и свойства вам нужно разветвлять.

Следует также помнить, что все производители браузеров для экспериментов добавляют свои собственные проприетарные методы.Таким образом, Firefox нестандартный, но очень популярный console.log.Чтобы быть справедливым по отношению к MS (которого я до сих пор считаю презренным), их оригинальная версия объекта XMLHttpRequest - это то, что заштриховало весь этот материал Ajax, и они также дали нам innerHTML, который не является частью какого-либо стандарта, но был принят и работает так же ввсе браузеры.

По сути, все браузеры анализируют и интерпретируют свои собственные версии JavaScript.Вы должны изучить все общие черты, которые работают одинаково по всем направлениям, и узнать, как справляться с вещами, с которыми никто из них не согласен.

Книги: я рекомендую сценарий DOM Джереми Кейта, а затем большойГигантская книга О'Рейли (мне также нравится большой гигантский Полный справочник из Осборна).

Сайты: Quirksmode.org, похоже, содержит меньше контента, чем раньше, но все еще дает много полезных советов по написанию ядра.JS компенсировать IE некомпетентности.Многое о CSS тоже.

2 голосов
/ 17 сентября 2010

Похоже, проблема совместимости с IE. Вы можете посмотреть в правом нижнем углу стандартный значок предупреждения об ошибке JavaScript. Кроме того, панель инструментов разработчика IE полезна, но не так хороша, как Firebug. В худшем случае начните бросать alerts, пока не найдете точку останова.

Просто удар в темноте, если вы используете console.log, что не получится в других браузерах. Как разработчик, я оставил это раньше.

0 голосов
/ 17 сентября 2010

возможно вам нужно добавить алгоритм совместимости из MDC

вот сокращенная версия Array.every, Array.filter, Array.forEach, Array.indexOf, Array.lastIndexOf, Array.map, Array.reduce, Array.reduceRight, Array.some, Function.bind, Object.keys

if(!Array.prototype.every)Array.prototype.every=function(fun,thisp){var len=this.length>>>0;if(typeof fun!="function")throw new TypeError;var thisp=arguments[1];for(var i=0;i<len;i++)if(i in this&&!fun.call(thisp,this[i],i,this))return false;return true}; if(!Array.prototype.filter)Array.prototype.filter=function(fun,thisp){var len=this.length>>>0;if(typeof fun!="function")throw new TypeError;var res=[];var thisp=arguments[1];for(var i=0;i<len;i++)if(i in this){var val=this[i];if(fun.call(thisp,val,i,this))res.push(val)}return res}; if(!Array.prototype.forEach)Array.prototype.forEach=function(fun,thisp){var len=this.length>>>0;if(typeof fun!="function")throw new TypeError;var thisp=arguments[1];for(var i=0;i<len;i++)if(i in this)fun.call(thisp,this[i],i,this)};if(!Array.prototype.indexOf)Array.prototype.indexOf=function(elt){var len=this.length>>>0;var from=Number(arguments[1])||0;from=from<0?Math.ceil(from):Math.floor(from);if(from<0)from+=len;for(;from<len;from++)if(from in this&&this[from]===elt)return from;return-1}; if(!Array.prototype.lastIndexOf)Array.prototype.lastIndexOf=function(elt){var len=this.length;var from=Number(arguments[1]);if(isNaN(from))from=len-1;else{from=from<0?Math.ceil(from):Math.floor(from);if(from<0)from+=len;else if(from>=len)from=len-1}for(;from>-1;from--)if(from in this&&this[from]===elt)return from;return-1}; if(!Array.prototype.map)Array.prototype.map=function(fun,thisp){var len=this.length>>>0;if(typeof fun!="function")throw new TypeError;var res=new Array(len);var thisp=arguments[1];for(var i=0;i<len;i++)if(i in this)res[i]=fun.call(thisp,this[i],i,this);return res}; if(!Array.prototype.reduce)Array.prototype.reduce=function(fun){var len=this.length>>>0;if(typeof fun!="function")throw new TypeError;if(len==0&&arguments.length==1)throw new TypeError;var i=0;if(arguments.length>=2)var rv=arguments[1];else{do{if(i in this){var rv=this[i++];break}if(++i>=len)throw new TypeError;}while(true)}for(;i<len;i++)if(i in this)rv=fun.call(undefined,rv,this[i],i,this);return rv}; if(!Array.prototype.reduceRight)Array.prototype.reduceRight=function(fun){var len=this.length>>>0;if(typeof fun!="function")throw new TypeError;if(len==0&&arguments.length==1)throw new TypeError;var i=len-1;if(arguments.length>=2)var rv=arguments[1];else{do{if(i in this){var rv=this[i--];break}if(--i<0)throw new TypeError;}while(true)}for(;i>=0;i--)if(i in this)rv=fun.call(undefined,rv,this[i],i,this);return rv}; if(!Array.prototype.some)Array.prototype.some=function(fun,thisp){var i=0,len=this.length>>>0;if(typeof fun!="function")throw new TypeError;var thisp=arguments[1];for(;i<len;i++)if(i in this&&fun.call(thisp,this[i],i,this))return true;return false}; if(!Function.prototype.bind)Function.prototype.bind=function(context){if(typeof this!=="function")throw new TypeError;var _arguments=Array.prototype.slice.call(arguments,1),_this=this,_concat=Array.prototype.concat,_function=function(){return _this.apply(this instanceof _dummy?this:context,_concat.apply(_arguments,arguments))},_dummy=function(){};_dummy.prototype=_this.prototype;_function.prototype=new _dummy;return _function}; Object.keys=Object.keys||function(o){var result=[];for(var name in o)if(o.hasOwnProperty(name))result.push(name);return result};
0 голосов
/ 17 сентября 2010

К сожалению, JavaScript не работает одинаково во всех браузерах. Вам просто нужно его отладить.

См. http://blogs.msdn.com/b/ie/archive/2004/10/26/247912.aspx для обсуждения трех различных инструментов, которые могут действовать как отладчик для IE JavaScript.

0 голосов
/ 17 сентября 2010

Откройте виджет в IE8 и используйте прилагаемую панель инструментов разработчика (по сравнению с Firebug) (сочетание клавиш: F12).

...