我一直在尝试通过javascript处理跨多个框架的onkeydown事件(不,不幸的是我无法摆脱这些框架)(请参阅我先前的问题here)。我在另一帧中获得文档的句柄,并将其设置为与我的函数相等的onkeydown处理函数。没有引发任何错误,但是当我稍后检查文档的设置时,onkeydown为null。我在IE6和IE7中得到了相同的结果。我究竟做错了什么。


功能

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


如何在框架之间应用相同的事件处理程序?

注意:这需要在IE6和IE7中起作用(并且只能起作用)。

最佳答案

我有这个工作

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-框架集系列中最顶层的窗口。只有一个框架集时,parent === top。
窗口的自别名


因此,基本上我在这里所做的是,当在框架1窗口中触发onload事件时,是在两个框架窗口中的文档的keydown事件中添加一个处理函数。

该函数使用闭包来确保在frame1中生成的事件可用于实际处理程序,而不管哪个窗口生成了keydown事件。这是必需的,因为IE如何处理事件。其他浏览器会在事件发生时创建新的事件对象并将其传递给事件处理程序,而IE只是修改全局事件对象(通过window.event或更简单的事件引用)以反映当前事件。

我希望这是有道理的。

关于javascript - 在IE中按交叉框,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1044573/

10-12 15:49