2013-04-30 82 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