删除iframe

时间:2015-09-14 21:15:48

标签: javascript iframe

我遇到一个问题,即表单嵌入在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);

(上面的代码只是一个例子,我已经包含了一个工作的代码集来进一步说明 - http://codepen.io/anon/pen/WQroqe

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

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

问题:我认为最顶级的DOM元素是“窗口”,如果这不是捕获键盘事件,那是什么?据我所知,目前没有其他DOM(即iframe)。我测试过这是firefox和chrome。关于发生了什么以及为什么我要做的事情的任何解释是不可能的,或者一种捕捉事件的方式将不胜感激。

(我目前的解决方案是使用MutationObserver来监视iframe消失并强制重点回到窗口。我也知道我可以使用setInterval来连续检查iframe。这两种解决方案都让我觉得我在做额外的事情工作)。

1 个答案:

答案 0 :(得分:0)

关闭iframe后,如果必须

,请使用$(window).focus();关注窗口

在样本中你会像

那样做
  $iframe.load(function(){
    window.setTimeout(function(){
      console.log("deleting");
      $("#deleteMe iframe").remove();
      $(window).focus(); // <======
    }, 5000);  
  });