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

时间:2012-08-27 08:02:20

标签: javascript html

我有一个HTML页面。在页面的正文中,我调用onload事件调用javascript函数打开一个弹出窗口。这是代码:

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

当我移动到另一个页面,并再次返回该页面时,弹出窗口重新打开,尽管它已经打开。请指导我正确的方向,如果弹出已经打开,那么它不应再打开。我尝试了document.referred,但它要求网站在线,目前我正在线下工作。

5 个答案:

答案 0 :(得分:12)

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

给窗口命名。像这样在您的域名上添加名称可以防止您选择其他人碰巧选择的名称。

永远不要组成以_开头的名称,这些名称是为浏览器对待的特殊名称保留的(与锚元素的“target”属性相同)。

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

编辑:

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

答案 1 :(得分:9)

打开一个窗口并在页面刷新之间保持对它的引用。

var winref = window.open('', 'MyWindowName', '', true);
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, '', true);

    // 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');

答案 2 :(得分:6)

您可以通过在窗口关闭时重新指定窗口来检查窗口是打开还是关闭。例如:

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

答案 3 :(得分:1)

使用“ closed”属性:如果窗口已关闭,则其close属性为true。 https://developer.mozilla.org/en-US/docs/Web/API/Window/closed

答案 4 :(得分:0)

当您移动到另一个页面(在同一个域上)时,您可以使用弹出页面重新设置 window.open变量,如下所示:

https://jsfiddle.net/u5w9v4gf/

尝试尝试:

  1. 点击Run(在jsfiddle编辑器上)。
  2. 点击试试我(预览时)。
  3. 点击“运行”以在另一页上移动,该变量将被重新设置。
  4. 代码:

    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);