2013-04-30 72 views
1

我有一個網頁上的2個框架,左框架正在填充來自JavaScript對象的國家名稱列表。每個國家也是主要對象內的一個對象,並有4個名稱/值屬性。我使用附着在身體的onload以下功能:firefox Javascript document.write(onclick)引用錯誤未定義的函數

 function populateList() { 
      var list = top.frames[0].document; 
      list.open() 
      list.write("<h2>Countries</h2><ul>"); 
      for (name in euMem){ 
       if(typeof name !== 'object'){ 
        list.write('<li><a href=\"\" onclick=\"updateFrame(\'' + name + '\');\">' + name + '</a></li>'); 
       } 
      } 
      list.write("</ul>"); 
      list.close(); 
     } 

當用戶點擊該國的名字之一左其意在運行此函數:

 function updateFrame(country) { 
      var infoFrame = top.frames[1].document; 
      infoFrame.open(); 
      var size = Object.size(euMem[country]); 
      infoFrame.writeln("<h1>Information for " + country + "</h1>"); 
      for(prop in euMem[country]){ 
       infoFrame.writeln(prop + " : " + euMem[country][prop] + "<br>"); 
      } 
      infoFrame.close(); 
     } 

這似乎在Chrome上工作正常,但在Firefox上,我得到參考錯誤,指出updateFrame未定義。當我將updateFrame直接硬編碼到HTML中時,它的工作原理並不困難,但是當它使用document.write編寫時,我得到了引用錯誤。

爲什麼不能在Firefox上使用?

編輯: 下面是一個簡單的腳本,我寫來測試這個最基本的版本:

<html> 
<head> 
    <title>InfoPane</title> 
    <script type="text/javascript"> 
     function test(name){ 
      alert(name); 
     } 

     function load(){ 
      document.write("<button onclick='test('John Doe');'>Alert Me!</button>"); 
     } 
    </script> 
</head> 
<body onload="load();"> 

</body> 
</html> 

以上在Firefox上不工作...

我能得到這個代碼作爲一個基本的例子,但不能擴展到我的代碼上面得到它的功能:

<html> 
<head> 
    <title>InfoPane</title> 
    <script type="text/javascript"> 
     function test(){ 
      alert(this.name); 
     } 

     function load(){ 
      var btn = document.createElement('button'); 
      btn.name = 'John Doe'; 
      btn.onclick = test; 
      btn.innerHTML = 'Alert Me!'; 
      document.body.appendChild(btn); 
     } 
    </script> 
</head> 
<body onload="load();"> 

</body> 
</html> 
+0

1.爲什麼使用框架? 2.你如何嵌入腳本和地點? – 2013-04-30 06:22:23

+0

我使用框架,因爲它是需要我們使用框架的類作業。腳本被嵌入到第一幀的HTML文件中。 – user1721944 2013-04-30 06:50:04

回答

2

發生這種情況是因爲Firefox遵循規範但Chrome不是。

在您最基本的版本中,頁面定義了名稱爲「test」且其值爲函數的全局對象的屬性。然後,加載事件處理程序運行並調用document.write,它隱含了document.open。由於該文件不再在那個位置加載,所以會丟棄舊文件的內容。到目前爲止,這在Firefox和Chrome中都是一樣的。

如果它們不同的是按照規範,並且在Firefox中,open對於不再加載的文檔將爲該文檔創建一個新的全局對象。當然,這個新的全局對象沒有名爲test的屬性。另一方面,Chrome保留舊的全局(以及來自舊文檔的各種其他狀態,如事件處理程序,間隔定時器等)。

如果您打算使用document.open重寫文檔並希望它們能夠調用實用程序函數,您希望將這些實用程序函數放置在其他全局範圍內,您不會繼續吹走的其他框架。

+0

謝謝。我想我也有問題轉移到外部文件,因爲它被連接在被吹走的框架內。我更新了到window.parent的鏈接,並將腳本移到了框架集中,並能夠成功地使其運行。 – user1721944 2013-04-30 15:04:53

0

tr y使用window.parent.updateFrame(...)

+0

這沒有奏效。我也嘗試過外部鏈接到腳本沒有運氣。 – user1721944 2013-04-30 07:17:58