Javascript 删除iframe后窗口事件丢失

Javascript 删除iframe后窗口事件丢失,javascript,iframe,Javascript,Iframe,我有一个问题,表单嵌入到iframe中,提交表单后,iframe将从DOM中删除。在删除表单之后(表单是最后一个有焦点的对象),我无法检测绑定到根窗口元素的事件 该框架是从一个单独的域加载的,尽管对于本例来说并不重要,但重要的是我无法控制该页面上的脚本 我知道我无法在iframe中检测到DOM事件,但在用户删除iframe后单击DOM之前,所有事件都将丢失。这在Firefox和Chrome中都会发生。IE看起来像预期的那样将焦点返回到原始DOM。我没有在其他浏览器中测试过 $(window).

我有一个问题,表单嵌入到iframe中,提交表单后,iframe将从DOM中删除。在删除表单之后(表单是最后一个有焦点的对象),我无法检测绑定到根窗口元素的事件

该框架是从一个单独的域加载的,尽管对于本例来说并不重要,但重要的是我无法控制该页面上的脚本

我知道我无法在iframe中检测到DOM事件,但在用户删除iframe后单击DOM之前,所有事件都将丢失。这在Firefox和Chrome中都会发生。IE看起来像预期的那样将焦点返回到原始DOM。我没有在其他浏览器中测试过

 $(window).keydown(function(e){
    console.log (e.keyCode);   
 });

var $iframe = $("<iframe src='www.example.com'>");
$("body").append($iframe);

window.setTimeout(function(){
 $iframe.remove();
}, 1000);
$(窗口).keydown(函数(e){
console.log(例如keyCode);
});
变量$iframe=$(“”);
$(“正文”)。追加($iframe);
setTimeout(函数(){
$iframe.remove();
}, 1000);
(上面的代码只是一个示例,我已经包含了一个工作代码笔来进一步说明-)

要使用代码笔-
单击“单击以加载iframe按钮”
确保在iframe中单击,使其具有焦点
在iframe删除之后,键入任何内容,注意DOM不会记录您的击键
单击DOM并注意您的击键被正确记录

用例:表单打开一个iframe并提交,然后将自己从DOM中移除。我希望能够在表单提交后检测键盘事件,而无需用户使用鼠标

问:我认为最顶层的DOM元素是“window”,如果这不是捕获键盘事件,那么它是什么?据我所知,目前没有其他DOM(即iFrame)。我测试了firefox和chrome。任何关于正在发生什么以及为什么我尝试做的是不可能的解释,或者一种捕捉事件的方法都将不胜感激


(我目前的解决方案是使用MutationObserver监视iframe消失,并强制将焦点放回窗口。我还知道我可以使用设置间隔来持续检查iframe。这两种解决方案都让我感觉我在做额外的工作)。

关闭iframe后,使用
$(window.focus())聚焦窗口如果必须的话

在样品中,你会喜欢的

  $iframe.load(function(){
    window.setTimeout(function(){
      console.log("deleting");
      $("#deleteMe iframe").remove();
      $(window).focus(); // <======
    }, 5000);  
  });
$iframe.load(函数(){
setTimeout(函数(){
控制台日志(“删除”);
$(“#deleteMe iframe”).remove();

$(窗口).focus();//我找到了相同的解决方案,但给出了一个可能的解释:这看起来像是一个bug或愚蠢透顶。Firefox似乎正确地遵循HTML5 7.4.2将document.activeElement放回正文,但似乎丢失了浏览上下文:我必须单击窗口重新启动键值echo。@JaromandaXI我很困惑……你认为这是behaviour是一个bug或严重的愚蠢,但它正确地遵循了HTML5的某些部分,这些部分似乎没有解决这个特殊情况…即,当焦点元素被删除时,什么会得到焦点?-我想说firefox和CHROME的行为在这方面是令人讨厌的,但严重的愚蠢???键盘事件断开的问题在Firefox bug 706773()中报告。符合HTML5 focus management]()应该可以解决问题。我认为该bug已经修复(尚未修复),并对由此引起的混乱表示歉意。@Traktor53您链接到的bug是我正在寻找的答案。我正试图找到有关此行为的某种文档(bug report或其他)。我创建了另一个代码笔,显示链接到的bug及其与iframe删除相同的行为。有趣的是,调用button.remove而不是button.disable,会导致窗口按预期抓取keydown事件。