【问题标题】:Window events lost after removing iframe删除 iframe 后窗口事件丢失
【发布时间】:2015-09-15 07:40:03
【问题描述】:

我遇到了一个问题,即表单嵌入到 iframe 中,并且在提交表单后,iframe 会从 DOM 中删除。删除表单后(表单是最后一个焦点),我无法检测到绑定到根窗口元素的事件。

框架是从一个单独的域加载的,尽管对于这个例子来说这无关紧要,重要的是我无法控制那个页面上的脚本。

我了解我无法检测 iframe 中的 DOM 事件,但所有事件都会丢失,直到用户在 iframe 移除后重新点击 DOM。这在 FirefoxChrome 中都会发生。 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。这两种解决方案都感觉我在做额外的事情工作)。

【问题讨论】:

    标签: javascript iframe


    【解决方案1】:

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

    在示例中你会这样做

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

    【讨论】:

    • 我得到了相同的解决方案,但提供了一个可能的解释:它看起来像一个错误或严重愚蠢。 Firefox 似乎正确地遵循 HTML5 7.4.2 将 document.activeElement 放回正文,但似乎失去了浏览上下文:我不得不单击窗口重新启动键值回显。 @JaromandaX
    • 我很困惑......你认为这种行为是一个错误或严重愚蠢,但它正确地遵循了 HTML5 的某些部分,似乎并没有解决这种特殊情况......即什么删除焦点元素时获得焦点? - 我想说firefox AND CHROME 的行为在这方面很烦人,但是非常愚蠢???
    • 在 Firefox 错误 706773 (bugzilla.mozilla.org/show_bug.cgi?id=706773) 中报告了断开键盘事件的问题。符合 HTML5 焦点管理] (w3.org/TR/html5/editing.html#focus-management) 应该可以解决该问题。我认为该错误已被修复(尚未修复)并为造成的混乱道歉。
    • @Traktor53 您链接到的错误是我正在寻找的答案。我试图找到这种行为的某种文档(错误报告或其他)。我创建了另一个代码笔,它显示了链接到的错误及其与 iframe 删除相同的行为。 codepen.io/anon/pen/XmXqdP.
    • 有趣的是,调用 button.remove 而不是 button.disable,会导致窗口按预期抓取 keydown 事件。
    猜你喜欢
    • 2018-03-15
    • 1970-01-01
    • 2011-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-03
    相关资源
    最近更新 更多