javascript - IE 中的自关闭弹出窗口——如何获得正确的 onBlur 行为?

标签 javascript internet-explorer dojo popup onblur

我想要一个 transient 窗口在用户点击离开时自行关闭。这适用于 Firefox:

var w = window.open(...);
dojo.connect(w, "onblur", w, "close");

但它似乎在 Internet Explorer 中不起作用。其他一些网站提到了 IE 特定的“onfocusout”事件,但我找不到我需要的一致的工作示例。

Stack Overflow 对让 IE 浏览器窗口在失去焦点时关闭的最佳方法有何看法?

我正在使用 Dojo,所以如果该库中有一些快捷方式,欢迎提供信息。否则标准的 IE 调用将是最好的答案。

最佳答案

我在 IE 中找到了替代方案。

这个:

        that.previewWindowAction = function () {
            var pw =
                window.open(this.link, "preview",
                            "height=600,width=1024,resizable=yes,"
                            + "scrollbars=yes,dependent=yes");
            dojo.connect(pw, "onblur", pw, "close");
        };

应该这样写才能在 IE 中工作:

        that.previewWindowAction = function () {
            var pw =
                window.open(this.link, "preview",
                            "height=600,width=1024,resizable=yes,"
                            + "scrollbars=yes,dependent=yes");
            if (dojo.isIE) {
                dojo.connect
                    (pw.document,
                     "onfocusin",
                     null,
                     function () {
                         var active = pw.document.activeElement;
                         dojo.connect
                             (pw.document,
                              "onfocusout",
                              null,
                              function () {
                                  if (active != pw.document.activeElement) {
                                      active = pw.document.activeElement;
                                  } else {
                                      window.open("", "preview").close();
                                  }
                              });
                     });

            }
            else {
                dojo.connect(pw, "onblur", pw, "close");
            }
        };

原因是什么?

  • 在 IE 中,窗口对象不响应模糊事件。因此我们必须使用专有的 onfocusout 事件。
  • 在IE 中,onfocusout 是由大多数HTML 元素发送的,因此我们必须添加一些逻辑来确定哪个onfocusout 是由窗口失去焦点引起的。在 onfocusout 中,文档的 activeElement 属性总是不同于之前的值 -- except 当窗口本身失去焦点时。这是关闭窗口的提示。
  • 在 IE 中,新窗口中的文档会在首次创建窗口时发送一个 onfocusout。因此,我们必须仅在 onfocusout 处理程序进入焦点后才添加它。
  • 在 IE 中,window.open 在创建新窗口时似乎无法可靠地返回窗口句柄。因此,我们必须按名称查找窗 Eloquent 能关闭它。

关于javascript - IE 中的自关闭弹出窗口——如何获得正确的 onBlur 行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/735992/

相关文章:

javascript - 如何禁用 CSS 过渡、更新样式,然后使用 JavaScript 快速恢复过渡

javascript - 某些 HTML 不希望在 IE 中显示/隐藏。为什么?

javascript - 将文本和图像组合成一个 "entity"

Javascript AOP 支持

javascript - 如何通过javascript自定义activeX警告栏的位置

javascript - domConstruct 放置按钮未触发

javascript - firefox 扩展 - 检测按钮是否按下 shift

php - 构建支持 ajax 的应用程序的最佳方式

javascript - 如何根据单词的长度在一行中添加未知数量的点?

jQuery addClass() 在 IE 中不起作用(8、9,可能还有另一个)