私はこれを機能させました
frameset.html
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN"
"http://www.w3.org/TR/html4/frameset.dtd">
<html>
<head>
<title>Test</title>
</head>
<frameset rows="50%,50%">
<frame src="frame1.html" name="TOP">
<frame src="frame2.html" name="BOTTOM">
</frameset>
</html>
frame1.html
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN"
"http://www.w3.org/TR/html4/frameset.dtd">
<html>
<head>
<title>Frame 1</title>
<script type="text/javascript">
onload = function()
{
top.frames.BOTTOM.document.onkeydown =
self.document.onkeydown = function( evt )
{
return function()
{
// Just an example to show it's working
document.getElementById( 'output' ).value += String.fromCharCode( evt.keyCode );
}
}( window.event );
}
</script>
</head>
<body>
frame1
<textarea id="output"></textarea>
</body>
</html>
frame2.html
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN"
"http://www.w3.org/TR/html4/frameset.dtd">
<html>
<head>
<title>Frame 2</title>
</head>
<body>
frame2
<textarea></textarea>
</body>
</html>
まず第一に、オブジェクト参照をかなり明示的にすることは常に有益です。独自のDOMショートカット(window .frameNameなど)を使用すると、不要なエラーが発生する可能性があります。これが、私のスクリプトがウィンドウオブジェクトのフレームコレクションを明示的に調べる理由です。
次に、フレームセットを処理するときに、DOMに組み込まれているさまざまなウィンドウ参照について理解します。全部で4つあります
- window-現在のウィンドウ。これは、省略された場合にも暗示されます(つまり、window.onload === onload)
- parent-現在の親ウィンドウ
- top-フレームセットファミリの一番上のウィンドウ 。親===フレームセットが1つしかない場合はtop 。
- self-ウィンドウのエイリアス
つまり、基本的にここで行ったことは、onloadイベントがframe1ウィンドウで発生したときに、両方のフレームウィンドウのドキュメントのkeydownイベントにハンドラー関数を追加することです。
この関数はクロージャを使用して、どのウィンドウがキーダウンイベントを生成したかに関係なく、frame1で生成されたイベントを実際のハンドラーで使用できるようにします。これは、IEがイベントを実行する方法のために必要です。他のブラウザは、発生時に新しいイベントオブジェクトを作成し、それらをイベントハンドラーに渡しますが、IEは、現在のイベントを反映するようにグローバルイベントオブジェクト( window.eventまたはより単純なeventのみを介して参照)を変更するだけです。
それが理にかなっていることを願っています。