将回调函数从任何子框架传递到顶部窗口的最有效方法



下面是包含两个iframe的页面。这个页面有一个名为DoWork()的javascript函数,它可以通过window.top.DoWork.从任何帧调用

<html>
<head runat="server">
    <title>TOP PARENT</title>    
    <script type="text/javascript">
        function DoWork(callback)
        {
            // do work here     
            callback();
        }
    </script>
</head>
<body>
    <iframe src="Frame1.htm"></iframe>        
    <iframe src="Frame2.htm"></iframe>        
</body>
</html>

调用框架需要将引用传递给它自己的函数,以便可以从最顶端的父函数调用它。例如

<html>
<head runat="server">
    <title>Some frame</title>    
    <script type="text/javascript">
        function WorkIsDone()
        {
            alert('Work is done');
        }
    </script>
</head>
<body>
    <input type="button" value="Do Work" onclick="window.top.DoWork(WorkIsDone);" />    
</body>
</html>

问题:在框架中全局引用函数WorkIsDone(),以便最顶部的框架可以从函数DoWork()调用它,最有效的方法是什么?

请注意,我无法对调用中的帧索引进行硬编码。谢谢

更新:帧中可能存在嵌套帧。

回答我自己的问题。。。这就是我所想到的,但这是从顶部循环所有帧,直到找到当前窗口。也许有一种更有效的方法

<html>
<head runat="server">
    <title>Some frame</title>    
    <script type="text/javascript">
        function FindMe(source, me) {
            for (var i = 0; i < source.frames.length; i++) {
                if (source.frames[i] == me)
                    return source.frames[i];
                var r = FindMe(source.frames[i], me);
                if (r != null)
                    return r;
            }
        }
        function WorkIsDone()
        {
            alert('Work is done');
        }
    </script>
</head>
<body>
    <input type="button" value="Do Work" onclick="window.top.DoWork(FindMe(window.top, self).WorkIsDone);" />    
</body>
</html>

最新更新