1

我在网页上有 2 个框架,左框架填充了来自 javascript 对象的国家名称列表。每个国家也是主要对象中的一个对象,并具有 4 个名称/值属性。我正在使用附加到正文 onload 的以下功能:

        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 中时,它可以在 firefox 上顺利运行,但是当它使用 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>

以上不适用于火狐...

我能够让这段代码作为一个基本示例工作,但无法将其扩展为我上面的代码以使其发挥作用:

<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>
4

2 回答 2

3

发生这种情况是因为 Firefox 遵循规范,但 Chrome 不遵循。

在您最基本的版本中,页面在全局对象上定义了一个属性,其名称为“test”,其值是一个函数。然后 load 事件处理程序运行并调用document.write,它执行一个隐式的document.open. 由于此时不再加载文档,因此会清除旧文档的内容。到目前为止,这在 Firefox 和 Chrome 中都是一样的。

它们的不同之处在于每个规范,并且在 Firefox 中,open在不再加载的文档上将为该文档创建一个新的全局对象。当然,这个新的全局对象没有名为 的属性test。另一方面,Chrome 保留旧的全局(以及旧文档中的各种其他状态,如事件处理程序、间隔计时器等)。

如果您打算重写文档document.open并希望它们能够调用实用程序函数,您希望将这些实用程序函数放在其他框架中,您不会一直吹走它的全局。

于 2013-04-30T13:00:01.257 回答
0

尝试使用window.parent.updateFrame(...)

于 2013-04-30T06:23:02.200 回答