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

时间:2019-04-18 13:56:26

标签: javascript html internet-explorer-11 frames

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

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

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

1 个答案:

答案 0 :(得分:1)

我可以用两种方式解释这个问题,我认为两者/两者都可能有用,所以我将回答两者。

1)如何在多个HTML框架之间共享代码(函数/方法/类等等)?

在浏览器中并没有真正合适的方法,至少不是我想的那样。自90年代以来,框架一直被认为是一项传统功能,并没有太大变化,而那是在大型复杂的JS代码库成为现实之前。没有一种不考虑浏览器扩展之类的“全局”定义函数的本地方法。

这通常不是问题,因为通常的方法是从通用脚本中绘制每个框架。您可以将脚本标签放在HTML页面的顶部(或底部)。

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

但是,如果您要问,如何在不更新每个框架的单独HTML的情况下在每个框架中都存在此JS函数?那我怕你运气不好。这是每个框架如何被视为单独文档的功能,出于安全原因,您不能进入另一个文档并说“运行此代码”。

我会尝试找到一种方法来批量更新页面并添加包含或获取公共代码的脚本标签,或者如果已经定义了一些公共HTML,则可以在其中添加它。 >

*令人惊讶的是,在JavaScript中,所有这些都是真的!

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

您将使用Window的{​​{3}}方法来模拟这一点,以将消息从一个帧发送到另一帧,然后接收者帧将处理该消息,而不是本机事件。

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

(要清楚的是,这并没有绕过第一个答案中讨论的限制。这是您如何实现一个帧中的单击被另一个“处理”的情况-您仍然必须更新两个帧包括消息传递和处理代码)。