Ответ 1
похоже, что это хром-ошибка
https://bugzilla.mozilla.org/show_bug.cgi?id=1295839 https://bugs.chromium.org/p/chromium/issues/detail?id=640620
У меня есть iFrame с открытым окном (url
, uniqueID
, windowparams
).
IFrame находится в одном приложении и размещается на другом сервере.
Каждый раз, когда я обновляю или изменяю страницу, возвращаюсь на страницу IFrame, а затем пытаюсь инициировать тот же window.open
. Вместо обновления уже открытого окна создается экземпляр того же окна. Проверяя window.name
каждого всплывающего окна, он возвращает тот же uniqueID
, что и его window name
. Если URL установлен пустой, он ведет себя так, как ожидалось. Но когда установлен URL-адрес, он создает новый экземпляр окна.
window.open
ведет себя так, когда уничтожается?Майк успешно исправил поведение браузеров 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?
Майк узнал, что использование пустого URL в window.open ведет себя правильно в firefox. Но все же, как исправить это ха-ха.
Здесь Джонни! er Майк означает другой тестовый пример.
Попробуйте использовать браузеры webkit и firefox.
После открытия всплывающего окна обновите страницу, затем откройте другое всплывающее окно
В браузерах webkit будет только один экземпляр вашего окна, однако firefox создаст новый.
console.log(window.name)
в открывшемся всплывающем окне, и вы получите "Mike" в качестве имени окна
https://bug1295839.bmoattachments.org/attachment.cgi?id=8782242
похоже, что это хром-ошибка
https://bugzilla.mozilla.org/show_bug.cgi?id=1295839 https://bugs.chromium.org/p/chromium/issues/detail?id=640620
В вашем коде есть несколько проблем:
Вы вызываете функцию, вложенную внутри другой функции, чтобы закрыть окно, которое никогда не запускается, поскольку родительская функция в данный момент не может быть вызвана.
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>