2013-07-19 2 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

Вы можете хранить объекты окна, возвращаемые 'открытым()' в глобальном массиве, или, может быть, в объекте, индексированные по имени окна. Тогда вам нужно будет только перебирать этот массив/объект. –

ответ

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

Я не спускал вниз, и мне нравится ваш подход лучше, чем другой ответ, но в этом есть пара ошибок. Во-первых, 'arguments' не является реальным массивом, поэтому вы не можете называть его' splice'. Вместо этого вы хотите сделать что-то вроде 'Array.prototype.splice.call (arguments, 1)'. Кроме того, шаблон 'new function()' кажется немного странным. Вы могли бы сделать это объектным литералом вместо '{openWindows: {}, open: function (instanceName) ...}'. –

+0

Вы правы насчет 'аргументов' - хорошо знать. Что касается шаблона 'new function()', я не могу получить доступ к этому ключевому слову в литерале объекта. –

+0

Вы должны уметь. [Jsfiddle] (http://jsfiddle.net/TBVcJ/) –

Смежные вопросы