2011-07-08 20 views
4
<body> 
    <script> 
    ping = new Object; 
    ping.test = '1234'; 
    </script> 

<a href="#" onclick="alert(ping.test);">Test</a> 
</body> 

爲什麼這個工作在IE8而不是在Firefox或鉻? 在FF v5和Chrome v12中,彈出窗口顯示「undefined」,它在IE9中顯示「1234」。onclick =「alert(ping.test);」給出undefined

+0

對我的作品在FF4 – Mrchief

+0

這應該工作,但是很多東西可以改進。 – alex

+0

您還應該指定腳本類型:type =「text/javascript」 –

回答

0

這是一個範圍問題。試試這個:

<body> 
    <script> 
    var ping = {}; 
    ping.test = '1234'; 
    </script> 

<a href="#" onclick="alert(ping.test);">Test</a> 
</body> 

編輯:這對我的作品

<body> 
    <script> 
    var ping = {}; 
    ping.test = '1234'; 

    function test(){ 
     alert(ping.test); 
    } 
    </script> 
<a href="#" onclick="test();">Test</a> 
</body> 
+0

感謝ilia,但Chrome V.12和FF 5.0 – Benjamin

+0

仍使用Zach的代碼。這是保證工作。 –

+0

剛剛嘗試過var ping = {};仍然FF5給未定義。你們認爲它是FF5和Chrome 12中的一個錯誤? – Benjamin

1

ping已經超出範圍。試試這個:

<body> 
    <a href="#" id="test">Test</a> 
    <script> 
    var ping = new Object(); 
    ping.test = '1234'; 
    document.getElementById("test").onclick = function() { 
     alert(ping.test); 
    }; 
    </script> 
</body> 
+2

ping如何超出範圍?這是一個全球性的對象。(除此之外,我認爲你的通用編碼風格要好得多) –

+1

如果你沒有用var聲明一個變量,那麼範圍內就會出現可預測的事情。 –

+0

謝謝Zach,問題是,我的應用程序非常緊張。 (使用jQuery的「實時」功能並不是我最好的選擇) – Benjamin

4

這是內聯事件模型(DOM 0級),因此只在其執行範圍內定義的變量將被使用。

以下部分

ping = new Object; 
ping.test = '1234'; 

是在它自己的執行上下文在翻譯時經過的頁面。全局範圍內的代碼將通過this使用全局對象。

但這裏

<a href="#" onclick="alert(ping.test);">Test</a> 

獨立的執行,而您的瀏覽視圖作爲一個匿名函數。使用

<a href="#" onclick="alert(this);">Test</a> 

不會導致我們想要的。該行看到window,this實際上被用於內聯事件處理程序使用的當前對象。

因此,除非我們允許通過參考window來查看ping,否則ping不在此範圍內定義。

<a href="#" onclick="alert(window.ping.test);">Test</a> 

現在瀏覽器運行時,它會搶了window全局變量中(\腳本\)上下文將是相同的this並有機會獲得到ping.test

可見,在以下瀏覽器

  • 谷歌瀏覽器的Mac 12.0.742.112
  • Safari瀏覽器5.0.5版(6533.21.1)
  • Firefo X的Mac 3.6.18

參考
Mozilla Docs: this keyword
Dom Events: inline model

+0

答案是純真棒 –