2012-01-05 9 views
1

以下は2つのiframeがあるページです。このページには、window.top.DoWork経由で任意のフレームから呼び出されるDoWork()というjavascript関数があります。任意の子フレームからトップウィンドウにコールバック関数を渡す最も効率的な方法は?

呼び出しフレームは、それが一番上の親から呼び出せるように、独自の関数への参照を渡す必要があります。 )参照関数WorkIsDoneを(グローバルに最も効率的な方法は何ですか)一番上のフレームは、関数DoWork(からそれを呼び出すことができるようなフレームで:たとえば

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

質問?

コールでフレームインデックスをハードコードできないことに注意してください。ありがとう!

更新:フレーム内にネストされたフレームが存在する可能性があります。

+0

子フレームの.parentを使用して、その機能を持つフレームを取得することはできません。ハードコーディングなし、それは相対的です。 – stu

+0

フレームのレベルが1つしかない場合にのみ、私はできます。最初のフレームに別のフレームがある場合は機能しません。 –

答えて

0

これは私が思いついたものですが、これは現在のウィンドウが見つかるまで、すべてのフレームを上からループしています。おそらくそれを行うより効率的な方法があります。

<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> 
関連する問題