检查窗口是否已经打开 window.open

26

我有一个HTML页面,在页面的body中,我调用onload事件,该事件会调用一个JavaScript函数来打开一个弹出窗口。以下是代码:

var newWindow = null;
function launchApplication()
{
    if ((newWindow == null) || (newWindow.closed))
    {
        newWindow = window.open('abc.html','','height=960px,width=940px');
    }
}

当我跳转到另一个页面后,再回来这个页面时,弹出窗口重新打开,尽管它已经打开了。请指导我正确的方向,以便如果弹出窗口已经打开,则不应再次打开。我尝试过使用document.referred,但它需要在线网站,而我目前在离线状态下工作。


这是因为当您移动到另一页时,newWindow引用不再可访问。当您返回该页面时,newWindow被初始化为null并且您会得到一个新的弹出窗口。恐怕您无法使用JavaScript或任何客户端技术来解决此问题。有其他想法的人吗? - MaVRoSCy
通过服务器端技术,这可能是可能的。 - MaVRoSCy
1
@MaVRoSCy,服务器如何处理明显是客户端问题的事情?如果有一种服务器端技术可以做到这一点,那么我们需要提交安全报告并努力关闭它。 - Jon Hanna
@Jon Hanna 和会话管理显然是在服务器端:P - MaVRoSCy
@MaVRoSCy 是的,但你之前说过客户端无法完成它,然后又提出了一种“服务器端”的方式,其中涉及到客户端。无论如何,这种方法也行不通,因为它不知道窗口是否关闭,也无法获取窗口的引用(他们可能想要打开其他资源或以某种方式使用newWindow)。他们最好还是按照正常的客户端方式来完成它。 - Jon Hanna
显示剩余6条评论
5个回答

22
newWindow = window.open('abc.html','com_MyDomain_myWindowForThisPurpose','height=960px,width=940px');

给窗口命名。像这样基于你的域名来命名,可以避免你选择别人已经选过的名称。

永远不要编写以 _ 开头的名称,因为那些名称是浏览器特殊处理的保留名称(与锚元素的 "target" 属性相同)。

请注意,如果使用不同的选项打开了该名称的窗口(例如不同的高度),则该窗口将保持这些选项。这里的选项仅在没有该名称的窗口时才会生效,因此您会创建一个新的窗口。

编辑:

请注意,"name" 是窗口的名称,而不是内容。它不会影响标题(newWindow.document.title 将受到影响,当然,abc.html 中的代码也会受到影响)。它确实会影响跨窗口执行其他操作的尝试。因此,具有相同名称的另一个 window.open 将重用此窗口。还有一个类似于 <a href="def.html" target="com_MyDomain_myWindowForThisPurpose">clicky!</a> 的链接将重新使用它。常规警告适用于各种情况下浏览器对打开窗口的抵制(弹出窗口阻止)。


1
它基本上是一个命令,用于命名标题,并重新打开窗口。 - Saghir A. Khatri
1
没有问题。我只是感到困惑它为什么不工作,JavaScript总可以有“除了这些浏览器之外......”,但在NN2中却可行,这是第一个JavaScript浏览器,所以我想也许一些新的弹出阻止正在干扰。 - Jon Hanna
有没有选项可以在按钮点击时指向已经打开的窗口? - ranjenanil
@ranjenanil,抱歉我不知道你在那里意思。 - Jon Hanna
我的意思是,当单击按钮时,是否有集中弹出页面的选项? - ranjenanil
显示剩余3条评论

14
打开一个窗口并在页面刷新之间保持对其的引用。
var winref = window.open('', 'MyWindowName', '');
if(winref.location.href === 'about:blank'){
    winref.location.href = 'http://example.com';
}

或以函数格式

function openOnce(url, target){
    // open a blank "target" window
    // or get the reference to the existing "target" window
    var winref = window.open('', target, '');

    // if the "target" window was just opened, change its url
    if(winref.location.href === 'about:blank'){
        winref.location.href = url;
    }
    return winref;
}
openOnce('http://example.com', 'MyWindowName');

8

当窗口关闭时,重新分配引用可以检查窗口是否打开或关闭。例如:

var newWindow;
var openWindow = function(){
    newWindow = newWindow || window.open('newpage.html');
    newWindow.focus();
    newWindow.onbeforeunload = function(){
        newWindow = null;
    };
};

1

0

当您在同一域名下切换到另一页时,您可以使用弹出页面重新设置window.open变量,如下所示:

https://jsfiddle.net/u5w9v4gf/

尝试步骤:

  1. 点击运行(在jsfiddle编辑器上)。
  2. 点击试一下(在预览中)。
  3. 点击运行以转到另一页,变量将被重新设置。

代码:

window.currentChild = false;

$("#tryme").click(function() {
    if (currentChild) currentChild.close();
    const child = window.open("about:blank", "lmao", 'width=250,height=300');
    currentChild = child;

    //Scrope script in child windows
    child.frames.eval(`
    setInterval(function () {
        if (!window.opener.currentChild)
            window.opener.currentChild = window;
    }, 500);
  `);
});


setInterval(function() {
console.log(currentChild)
    if (!currentChild || (currentChild && currentChild.closed))
        $("p").text("No popup/child. :(")
    else
        $("p").text("Child detected !")
}, 500);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接