我一直在努力处理onkeydown
通过 JavaScript 跨多个框架的事件(不,不幸的是我无法摆脱框架)(请参阅我之前的问题here)。我正在另一个框架中获取文档的句柄,并将其设置为onkeydown
处理程序等于我的函数。没有抛出错误,但是当我稍后检查文档的设置时,onkeydown
一片空白。我得到了相同的结果IE6 and IE7。我究竟做错了什么?
setTimeout("setKeyHook(parent.document.getElementById(\"bottom\").document);", 1000);
Attached handler
BOTTOM.protocol = HyperText Transfer Protocol
BOTTOM.onkeypress = null
BOTTOM.onrowenter = null
BOTTOM.onmousedown = null
我应该如何跨框架应用相同的事件处理程序?
注意:这需要在 IE6 和 IE7 中工作(并且仅工作)。
我让这个工作
框架集.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>
框架1.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>
框架2.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.框架名称)只是增加不必要的潜在错误。这就是为什么我的脚本明确地查找frames窗口对象的集合。
接下来是在处理框架集时熟悉 DOM 中的各种内置窗口引用。共有4个
-
window- 当前窗口。当省略时也暗示这一点(即 window.onload === onload)
-
parent- 父窗口到当前窗口
-
top- 框架集系列中最顶层的窗口。parent === top当你只有一个框架集时。
-
self- 别名window
所以基本上我在这里所做的是,当 onload 事件在 Frame1 窗口中触发时,为两个框架窗口中的文档的 keydown 事件添加一个处理程序函数。
该函数使用闭包来确保在frame1中生成的事件对于实际处理程序是可用的,无论哪个窗口生成了keydown事件。这是必要的,因为 IE 处理事件的方式。其他浏览器在事件发生时创建新的事件对象并将它们传递给事件处理程序,而 IE 只是修改全局事件对象(通过引用)窗口事件或者更简单,只是event) 来反映当前事件。
我希望这是有道理的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)