2011-08-26 63 views
0

我在#1讀到某處console.log()今天早些時候,我記得讀它會導致IE漏洞了。用戶不得不說,它的所有實例從部署前的代碼被刪除或JavaScript庫可以用來忽略它的IE瀏覽器。省略或修訂/擴展內置的JavaScript方法兼容性

我的問題是關於第二種選擇,如何將一個寫這樣的圖書館嗎?難道它只是運行onload,影響js從那時轉發的解析?就像if browser == IE, omit all instances of console.log() ......或者它會是對console.log()方法的擴展,它會自動感知它被調用的瀏覽器?我對擴展jQuery函數有點熟悉,但從來沒有見過使用原生js完成這項工作。我對此感興趣,因爲我覺得這將是實現瀏覽器交叉兼容性的一個好方法,這完全不是關於console.log()

回答

1

有幾種不同的方法可以測試可能存在或不存在的全局屬性。你應該儘量保持防禦性,例如

var global = this; 

if (!('console' in global)) { 
    global.console = {}; 
} 

if (!('log' in global.console)) { 
    global.console.log = /* whatever */; 
} 

的在測試中也許可以使用的typeof來代替。這個想法是不使用可能不存在的標識符。也許有點更好:

// If console exists, declaring it will not hurt 
// If it didn't exist, it does now 
var console; 

if (typeof console == 'undefined') { 
    console = {}; 
} 

if (typeof console.log == 'undefined') { 
    console.log = /* whatever */; 
} 
+0

我看到了,所以這樣你事先覆蓋你的基地。你知道有什麼方法可以動態地解決這樣的問題,因爲它們出現時會被定義爲「未定義」嗎?動態?我認爲這樣的解決方案將是有價值的,但無法想象如何去做。 –

3

一種方法是隻要確保console.log()總是被定義,所以你可以隨時使用它不用擔心。您可以添加此代碼以確保始終定義它。

此代碼將讓這個在IE(或在沒有任何其他瀏覽器),console.log()將被定義並安全地什麼也不做。當它已經存在時,這段代碼將不會做任何事情,並保留原來的console.log()的定義。

if (!window.console) { 
    window.console = {}; 
} 
if (!console.log) { 
    console.log = function() {}; 
} 
+1

我認爲訪問主機屬性最安全的方法是* in *測試,如:if(!('console'in window)){...}'。宿主對象有趣的事情,有時只是試圖訪問屬性將失敗(雖然它通常是安全的* window *,其他主機對象可能不那麼寬容)。更強大的是使用對全局對象的引用,而不是代碼可能在非瀏覽器環境中運行的窗口。 – RobG

+0

@RobG - 你可以找到任何瀏覽器,這不起作用?我一直都知道這種方法是安全的。 – jfriend00

+0

似乎有很多這樣做的方法,謝謝 –