Самый эффективный способ передачи функции обратного вызова из любого дочернего фрейма в верхнее окно? - PullRequest
1 голос
/ 06 января 2012

Ниже находится страница с двумя фреймами.На этой странице есть функция JavaScript, называемая DoWork (), которая вызывается из любого фрейма через 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 ()?

Обратите внимание, что я не могу жестко закодировать индекс кадра в вызове.Спасибо!

Обновление: В кадрах могут быть вложенные кадры.

1 Ответ

0 голосов
/ 06 января 2012

Отвечая на мой собственный вопрос ... это то, что я придумал, однако это циклически перебирает все кадры сверху, пока не будет найдено текущее окно. Возможно, есть более эффективный способ сделать это

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