2013-07-19 98 views
1

我知道有很多這個問題的答案很多。關閉所有彈出窗口

我知道,我可以使用

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'); 
+0

你可以存儲由'返回的窗口對象的open()'在全球陣列,或者也許在一個對象,通過窗口名稱索引。那麼你只需要遍歷這個數組/對象。 –

回答

2

試試這個打開和關閉

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() 
} 
+0

使用全局變量不是一個好主意。使用名稱(activeWindows)聽起來像是將來實際上可能被瀏覽器使用的東西,甚至更糟糕。 –

+0

@ go-oleg,有時候會維護一個全局狀態,即使我同意擴展'document'不是一個好主意,當必須的時候,擴展'$'或其他全局對象不應該被忽視。爲封閉而關閉並不總是正確的路要走。 –

+1

@FrédéricHamidi:好點。重要的是要正確命名它們以避免衝突。 –

5

可以使一個新的功能,基本上包裝了你想要做什麼的現有功能。

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

用法示例

WindowDialog.open('windowName', /* arguments you would call in window.open() */); 
WindowDialog.open('anotherName', /* ... */); 
WindowDialog.open('uniqueWindow', /* ... */); 
WindowDialog.open('testingAgain', /* ... */); 
WindowDialog.open('finalWindow', /* ... */); 

// closes the instance you created with the name 'testingAgain' 
WindowDialog.close('testingAgain'); 

// close all dialogs 
WindowDialog.closeAll(); 
+0

我沒有downvote,我喜歡你的方法比其他答案更好,但有一些事情錯了。首先,'arguments'不是一個真正的數組,所以你不能在它上面調用'splice'。相反,你想要做一些像'Array.prototype.splice.call(arguments,1)'。另外,'new function()'模式似乎有點奇怪。您可以將其設爲對象字面值,而不是「{openWindows:{},open:function(instanceName)...}」。 –

+0

你是對的'參數' - 很好知道。至於'new function()'模式,我不能在對象文字中訪問'this'關鍵字。 –

+0

您應該可以。 [的jsfiddle](http://jsfiddle.net/TBVcJ/) –