I’m having a problem always when I’m trying to close a window through the window.close()
method of the Javascript, while the browser displays the below message on the console:
"Scripts may close only the windows that were opened by it."
This occurs in every part of the page. I can run this directly of a link, button, or a script, but this message always are displayed.
I’m tried to replace the window.close();
method for the functions (or variants of these) below, but nothing happened again:
window.open('', '_self', '');
window.close();
asked Sep 19, 2014 at 15:17
mayconfsbritomayconfsbrito
2,1054 gold badges26 silver badges45 bronze badges
1
I searched for many pages of the web through of the Google and here on the Stack Overflow, but nothing suggested resolved my problem.
After many attempts, I’ve changed my way of testing that controller. Then I have discovered that the problem occurs always when I reopened the page through of the Ctrl + Shift + T
shortcut in Chrome. So the page ran, but without a parent window reference, and because this can’t be closed.
answered Sep 19, 2014 at 15:17
mayconfsbritomayconfsbrito
2,1054 gold badges26 silver badges45 bronze badges
Error messages don’t get any clearer than this:
"Scripts may close only the windows that were opened by it."
If your script did not initiate opening the window (with something like window.open), then the script in that window is not allowed to close it. Its a security to prevent a website taking control of your browser and closing windows.
answered Sep 19, 2014 at 15:21
somethingheresomethinghere
16.4k2 gold badges28 silver badges42 bronze badges
3
You can’t close a current window or any window or page that is opened using ‘_self’
But you can do this
var customWindow = window.open('', '_blank', '');
customWindow.close();
answered Sep 19, 2014 at 15:33
0
Ran into this issue but I was using window.open('','_blank','')
. The issue seems to be that the script that used window.open
should also call the close
function.
I found a dirty yet simple workaround that seems to get the job done —
// write a simple wrapper around window.open that allows legal close
const openWindow = () => {
const wind = window.open('','_blank','');
// save the old close function
const actualClose = wind.close;
// Override wind.close and setup a promise that is resolved on wind.close
const closePromise = new Promise(r=>{wind.close = ()=>{r(undefined);}});
// Setup an async function
// that closes the window after resolution of the above promise
(async ()=>{
await closePromise; // wait for promise resolution
actualClose(); // closing the window here is legal
})();
return wind;
}
// call wind.close anywhere
document.getElementById('myButton').addEventListener('click', wind.close)
I don’t know if this somehow defeats some security feature or if this will be patched later but it does seem to work on chrome version 101.0.4951
answered Apr 29, 2022 at 18:47
You can only close a window that your script made, so this is possible:
window.open("", "_blank", "");
window.close();
But otherwise you can change the link, like that:
location.href = "https://bruh.io";
Make sure that you have https://
Otherwise if you were in https://www.youtube.com
and you run location.href = bruh.io
you’ll go to https://www.youtube.com/bruh.io
answered Aug 8, 2022 at 22:22
ZiyadCodesZiyadCodes
3993 silver badges10 bronze badges
You can close the window if it was opened to users by a link like:
<А rel='opener' href='test.net '></А>
pay attention to the tag:
rel=’opener’
vimuth
5,12434 gold badges79 silver badges116 bronze badges
answered Aug 17, 2022 at 6:17
Don’t use <a href='URL' target='_blank'>open</a>
in the parent to open a new window.
Use <a href='' onClick="window.open('URL'); return false">open</a>
in the parent instead.
Then you can use <a href='' onClick="window.open('URL'); return false">close</a>
in the children.
Works like a charm for me.
answered Oct 13, 2022 at 7:22
My workaround for internal use was to create desktop shortcuts.
Example here:
- Google Chrome (Target)
"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" https://url_of_my_app
- Microsoft Edge (Target)
"C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe" https://url_of_my_app
You must allow before pop-ups and redirects from url of your app in browser settings.
So window.close();
works.
It open the pop-up and close window using:
window.open('/my_page.htm', '_blank', 'popup=true');
window.close();
I don’t know if this will be patched later but it does seem to work on:
Windows 10
Google Chrome 113.0.5672.127 (Official version) 64 bits
Microsoft Edge 113.0.1774.50 (Official build) (64 bits)
Can someone test this on others OS, please?
Reference:
https://developer.mozilla.org/en-US/docs/Web/API/Window/open
answered May 25 at 15:17
The windows object has a windows field in which it is cloned and stores the date of the open window, close should be called on this field:
window.open("", '_self').window.close();
answered Feb 5, 2021 at 14:58
0
Working Solution 2022
const closeWindow = () => {
window.open(location.href, "_self", "");
window.close()
}
How it worked ?
- Basically window.close() only work if any window launched by window.open()
- Here we firstly redirect to same url then close and it worked
answered Jan 6, 2022 at 12:31
The below code worked for me
window.open('your current page URL', '_self', '');
window.close();
Kewin Dousse
3,9102 gold badges25 silver badges46 bronze badges
answered May 28, 2015 at 10:38
DfrDknDfrDkn
1,2802 gold badges16 silver badges23 bronze badges
0
I’m having a problem always when I’m trying to close a window through the window.close()
method of the Javascript, while the browser displays the below message on the console:
"Scripts may close only the windows that were opened by it."
This occurs in every part of the page. I can run this directly of a link, button, or a script, but this message always are displayed.
I’m tried to replace the window.close();
method for the functions (or variants of these) below, but nothing happened again:
window.open('', '_self', '');
window.close();
asked Sep 19, 2014 at 15:17
mayconfsbritomayconfsbrito
2,1054 gold badges26 silver badges45 bronze badges
1
I searched for many pages of the web through of the Google and here on the Stack Overflow, but nothing suggested resolved my problem.
After many attempts, I’ve changed my way of testing that controller. Then I have discovered that the problem occurs always when I reopened the page through of the Ctrl + Shift + T
shortcut in Chrome. So the page ran, but without a parent window reference, and because this can’t be closed.
answered Sep 19, 2014 at 15:17
mayconfsbritomayconfsbrito
2,1054 gold badges26 silver badges45 bronze badges
Error messages don’t get any clearer than this:
"Scripts may close only the windows that were opened by it."
If your script did not initiate opening the window (with something like window.open), then the script in that window is not allowed to close it. Its a security to prevent a website taking control of your browser and closing windows.
answered Sep 19, 2014 at 15:21
somethingheresomethinghere
16.4k2 gold badges28 silver badges42 bronze badges
3
You can’t close a current window or any window or page that is opened using ‘_self’
But you can do this
var customWindow = window.open('', '_blank', '');
customWindow.close();
answered Sep 19, 2014 at 15:33
0
Ran into this issue but I was using window.open('','_blank','')
. The issue seems to be that the script that used window.open
should also call the close
function.
I found a dirty yet simple workaround that seems to get the job done —
// write a simple wrapper around window.open that allows legal close
const openWindow = () => {
const wind = window.open('','_blank','');
// save the old close function
const actualClose = wind.close;
// Override wind.close and setup a promise that is resolved on wind.close
const closePromise = new Promise(r=>{wind.close = ()=>{r(undefined);}});
// Setup an async function
// that closes the window after resolution of the above promise
(async ()=>{
await closePromise; // wait for promise resolution
actualClose(); // closing the window here is legal
})();
return wind;
}
// call wind.close anywhere
document.getElementById('myButton').addEventListener('click', wind.close)
I don’t know if this somehow defeats some security feature or if this will be patched later but it does seem to work on chrome version 101.0.4951
answered Apr 29, 2022 at 18:47
You can only close a window that your script made, so this is possible:
window.open("", "_blank", "");
window.close();
But otherwise you can change the link, like that:
location.href = "https://bruh.io";
Make sure that you have https://
Otherwise if you were in https://www.youtube.com
and you run location.href = bruh.io
you’ll go to https://www.youtube.com/bruh.io
answered Aug 8, 2022 at 22:22
ZiyadCodesZiyadCodes
3993 silver badges10 bronze badges
You can close the window if it was opened to users by a link like:
<А rel='opener' href='test.net '></А>
pay attention to the tag:
rel=’opener’
vimuth
5,12434 gold badges79 silver badges116 bronze badges
answered Aug 17, 2022 at 6:17
Don’t use <a href='URL' target='_blank'>open</a>
in the parent to open a new window.
Use <a href='' onClick="window.open('URL'); return false">open</a>
in the parent instead.
Then you can use <a href='' onClick="window.open('URL'); return false">close</a>
in the children.
Works like a charm for me.
answered Oct 13, 2022 at 7:22
My workaround for internal use was to create desktop shortcuts.
Example here:
- Google Chrome (Target)
"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" https://url_of_my_app
- Microsoft Edge (Target)
"C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe" https://url_of_my_app
You must allow before pop-ups and redirects from url of your app in browser settings.
So window.close();
works.
It open the pop-up and close window using:
window.open('/my_page.htm', '_blank', 'popup=true');
window.close();
I don’t know if this will be patched later but it does seem to work on:
Windows 10
Google Chrome 113.0.5672.127 (Official version) 64 bits
Microsoft Edge 113.0.1774.50 (Official build) (64 bits)
Can someone test this on others OS, please?
Reference:
https://developer.mozilla.org/en-US/docs/Web/API/Window/open
answered May 25 at 15:17
The windows object has a windows field in which it is cloned and stores the date of the open window, close should be called on this field:
window.open("", '_self').window.close();
answered Feb 5, 2021 at 14:58
0
Working Solution 2022
const closeWindow = () => {
window.open(location.href, "_self", "");
window.close()
}
How it worked ?
- Basically window.close() only work if any window launched by window.open()
- Here we firstly redirect to same url then close and it worked
answered Jan 6, 2022 at 12:31
The below code worked for me
window.open('your current page URL', '_self', '');
window.close();
Kewin Dousse
3,9102 gold badges25 silver badges46 bronze badges
answered May 28, 2015 at 10:38
DfrDknDfrDkn
1,2802 gold badges16 silver badges23 bronze badges
0
Время на прочтение
7 мин
Количество просмотров 9.8K
Порой веб-разработчики с удивлением обнаруживают, что команда windows.close()
не всегда закрывает окно браузера. А в консоли инструментов разработчика браузера при этом выводится сообщение, указывающее на то, что скрипты могут закрывать только окна, которые ими же и открыты:
Scripts may close only the windows that were opened by them.
Почему браузеры ограничивают команду close()?
Прежде чем мы перейдём к разговору о том, какие факторы влияют на поведение браузера при вызове close()
, важно сначала разобраться с тем, почему вообще существуют ограничения, применяемые при выполнении этой команды.
Иногда такое поведение браузеров объясняют, ссылаясь на некие таинственные «соображения безопасности». Но основная причина ограничений, применяемых к close()
, больше связана с тем, что называют «пользовательский опыт». А именно, если скрипты смогут свободно закрывать любые вкладки браузеров, пользователь может потерять важные данные, состояние веб-приложения, работающего во вкладке. Это, кроме того, если вкладка или окно браузера неожиданно закрывается, может привести к нарушению механизмов перемещения по истории посещения страниц. Такие перемещения выполняются браузерными кнопками Вперёд
и Назад
(в Internet Explorer мы называли этот механизм TravelLog
). Предположим, пользователь применяет вкладку браузера для исследования результатов поиска. Если одна из изучаемых им страниц сможет закрыть вкладку, хранящую стек навигации, историю посещённых страниц, среди которых — страница с результатами поиска, это будет довольно-таки неприятно.
Кое-что тут, конечно, имеет отношение и к безопасности, и к защите пользователей браузеров от мошенников. Например, если браузерные вкладки могли бы свободно сами себя закрывать — это могло бы найти применение на вредоносных страницах, пугающих пользователей, или в каких-нибудь мошеннических схемах.
Что написано в стандартах?
Вот что об этом всём говорится в разделе dom-window-close стандарта HTML:
Контекст просмотра может закрываться скриптами в том случае, если это вспомогательный контекст, созданный скриптом (в отличие от контекста, созданного в результате действий пользователя), или если это контекст верхнего уровня, история сессий которого содержит только один Document.
Тут, вроде бы, всё достаточно просто и понятно, хотя те части текста, которые я выделил, скрывают в себе много сложностей и тонкостей. (Совершенно закономерным можно счесть такой вопрос: «Что делать, если скрипт был запущен в ответ на действия пользователя?».)
Как поступают браузеры?
К нашему сожалению, у каждого браузера имеется собственный набор моделей поведения, связанный с window.close()
(можете поэкспериментировать с этой тестовой страницей). Отчасти это так из-за того, что большинство этих моделей поведения было реализовано до появления соответствующего стандарта.
▍Internet Explorer
В Internet Explorer вкладка или окно браузера закрывается без лишних вопросов в том случае, если для создания этой вкладки или этого окна была использована команда window.open()
. Браузер не пытается удостовериться в том, что история посещений страниц вкладки содержит лишь один документ. Даже если у вкладки будет большой TravelLog
, она, если открыта скриптом, просто закроется. (IE, кроме того, позволяет HTA-документам закрывать самих себя без каких-либо ограничений).
Во всех других случаях вкладку (или окно) просто так не закрыть: пользователю показывают одно или два модальных окна, что зависит от того, представлена ли страница единственной вкладкой в окне браузера.
Окна для подтверждения закрытия вкладки или окна
▍Chromium (Microsoft Edge, Google Chrome и другие браузеры)
В Chromium 88 команда window.close()
выполняется успешно в том случае, если у нового окна или у новой вкладки что-то записано в свойство opener, или в том случае, если стек навигации страницы содержит менее двух записей.
Как видите, тут наблюдается небольшое отличие того, что требует спецификация, от того, что реализовано в браузере.
Во-первых — обратите внимание на то, что я упомянул свойство opener
, а не сказал о том, что «страница была создана скриптом». Вспомним о том, что свойство opener
позволяет всплывающему окну обращаться к создавшей его вкладке.
- Если пользователь создаёт новую вкладку, щёлкнув по соответствующей кнопке, воспользовавшись комбинацией клавиш
Ctrl + T
, щёлкнув по ссылке и нажав при этомShift
, открыв URL из командной оболочки, то у открытой в результате вкладки свойствоopener
установлено не будет. - А если вкладка была открыта с помощью команды
open()
или через гиперссылку с заданным атрибутомtarget
(не_blank
), тогда, по умолчанию, в свойствоopener
записывается некое значение. - У любой ссылки может быть атрибут
rel=opener
илиrel=noopener
, указывающий на то, будет ли у новой вкладки установлено свойствоopener
. - При выполнении JavaScript-вызова
open()
можно, в строкеwindowFeatures
, указатьnoopener
, что приведёт к установке свойстваopener
новой вкладки вnull
.
Вышеприведённый список позволяет сделать вывод о том, что и обычный щелчок по ссылке, и использование JavaScript-команды open()
может привести к созданию вкладки как с установленным, так и с неустановленным свойством opener
. Это может вылиться в серьёзную путаницу: открытие ссылки с зажатой клавишей Shift
может привести к открытию вкладки, которая не может сама себя закрыть. А обычный щелчок мыши по такой ссылке приводит к открытию вкладки, которая всегда может закрыть себя сама.
Во-вторых — обратите внимание на то, что в начале этого раздела я, говоря о стеке навигации, употребил слово «записи», а не «объекты Document». В большинстве случаев понятия «запись» и «объект Document» эквивалентны, но это — не одно и то же. Представьте себе ситуацию, когда в новой вкладке открывается HTML-документ, в верхней части которого содержится нечто вроде оглавления. Пользователь щёлкает по ToC-ссылке, ведущей к разделу страницы #Section3
, после чего браузер послушно прокручивает страницу к нужному разделу. Стек навигации теперь содержит две записи, каждая из которых указывает на один и тот же документ. В результате Chromium-браузер блокирует вызов window.close()
, а делать этого ему не следует. Этот давний недостаток с выходом Chromium 88 стал заметнее, чем раньше, так как после этого ссылкам с атрибутом target
, установленным в _blank
, по умолчанию назначается атрибут rel=noopener
.
В ветке трекера ошибок Chromium, посвящённой проблеме 1170131, можно видеть, как эту проблему пытаются решить путём подсчёта количества объектов Document в стеке навигации. Но сделать это непросто, так как в настоящее время у процесса, отвечающего за рендеринг страницы, в котором выполняется JavaScript-код, есть доступ только к количеству записей в стеке навигации, но не к их URL.
▍Chromium: пользовательский опыт
Когда браузер Chrome блокирует команду close()
, он выводит в консоль следующее сообщение, которое мы уже обсуждали:
Scripts may close only the windows that were opened by them.
А пользователю, который в консоль обычно не смотрит, об этом никак не сообщается. Это может показаться странным тому, кто щёлкнул по кнопке или по ссылке, предназначенной для закрытия страницы. В недавно появившемся сообщении об ошибке 1170034 предлагается показывать пользователю в такой ситуации диалоговое окно, вроде того, что показывается в Internet Explorer. (Между прочим, это сообщение об ошибке задаёт новый стандарт подготовки подобных сообщений. В нём, в виде, напоминающем комикс, показано, как несчастный пользователь превращается в счастливого в том случае, если в Chromium будет реализован предлагаемый функционал.)
▍Chromium: любопытные факты об очень редкой ошибке
То, о чём пойдёт речь, представляет собой весьма хитрый сбой, «пограничный случай», возникающий лишь в особых ситуациях. Но я, в течение пяти лет, встречался с сообщениями о подобном сбое, касающимися и Chrome, и Edge.
Речь идёт о том, что если установить свойство Chromium On Startup
(При запуске) в значение Continue where you left off
(Восстановить вкладки предыдущего сеанса), перейти на страницу, которая пытается сама себя закрыть, а после этого закрыть окно браузера, то браузер потом, при каждом запуске, будет сам себя закрывать.
Попасть в такую ситуацию довольно сложно, но в Chrome/Edge 90 это вполне возможно.
Вот как воспроизвести эту ошибку. Посетите страницу https://webdbg.com/test/opener/. Щёлкните по ссылке Page that tries to close itself
(Страница, которая пытается себя закрыть). Воспользуйтесь сочетанием клавиш Ctrl+Shift+Delete
для очистки истории просмотра (стека навигации). Закройте браузер с помощью кнопки X
. Теперь попробуйте запустить браузер. Он будет запускаться, а потом сам собой закрываться.
▍Safari/WebKit
Код WebKit похож на код Chromium (что неудивительно, учитывая их генеалогию). Исключением является лишь тот факт, что WebKit не уравнивает переходы по noopener-страницам с переходами, инициированными через интерфейс браузера. В результате пользователь, работая в Safari, может перемещаться по множеству страниц с одного сайта, а команда close()
при этом будет работоспособна.
Если же вызов close()
окажется заблокированным, то в JavaScript-консоль Safari (надёжно скрытую от посторонних глаз) будет выведено сообщение, указывающее на то, что окно закрыть нельзя из-за того, что оно создано не средствами JavaScript:
Can't close the window since it was not opened by JavaScript
▍Firefox
В браузере Firefox, в отличие от Chromium, та часть спецификации HTML, в которой говорится о «только одном Document», реализована корректно. Firefox вызывает функцию IsOnlyTopLevelDocumentInSHistory()
, а она вызывает функцию IsEmptyOrHasEntriesForSingleTopLevelPage()
, которая проверяет историю сессий. Если там больше одной записи, она уточняет, относятся ли они все к одному и тому же объекту Document. Если это так — вызов close()
выполняется.
Firefox даёт в наше распоряжение настройку about:config
, называемую dom.allow_scripts_to_close_windows
, позволяющую переопределить стандартное поведение системы.
Когда Firefox блокирует close()
— он выводит в консоль сообщение о том, что скрипты не могут закрывать окна, которые были открыты не скриптами:
Scripts may not close windows that were not opened by script.
В трекере ошибок Firefox уже 18 лет лежит просьба о том, чтобы браузер показывал бы в подобной ситуации соответствующее окно, а не ограничивался бы выводом сообщения в консоль.
Итоги
Что тут скажешь? Возможно, дело в том, что браузеры — это жутко сложные создания.
Приходилось ли вам сталкиваться с проблемами, вызванными отличиями реализаций чего-либо в разных браузерах?
Вопрос:
У меня проблема всегда, когда я пытаюсь закрыть окно с помощью метода window.close()
для Javascript, в то время как браузер отображает на консоли следующее сообщение:
"Scripts may close only the windows that were opened by it."
Это происходит в каждой части страницы. Я могу запустить это прямо из ссылки, кнопки или script, но это сообщение всегда отображается.
Я пытаюсь заменить метод window.close();
для функций (или их вариантов) ниже, но ничего не повторилось:
window.open('', '_self', '');
window.close();
Лучший ответ:
Я искал много страниц в Интернете через Google и здесь, в Stack Overflow, но ничто не предлагало решить мою проблему.
После многих попыток и “ударов” я изменил способ проверки этого контроллера. Затем я обнаружил, что проблема всегда возникает, когда я снова открывал страницу с помощью Ctrl + Shift + T
ярлыка в Chrome. Таким образом, страница запускалась, но без ссылки родительского окна и потому, что она не может быть закрыта.
Ответ №1
Сообщения об ошибках не становятся более ясными, чем это:
"Scripts may close only the windows that were opened by it."
Если ваш script не начал открывать окно (с чем-то вроде window.open), тогда script в этом окне не разрешается его закрывать. Его безопасность, чтобы веб-сайт не контролировал ваш браузер и закрывал окна.
Ответ №2
Вы не можете закрыть текущее окно или любое окно или страницу, открытую с помощью `_self ‘
Но вы можете это сделать
var customWindow = window.open('', '_blank', '');
customWindow.close();
Ответ №3
Следующий код работал у меня:)
window.open('your current page URL', '_self', '');
window.close();
Ответ №4
Это работает в Chrome и Safari:
window.open(location, '_self', '');
window.close();
Follow us on Social Media
Scripts May Close Only The Windows That Were Opened By Them With Code Examples
In this article, we will see how to solve Scripts May Close Only The Windows That Were Opened By Them with examples.
// You can only close a window that your script made, so this is possible: window.open("", "_blank", ""); window.close(); // But otherwise you can change the link, like that: location.href = "https://bruh.io"; // Make sure that you have https://
Below, you’ll find some examples of different ways to solve the Scripts May Close Only The Windows That Were Opened By Them problem.
open window with target="_blank" and the perform window.close();
By way of numerous illustrations, we have demonstrated how to use code written to solve the Scripts May Close Only The Windows That Were Opened By Them problem.
Scripts may close only the windows that were opened by it. A workaround now is redirect user to another page rather than close the window, you could redirect user to a notification page to show “The items has been closed successfully” using window.05-Mar-2019
How do I close a window in angular 8?
You can simply use the following code: window. top. close();18-Dec-2021
How do you close a page in JavaScript?
You will need Javascript to do this. Use window. close() : close();
How do you close a current window?
Press Alt + F4 to close a window.
How do I close the HTML window automatically?
open(“URL_HERE”, “my_window”, “height=100,width=100”); and we need to close the second page automatically after login success. Okay so in the popup use window. close() to close the window like I mentoined in my example.17-Jul-2017
How do I close a window using jquery?
click(function(){ window. close(); });17-Jan-2012
What close () does in JavaScript?
The close() method closes a window.
What is the key to close a window?
Alt + F4: The Windows keyboard shortcut for closing applications, explained
- Alt + F4 is a Windows keyboard shortcut that completely closes the application you’re using.
- It differs slightly from Ctrl + F4, which closes the current window of the application you’re viewing.
How do you close a window in Python?
Practical Data Science using Python Creating an application using tkinter is easy but sometimes, it becomes difficult to close the window or the frame without closing it through the button on the title bar. In such cases, we can use the . destroy() method to close the window.04-Mar-2021
Can JavaScript close a tab?
To close a window or tab that was opened using JavaScript, call window. close() .21-Apr-2021
Follow us on Social Media