IE中的Javascript兼容性

时间:2010-09-17 02:26:08

标签: javascript internet-explorer compatibility

为什么我的Javascript小部件在IE上无法正常工作但在Firefox上运行正常?此外,Firebug不会产生任何错误。我该怎么做才能确保我的Javascript小部件在IE中运行?有什么工具可以帮助我吗?

6 个答案:

答案 0 :(得分:3)

IE中JS的常见问题是对象和数组文字中的逗号:IE chokes和die。所有其他浏览器都很好。所以寻找:

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

an_obj = {foo: "This is foo",
          bar: "This is bar",  // Trailing comma kills IE!
         };

答案 1 :(得分:2)

似乎与IE的兼容性问题。您可以在右下角查看标准JavaScript错误警报图标。此外,IE Developer Toolbar很有用,但不如Firebug好。最糟糕的情况是,在找到断点之前开始抛出一些alerts

如果您正在使用console.log,那么只是在黑暗中刺伤,这将在其他浏览器中失败。作为一名开发人员,我之前已经把它留在那里了。

答案 2 :(得分:2)

IE 6+都符合ECMA规范(基本上涵盖了Javascript的所有核心'programmey'对象,如Date,Math和Array对象 - 任何涉及数学或数据类型的东西)。但是,如果你正在处理触及标准W3C DOM的任何东西(那些与访问HTML文档的任何部分或其中发生的事件有关的对象),那么你的函数很可能会在IE中的kerplode落后于DOM规范十多年了。已经构建了整个框架来弥补这一点。如果您正在处理事件或访问HTML元素或它们的属性,那么您将需要使用像JQuery这样的框架,或者开始阅读一些关于JavaScript的书籍,以了解您需要分支的对象和属性。

要记住的另一件事是,所有浏览器制造商都通过实验添加他们自己的专有方法。因此,Firefox的非标准但非常受欢迎的console.log。为了公平对待MS(我仍然觉得卑鄙),他们的原始版本的XMLHttpRequest对象是孵化所有这些Ajax的东西,他们也给了我们innerHTML,它不是任何标准的一部分但是被采用并且在所有浏览器。

基本上,所有浏览器都会解析和解释自己的JavaScript版本。由你来学习所有常见的比特,以及如何处理他们都不同意的事情。

书籍:我推荐Jeremy Keith的DOM Scripting,然后是大型的O'Reilly书(我也喜欢奥斯本的大型完整参考书)。

站点:Quirksmode.org似乎比以前有更少的内容,但仍然有很多关于编写核心JS以补偿IE无能的好建议。 CSS上也有很多东西。

答案 3 :(得分:0)

在IE8中打开小部件并使用随附的lame(与Firebug相比)开发人员工具栏(键盘快捷键:F12)。

答案 4 :(得分:0)

可悲的是,JavaScript在所有浏览器中的工作方式并不完全相同。你几乎只需要调试它。

有关可用作IE JavaScript调试器的三种不同工具的讨论,请参阅http://blogs.msdn.com/b/ie/archive/2004/10/26/247912.aspx

答案 5 :(得分:0)

您可能需要添加MDC

的兼容性算法

此处是Array.everyArray.filterArray.forEachArray.indexOfArray.lastIndexOfArray.mapArray.reduce的缩小版本,Array.reduceRightArray.someFunction.bindObject.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};