如何为一个页面的所有框架定义一个全局的onkeydown?

How to define a global onkeydown for all frames of a page?

我有一个非常复杂的遗留多框架页面,它必须与 IE-11 兼容并且需要响应热键事件。

不幸的是,我注意到我不能只在父页面中声明一个 JS 方法。相反,似乎每个帧都需要自己的 document.onkeydown() 方法,因为现在,只有当我单击定义了方法 onkeydown() 的帧时,事件才会起作用。

有没有什么办法可以全局定义这个方法,让所有的框架都处理这个事件?我试图避免我必须为每个页面声明相同的方法(或相同的 JS 代码)的不舒服的情况(这将是一场噩梦,因为框架是由某些 struts/spring mvc 规则路由的动态生成的页面)

我可以从两个方面来解释这个问题,我认为 both/either 可能会有用,所以我将同时回答这两个问题。

1) 如何在多个 HTML 帧之间共享代码(一个 function/method/class 随便*)?

在浏览器中并没有真正正确的方法来执行此操作,至少不是我认为您想要的方式。框架,被认为是一个遗留特性,自 90 年代以来并没有太大变化,那是在大型复杂的 JS 代码库出现之前。如果不考虑浏览器扩展之类的东西,就没有定义函数的本机方法'globally'。

这通常不是问题,因为执行此操作的典型方法是让每个帧都从通用脚本中绘制。您可以将脚本标记放在 HTML 页面的顶部(或底部)。

<script src='common-code.js'></script>

但是如果你问,我怎么能在每一帧中都存在这个 JS 函数而不更新每一帧的单独 HTML?那我怕你倒霉了。这是每个框架如何被视为单独文档的一个特性,出于安全原因,您不能进入另一个文档并说 'run this code'.

我会尝试找到一种方法来批量更新页面并添加一个包含或获取通用代码的脚本标记,或者如果一些通用 HTML 已经被定义,你可能会很幸运你可以将其添加到那里。

* 惊喜,在JavaScript中,所有这些真的是一回事!

2) 如何将事件(按下)从一帧传递到另一帧?

您可以使用 WindowpostMessage 方法来模拟此操作,将消息从一个框架发送到另一个框架,然后接收者框架将处理该消息,而不是本机事件。

无论您使用的是框架集还是 iframe,我相信您都必须将每个事件传递给父级,然后父级将使用 window.frames 列表将事件发回。有点头疼,但可能。

(要明确的是,这并没有解决第一个答案中讨论的限制。这就是你如何实现一个框架中的点击被另一个 'handled' 获得的情况 - 你仍然会有更新两个框架以包含消息传递和处理代码)。