Javascript 关闭所有弹出窗口

Javascript 关闭所有弹出窗口,javascript,jquery,popup,Javascript,Jquery,Popup,我知道这类问题有很多答案 我知道我可以用 var popup = window.open(''); 以后可以用 popup.close(); 把窗户关上 但是,是否有一种方法可以关闭所有子项而不必存储window.open结果 也就是说,我能做什么 window.open('1'); window.open('2'); window.open('3'); 然后以某种方式进行一次全局关闭呼叫,关闭这三个窗口 如果没有,我可以通过使用下面的代码来完成它吗 window.open('1','wi

我知道这类问题有很多答案

我知道我可以用

var popup = window.open('');
以后可以用

popup.close();
把窗户关上

但是,是否有一种方法可以关闭所有子项而不必存储window.open结果

也就是说,我能做什么

window.open('1');
window.open('2');
window.open('3');
然后以某种方式进行一次全局关闭呼叫,关闭这三个窗口

如果没有,我可以通过使用下面的代码来完成它吗

window.open('1','window1');
window.open('2','window2');
window.open('3','window3');

试试这个开关

document.MyActiveWindows= new Array;

function openWindow(sUrl,sName,sProps){
document.MyActiveWindows.push(window.open(sUrl,sName,sProps))
}

function closeAllWindows(){
for(var i = 0;i < document.MyActiveWindows.length; i++)
document.MyActiveWindows[i].close()
}

试试这个开关

document.MyActiveWindows= new Array;

function openWindow(sUrl,sName,sProps){
document.MyActiveWindows.push(window.open(sUrl,sName,sProps))
}

function closeAllWindows(){
for(var i = 0;i < document.MyActiveWindows.length; i++)
document.MyActiveWindows[i].close()
}

您可以创建一个新函数,该函数基本上将现有功能与您尝试执行的操作打包在一起

var WindowDialog = new function() {
    this.openedWindows = {};

    this.open = function(instanceName) {
        var handle = window.open(Array.prototype.splice.call(arguments, 1));

        this.openedWindows[instanceName] = handle;

        return handle;
    };

    this.close = function(instanceName) {
        if(this.openedWindows[instanceName])
            this.openedWindows[instanceName].close();
    };

    this.closeAll = function() {
        for(var dialog in this.openedWindows)
            this.openedWindows[dialog].close();
    };
};
样本使用


您可以创建一个新函数,该函数基本上将现有功能与您尝试执行的操作打包在一起

var WindowDialog = new function() {
    this.openedWindows = {};

    this.open = function(instanceName) {
        var handle = window.open(Array.prototype.splice.call(arguments, 1));

        this.openedWindows[instanceName] = handle;

        return handle;
    };

    this.close = function(instanceName) {
        if(this.openedWindows[instanceName])
            this.openedWindows[instanceName].close();
    };

    this.closeAll = function() {
        for(var dialog in this.openedWindows)
            this.openedWindows[dialog].close();
    };
};
样本使用


可以将open返回的窗口对象存储在全局数组中,也可以存储在按窗口名称索引的对象中。然后,您只需迭代该数组/对象。您可以将open返回的窗口对象存储在全局数组中,也可以存储在按窗口名称索引的对象中。然后你只需要迭代这个数组/对象,使用全局变量不是一个好主意。使用一个听起来像将来浏览器可能会使用的名称activeWindows更糟糕。@go oleg,有时需要维护全局状态,尽管我同意扩展文档不是一个好主意,但在必要时扩展$或另一个全局对象也不应该被反对。为了闭包而闭包并不总是正确的做法。@FrédéricHamidi:说得好。重要的是正确地命名它们以避免冲突。使用全局变量不是一个好主意。使用一个听起来像将来浏览器可能会使用的名称activeWindows更糟糕。@go oleg,有时需要维护全局状态,尽管我同意扩展文档不是一个好主意,但在必要时扩展$或另一个全局对象也不应该被反对。为了闭包而闭包并不总是正确的做法。@FrédéricHamidi:说得好。重要的是正确地命名它们以避免冲突。我没有投反对票,我更喜欢你的方法,而不是其他答案,但它有几个地方不对劲。首先,参数不是真正的数组,所以不能对其调用splice。相反,您需要执行类似于Array.prototype.splice.callarguments,1的操作。此外,新的函数模式似乎有点奇怪。您可以将其改为对象文本{openWindows:{},open:functioninstanceName…}。关于参数,您是对的,很高兴知道。至于新的函数模式,我不能在对象文本中访问这个关键字。你应该能够。我没有投反对票,我更喜欢你的方法,而不是另一个答案,但它有两个问题。首先,参数不是真正的数组,所以不能对其调用splice。相反,您需要执行类似于Array.prototype.splice.callarguments,1的操作。此外,新的函数模式似乎有点奇怪。您可以将其改为对象文本{openWindows:{},open:functioninstanceName…}。关于参数,您是对的,很高兴知道。至于新的函数模式,我不能在对象文本中访问这个关键字。你应该能够。