【问题标题】:Check whether a window is Popup or not?检查一个窗口是否是Popup?
【发布时间】:2012-05-01 16:40:38
【问题描述】:

这个问题不是if window is popup的重复,而是一个类似的问题。

我正在开发一个将脚本注入所有网页的扩展程序。我需要检测窗口是否弹出。

注意: 我不是打开弹窗的人,所以上面的解决方案是行不通的。

【问题讨论】:

  • 你的弹窗是window.open()吗?
  • 不,我不是打开弹出窗口的人。所以我和 window.open() 没有关系
  • 那么您使用的是哪种弹出窗口?
  • 定义“弹出窗口”,因为浏览器可以选择将弹出窗口作为新标签打开。您是否认为“以编程方式打开的选项卡”也是弹出窗口?
  • 在这种情况下,什么真正定义了与您的扩展所需的区别有关的弹出窗口?它只是当前窗口具有的功能吗?

标签: javascript jquery html


【解决方案1】:

我使用此代码来确定弹出窗口

(window.opener && window.opener !== window && !window.menubar.visible)

【讨论】:

  • window.opener && 位是不必要的,因为如果openernull,它不会等于window
  • window.opener && 位是必需的。否则window.opener为null时,不等于window,不等于window时认为是弹窗
【解决方案2】:

我在“Typescript/Nodejs”中实现了弹出窗口屏幕的“关闭”按钮和“_self”窗口的“取消”按钮,我相信它也适用于 JavaScript。 所以我需要确定屏幕是否在弹出窗口中打开

if(window.opener || window.history.length === 1) 
     isPopupWindow = true;
else 
   isPopupWindow = false;

“window.opener”适用于几乎所有浏览器,但 IE 存在问题,因此为了处理 IE 问题,我使用了“window.history.length”。

【讨论】:

    【解决方案3】:

    为什么不检查开瓶器是否未定义?弹出窗口有一个开启器,而常规页面没有。

    if (window.opener != null) 
    

    【讨论】:

    • 您应该检查window.openernull,而不是undefined
    【解决方案4】:

    我发现有些浏览器会在某些情况下将 window.opener 设置为 window。这是我目前使用的最可靠的弹出检查。

    if (window.opener && window.opener !== window) {
      // you are in a popup
    }
    

    【讨论】:

    • 是的,我想这就是门票。
    • 强制性“这应该是公认的答案”。另一个补充虽然;如果你可能从 window.open 的第二个参数中知道窗口的名称,你可以使用这个:window.open('example.org', 'the-window-name') 可以用if (window.opener && … window.name === 'the-window-name') 进行检查
    • 如果您关闭“opener”浏览器窗口,这将不起作用。那么window.opener 就是null。当用户被重定向到另一个域 (source) 时,也会发生同样的事情。
    • Christian Davén - 有趣的发现。关于关闭开瓶器的部分,也许您可​​以立即将条件的初始值存储在变量中。
    • 这不是灵丹妙药。正如在一些 cmets 中所指出的,window.opener 将返回 true即使不是弹出窗口,如果窗口是用 window.open 打开的,甚至还有其他一些情况。请注意这一点。
    【解决方案5】:

    对我来说,我正在实现一个注销屏幕,该屏幕可以通过 window.open(..) 或从单个页面中的链接显示在弹出窗口中。

    我需要确定:

    1) 如果我的注销屏幕在弹出窗口中,则:

    event.preventDefault();
    window.close();
    

    2) 否则使用浏览器返回功能..

    window.history.back();
    

    我的解决方案: 如果页面在弹出窗口中,在我的情况下,它的窗口页面历史为 1:

    event.preventDefault();
    if (window.history.length === 1) {
        window.close();
    } else {
        window.history.back();
    }
    

    【讨论】:

      【解决方案6】:

      在 Chrome、Firefox、Safari 和 IE8 中进行测试时,以下内容对我有用。它适用于使用 window.open() 或 target=_blank 创建的窗口。

      if (window.opener) {
          alert('inside a pop-up window or target=_blank window');
      } else if (window.top !== window.self) {
          alert('inside an iframe');
      } else {
          alert('this is a top level window');
      }
      

      【讨论】:

      • window.opener 在 IE 中未定义,如果弹出窗口有另一个来源。
      • 当弹出窗口包含 iframe 并且脚本检查 window.opener 在 iframe 内运行时,这将无济于事。
      • 我将window.opener 作为普通页面的真实值(不是通过 window.open 弹出的)。我正在使用最新的 Chrome。
      • 按 F5 刷新弹出窗口时不工作
      【解决方案7】:

      最好的办法,就是检查窗口宽度,然后尝试以一两个像素调整窗口宽度,然后检查当前宽度是否等于调整前的宽度

      换句话说,如果你成功调整了窗口大小,你很可能在一个弹出窗口中。

      祝你好运。

      【讨论】:

        【解决方案8】:

        window.locationbar.visible不一定只用于弹出窗口,但可以帮助检测用户是否可以通过位置栏手动更改位置...

        【讨论】:

        • 最好看window.menubar.visible,如this related question
        • 对于 Chrome 扩展,我需要将弹出窗口与浏览器操作弹出窗口中加载的相同代码区分开来。我假设menubar.visible 在这两种情况下都是false,因为这两种弹出窗口都没有显示菜单栏。但实际上是true在浏览器动作案例中,所以可以用来区分这两种扩展弹窗。
        【解决方案9】:

        这不是一个可靠的方法,但通常使用window.open() 的弹出窗口不会指向新的 URL,因此两个窗口将具有相同的 href。因此,在很多情况下:

        window.location.href == window.opener.location.href
        

        对于弹出窗口将是正确的。所以你可以这样做:

        var isPopup = (window.location.href == window.opener.location.href);
        

        就像我说的,这在我有限的测试中有效,所以可能会有一些反馈表明这不可靠。

        【讨论】:

        • widnow.open() 可以打开空白窗口并使用 JavaScirpt 创建内容或具有任何 URL,内部或外部设置(显然您将无法使用另一个域 URL 控制弹出窗口由于相同的域策略)。
        • 对。如果指定了 URL,这将不起作用。但通常当指定 url 时,在诸如 OP 之类的情况下,他可能希望无论如何都发生任何代码注入。不确定,但通常情况下。
        • 只是补充一下,如果 window.location.href == window.opener.location.href 为真而不是弹出窗口
        • 同意@AmirBar,我已经扩展了这个例子:isPopup = (window.opener!=undefined);
        【解决方案10】:

        如果窗口是弹出窗口或子框架,则以下语句为真:

         window.parent != window
        

        【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-11-03
        • 2017-02-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多