我一直在试图处理通过JavaScript跨越多个帧(不,我很遗憾不能摆脱帧)的onKeyDown事件(见我刚才的问题在这里 )。 我得到在其他框架的文件句柄,并设置它的onkeydown处理等于我的功能。 不引发错误,但当我后来查看文档的设置,onkeydown事件为空。 我已经得到了在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(\” 底部\ “)文件)。”,1000);
产量
Attached handler
BOTTOM.protocol = HyperText Transfer Protocol
BOTTOM.onkeypress = null
BOTTOM.onrowenter = null
BOTTOM.onmousedown = null
我应该如何申请跨框架相同的事件处理程序?
注意:这需要工作(也是唯一的工作)在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快捷键(如窗口。frameName)只是增加了不必要的潜在错误。 这就是为什么我的脚本明确看在窗口对象的框架集。
其次是框架集打交道时,熟悉DOM中各种内置的窗口引用。 有4个总
- 窗口 -当前窗口。 当离开了这也暗示(例如,在window.onload === onload事件)
- 父 -父窗口的当前
- 顶部 -在框架家族中的最顶层的窗口。 父 ===当你只有一个框架顶部 。
- 自我 - 窗口的别名
所以基本上我在这里做的是,当在帧1窗口onload事件触发,是增加一个处理函数到keydown事件在两个框架窗口的文件。
这个函数使用了闭包,以确保在帧1中生成的事件可用于实际的处理程序,无论哪个窗口产生的keydown事件的。 这是必要的,因为IE浏览器如何做的事件。 而当他们出现其他浏览器创建新的事件对象,并将其传递给事件hanlders,IE只是修改全局事件对象(通过window.event或更简单,只是事件中引用),以反映当前的事件。
我希望这是有道理的。
如果您在阅读时,事件中另一帧的处理帧的事件对象的问题,你必须明确地引用它
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) {
...
}
}