Уникальное всплывающее окно с использованием window.open в iframe

У меня есть iFrame с открытым окном (url, uniqueID, windowparams). IFrame находится в одном приложении и размещается на другом сервере. Каждый раз, когда я обновляю или изменяю страницу, возвращаюсь на страницу IFrame, а затем пытаюсь инициировать тот же window.open. Вместо обновления уже открытого окна создается экземпляр того же окна. Проверяя window.name каждого всплывающего окна, он возвращает тот же uniqueID, что и его window name. Если URL установлен пустой, он ведет себя так, как ожидалось. Но когда установлен URL-адрес, он создает новый экземпляр окна.

  • Разве iFrame window.open ведет себя так, когда уничтожается?
  • Я попытался запустить источник iFrame локально, и открытое окно корректно ведет себя даже после обновления.
  • Я пробовал в IE, Firefox и Chrome, и он возвращал то же поведение.

UPDATE:

Майк успешно исправил поведение браузеров Webkit, добавив свойства песочницы для источника iFrame. Теперь метод window.open работает по назначению и не создает новые экземпляры одного и того же окна того же window.name.

Однако Майку до сих пор не повезло с Firefox. Если кто-то может дать работу для этого, это будет очень признательно.

Поведение браузера Webkit для iFrame с sanboxed свойствами в видео ниже.

Посмотрите, что родительский элемент, даже если он обновлен, все еще может обнаружить, что есть уже открытое всплывающее окно с тем же именем. https://youtu.be/z5_xXRjY8Ow

Поведение Firefox для iFrame с sanboxed свойствами в видео ниже.

Когда родительское окно обновляется, браузер не может обнаружить уже открытое всплывающее окно и создает другой экземпляр всплывающего окна с тем же window.name. https://youtu.be/uHaDveW1Sd0

Есть ли способ обхода Firefox, как браузеры Webkit?

UPDATE:

Майк узнал, что использование пустого URL в window.open ведет себя правильно в firefox. Но все же, как исправить это ха-ха.

UPDATE:

Здесь Джонни! er Майк означает другой тестовый пример. Попробуйте использовать браузеры webkit и firefox. После открытия всплывающего окна обновите страницу, затем откройте другое всплывающее окно В браузерах webkit будет только один экземпляр вашего окна, однако firefox создаст новый. console.log(window.name) в открывшемся всплывающем окне, и вы получите "Mike" в качестве имени окна https://bug1295839.bmoattachments.org/attachment.cgi?id=8782242

Ответы

Ответ 2

В вашем коде есть несколько проблем:

  • Вы вызываете функцию, вложенную внутри другой функции, чтобы закрыть окно, которое никогда не запускается, поскольку родительская функция в данный момент не может быть вызвана.

    function openWin(){
         /* code */
    }
    function closeWin(){
         /* code */
    }
    
  • Чтобы обеспечить совместимость браузера с закрытием окна, я настоятельно рекомендую установить и вызывать инъекционную функцию внутри сгенерированного всплывающего окна из родительского окна

Пример для ввода функции:

myWindow.document.write(
        "<p>This is 'myWindow'</p>"
        +"<script>"
        +"function closeWindow()\{" // sample injected function
        +"window.close();"
        +"\}<\/script>"
    ); 

Полный пример:

<!DOCTYPE html>
<html>
<body>

 <button onclick="openWin()">Open "myWindow"</button>
<button onclick="closeWin()">Close "myWindow"</button>

<script>

var myWindow;
function openWin() {
    myWindow = window.open("", "myWindow", "width=200,height=100");
    myWindow.document.write(
        "<p>This is 'myWindow'</p>"
        +"<script>"
        +"function closeWindow()\{" // sample injected function
        +"window.close();"
        +"\}<\/script>"
    );    
}
function closeWin() {
        if(!myWindow.closeWindow) {
            setTimeout(closeWin,1000); // repeat if function not found
        } else { 
            myWindow.closeWindow();
        }
}
</script>
</body>
</html>