2010-12-10 28 views
0

我編寫了以下JS爲什麼JS錯誤在IE6(未變種變量)

<html> 
<body> 
    <img id="img" src="http://example.com/img.jpg" /> 
    <script type="text/javascript"> 
//<![CDATA[ 
(function(){ 
    img = document.getElementById("img"); 
    img.src = "http://example.com/img.png"; 
})(); 
    //]]> 
</script> 
</body> 

但IE6 一些JS錯誤發生。

因爲我應該使用var img嗎? 順帶

 <body> 
     <img id="img" src="http://example.com/img.jpg" /> 
     <script type="text/javascript"> 
    //<![CDATA[ 
    (function(){ 
     var img = document.getElementById("img"); 
     img.src = "http://example.com/img.png"; 
    })(); 
     //]]> 
    </script> 
    </body> 

</html> 

是我不能得到之所以 你能解釋我沒有問題 ?

回答

3

如果省略var當你聲明一個變量,該變量並沒有在當前的局部範圍存在,兩件事情之一會發生:

  1. 您將聲明一個新的「全局」變量,每個函數都可以訪問該變量 - >不要這樣做
  2. 您將設置一個已經存在的全局變量爲新的值;如果某些其他函數依賴於此變量,則可能造成嚴重破壞

因此,請勿使用全局變量,並儘可能使用var。正如Tomas已經指出的那樣,您的腳本可以在瀏覽器加載結構之前運行。

+0

+1:用於解釋全局變量 – 2010-12-10 09:11:57

1

腳本在瀏覽器加載全身結構之前運行。所以,你的功能找不到img元素。 在onLoad正文事件中調用您的功能將修復錯誤。

即:

<html> 
<head> 

    <script type="text/javascript"> 
    //<![CDATA[ 
    function loadImage(){ 
     img = document.getElementById("img"); 
     img.src = "http://example.com/img.png"; 
     } 
    //]]> 
    </script>  

</head> 
<body onLoad="loadImage();"> 
    <img id="img" src="http://example.com/img.jpg" /> 

</body> 
</html> 
+0

謝謝你的回覆!真的?但var的術語添加那麼這個腳本是沒有問題的 – freddiefujiwara 2010-12-10 09:09:52

+0

你的代碼太棒了!但我可以有任何其他解決方案不使用onload,因爲onload已經設置了另一個功能 – freddiefujiwara 2010-12-10 09:12:02

+0

不,這絕對不是問題。問題是由於不使用'var'而導致與'img'的衝突。 – 2010-12-10 10:07:38

0

唯一的問題是,您沒有使用var來聲明img變量。身體的其他部分可能沒有被解析的事實沒有問題,所以不要擔心。

var缺失導致問題的原因是img與瀏覽器爲您創建的全局對象的屬性發生衝突。在IE中,每個具有ID的元素都會創建與該ID對應的全局對象(因此可在任何地方訪問)的屬性。這個屬性是隻讀的,所以如果你嘗試分配給它,你會得到一個錯誤。如果你首先聲明它,你創建一個新的變量,它不會干擾IE的全局屬性,它會按照你的預期工作。

您也將發現,改變的變量名稱不要與window ID或財產碰撞會解決這個問題:

banana = document.getElementById("img"); 
banana.src = "http://example.com/img.png"; 

...但是這不是一個好主意,要麼因爲你使用您的banana自動污染全局範圍,這可能會在其他代碼中產生影響,並且在ECMAScript 5嚴格模式下會出現錯誤。最後,除非你使用XHTML(你幾乎肯定不應該這樣做,而你的例子沒有XHTML文檔類型),否則不需要CDATA標記。你應該刪除它。

道德故事:總是聲明你的變量