2010-09-17 178 views
0

爲什麼我的Javascript小部件在IE上無法正常工作,但在Firefox上很好?而且,Firebug不會產生任何錯誤。我能做些什麼來確保我的Javascript小部件在IE中運行?有什麼工具可以幫助我嗎?IE中的Javascript兼容性

+17

縮小的版本檢查你沒有粘貼的代碼的第34行第5列。 – MooGoo 2010-09-17 02:28:02

+0

苛刻** MooGoo **,但它確實讓我LOL。 – 2010-09-17 02:31:16

+0

這使我成爲了LOL,但我想我正在尋找更多關於解決問題的一般答案。例如,IE瀏覽器的Firebug工具? – syker 2010-09-17 03:19:50

回答

2

似乎與IE的兼容性問題。您可以在右下角查看標準JavaScript錯誤警報圖標。另外,IE Developer Toolbar很有用,但不如Firebug。最壞的情況下,開始投擲一些alerts,直到找到斷點。

只是在黑暗中刺中,如果您使用的是console.log,那麼在其他瀏覽器中會失敗。作爲一名開發人員,我之前已經離開過。

+0

我定義了一個自定義的全局函數,並用它來代替:function log(o){try {console.log(o); } catch(e){}} – letronje 2010-09-17 02:35:02

+0

出於某種奇怪的原因,我發現IE Dev Toolbar和IETTER內部使用它一樣好螢火蟲 – lock 2010-09-17 03:22:39

0

在IE8中打開小部件並使用它自帶的跛腳(與Firebug相比)開發人員工具欄(鍵盤快捷鍵:F12)。

3

在IE中JS的一個常見問題是對象和數組文字中的尾隨逗號:IE扼流圈和死亡。所有其他瀏覽器都很好。因此,尋找:

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

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

+1:我自己使用腳本在簽入代碼前使用regexp來檢查它。我有時會得到誤報,但這比我的老闆在凌晨2點打電話給我更好地修復損壞的更新要好得多。 – slebetman 2010-09-17 03:35:47

+0

我不是IE的愛好者,但這是IE爲改變做正確事情的典型例子。讓壞代碼破壞。 – 2011-06-22 07:32:52

2

的IE 6+都符合相當不錯的ECMA規範(基本上涵蓋了所有的核心,如日期,Math和Array對象的Javascript「programmey」對象 - 任何處理數學或數據類型)。然而,如果你正在處理任何涉及標準W3C DOM的東西(那些與訪問HTML文檔的任何部分或其中的事件有關的對象),那麼很可能你的函數將在IE瀏覽器中出現kerplode,這一直落後於DOM規範超過十年。整個框架的建立是爲了彌補這一點。如果您正在處理事件或訪問HTML元素或其屬性,您將希望使用像JQuery這樣的框架,或者開始閱讀一些關於JavaScript的書籍,以瞭解您需要分支的對象和屬性。

要記住的另一件事是,所有的瀏覽器製造商通過實驗的方式添加自己的專有方法。因此,Firefox的非標準但非常流行的console.log。爲了公平對待MS(我仍然認爲這是卑鄙的),他們的XMLHttpRequest對象的原始版本就是所有這些Ajax內容的代碼,並且它們也給了我們innerHTML,它不是任何標準的一部分,但是被採用並且在所有瀏覽器。

基本上,所有瀏覽器都會解析和解釋他們自己的JavaScript版本。學習所有常見的全面工作,以及如何處理所有他們無法達成的共識,取決於你。我推薦Jeremy Keith的DOM腳本,然後是大巨人O'Reilly的書(我也喜歡奧斯本的大巨人完整參考書)。

網站:Quirksmode.org的內容似乎比過去少,但在編寫核心JS以彌補IE不足方面仍有很多好的建議。也有很多關於CSS的東西。

0

也許你需要從MDC

添加兼容算法這裏是Array.everyArray.filterArray.forEachArray.indexOfArray.lastIndexOfArray.mapArray.reduceArray.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};