1

複数のフレームでonkeydownイベントを処理しようとしました(いいえ、残念ながらフレームを取り除くことはできません)。他のフレームでドキュメントのハンドルを取得し、関数と同じ onkeydown ハンドラーを設定しています。エラーはスローされませんが、後でドキュメントの設定を確認すると、onkeydownが null です。IE6IE7で同じ結果が得られました。私は何を間違っていますか。

  • 関数

        function setKeyHook(doc)
        {
            try{               
                if (doc)
                    if (parent.TOP.handleKeypress){
                        doc.onkeydown = parent.TOP.handleKeypress;
                        logMessage('Attached handler');
                    }
                    else{
                        logMessage('No handleKeypress');
                    }
                else
                    logMessage('No doc');
            }
            catch (ex){
                logMessage(ex.toString());
            }
        }
    
  • 電話

    setTimeout("setKeyHook(parent.document.getElementById(\"bottom\").document);", 1000);

  • 出力

   付属ハンドラー
  • 実行後
    BOTTOM.protocol = ハイパーテキスト転送プロトコル
    BOTTOM.onkeypress = null
    BOTTOM.onrowenter = null
    BOTTOM.onmousedown = null

フレーム間で同じイベント ハンドラーを適用するにはどうすればよいですか?

注: これは IE6 と IE7 で動作する必要があります (動作する必要があります)。

4

2 に答える 2

2

私はこれを機能させました

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つあります

  1. window-現在のウ​​ィンドウ。これは、省略された場合にも暗示されます(つまり、window.onload === onload)
  2. parent-現在の親ウィンドウ
  3. top-フレームセットファミリの一番上のウィンドウ ===フレームセットが1つしかない場合はtop 。
  4. self-ウィンドウのエイリアス

つまり、基本的にここで行ったことは、onloadイベントがframe1ウィンドウで発生したときに、両方のフレームウィンドウのドキュメントのkeydownイベントにハンドラー関数を追加することです。

この関数はクロージャを使用して、どのウィンドウがキーダウンイベントを生成したかに関係なく、frame1で生成されたイベントを実際のハンドラーで使用できるようにします。これは、IEがイベントを実行する方法のために必要です。他のブラウザは、発生時に新しいイベントオブジェクトを作成し、それらをイベントハンドラーに渡しますが、IEは、現在のイベントを反映するようにグローバルイベントオブジェクト( window.eventまたはより単純なeventのみを介して参照)を変更するだけです。

それが理にかなっていることを願っています。

于 2009-06-25T16:11:08.767 に答える
0

イベントが別のフレームで処理されているときにフレームのイベント オブジェクトの読み取りに問題がある場合は、それを明示的に参照する必要があります。

var event = top.frames.BOTTOM.event;

私は自分でこの問題に遭遇しましたが、イベントハンドラーの始まりは

var myFrame = top.frames[0];
myFrame.onkeydown = keyboardHandler;

function keyboardHandler(e) {
    if (!e && event) {
        e = event; //For handling the event in IE
    }
    if (!e && myFrame.contentWindow.event) {
        e = myFrame.contentWindow.event; //For handling event in IE6 from inside the iFrame
    }

    if (e) {
    ...
    }
}
于 2009-08-05T23:29:59.313 に答える