- window.close и self.close не закрывают окно в Chrome
- Долгосрочное решение:
- Хакерские обходные пути:
- Chrome Исправлены проблемы безопасности в версии 36.0.1985.125
- Android Webview: Scripts may close only the windows that were opened by it
- 1 Answer 1
- window.close and self.close do not close the window in Chrome
- 16 Answers 16
- The long-term solution:
- The hacky workarounds:
- Ошибка Chrome “Scripts may close only the windows that were opened by it”
- 1 ответ
- Похожие вопросы:
window.close и self.close не закрывают окно в Chrome
Проблема в том, что когда я вызываю window.close() или self.close() он не закрывает окно. Теперь кажется, что в Chrome невозможно закрыть с помощью скрипта любое окно, которое не было создано скриптом. Это явно неверно, но независимо от того, что он все еще должен это делать, даже если для подтверждения требуется всплывающее предупреждение. Это не происходит.
Так есть ли у кого-нибудь реальный, функциональный и проверенный метод закрытия окна с использованием чего-то подобного javascript:window.close() или javascript:self.close() действительно выполняющий то, что ожидается, и то, что происходит просто отлично в каждом браузере, НЕ основанном на Chrome? Любые предложения будут с благодарностью, и я ищу Javascript для конкретного решения, ничего JQuery или сторонней реализации.
Обновление: хотя большая часть из того, что было предложено, имеет серьезные ограничения и проблемы с удобством использования, последнее предложение (специфичное для TamperMonkey), используемое // @grant window.close в заголовке скрипта, часто помогает, даже на тех вкладках, которые обычно не могут обработать метод close. Хотя это не совсем идеально и не обобщается на каждый случай, в моем случае это хорошее решение.
Обычный javascript не может закрывать окна волей-неволей. Это функция безопасности, представленная некоторое время назад, для предотвращения различных злонамеренных эксплойтов и неприятностей.
close() Метод на Window объекты должны, если все следующие условия, близко контекст просмотра :
- Соответствующий контекст просмотра A является закрываемым сценарием .
- Контекстное просмотр действующего сценария знаком с контекстным просмотра A .
- Просмотра контекста сценария действующего разрешено перемещаться контекстным просмотр A .
Контекст просмотра может быть закрыт сценарием, если он является вспомогательным контекстом просмотра, созданным сценарием (в отличие от действий пользователя), или если это контекст просмотра, история сеанса которого содержит только один Документ.
Это означает, что за одним небольшим исключением нельзя разрешать JavaScript закрывать окно, которое не было открыто этим же JavaScript.
Chrome допускает это исключение, которое не распространяется на пользовательские скрипты, а Firefox — нет. Реализация Firefox гласит :
Этот метод разрешается вызывать только для тех окон, которые были открыты скриптом с использованием window.open метода.
Если вы пытаетесь использовать window.close с Greasemonkey / Tampermonkey / userscript вы получите:
Firefox: Сообщение об ошибке « Scripts may not close windows that were not opened by script. »
Chrome: просто молча терпит неудачу.
Долгосрочное решение:
Лучший способ справиться с этим — создать вместо него расширение Chrome и / или дополнение для Firefox. Они могут надежно закрыть текущее окно.
Тем не менее, поскольку риски безопасности, связанные с этим window.close , намного меньше для сценария Greasemonkey / Tampermonkey; Greasemonkey и Tampermonkey могли бы разумно предоставить эту функциональность в их API (по сути, упаковывая работу расширения для вас).
Рассмотрите возможность запроса функции.
Хакерские обходные пути:
В настоящее время Chrome был уязвим для эксплойта «самостоятельного перенаправления». Так что код, подобный этому, работал в целом:
Это ошибочное поведение, IMO, и сейчас (по состоянию на апрель 2015 года) в основном заблокировано. Он все равно будет работать из введенного кода, только если вкладка была недавно открыта и не имеет страниц в истории просмотра. Так что это полезно только в очень небольших обстоятельствах.
Тем не менее, вариант все еще работает на Chrome (v43 и v44) плюс Tampermonkey (v3.11 или более поздняя версия) . Используйте явное @grant и простое window.close() . НАПРИМЕР:
Спасибо zanetu за обновление. Обратите внимание, что это не будет работать, если открыта только одна вкладка. Закрывает только дополнительные вкладки.
Fire Fox защищен от этой атаки. Таким образом, единственный способ javascript — нанести вред настройкам безопасности, по одному браузеру за раз.
Вы можете открыть about:config и установить
allow_scripts_to_close_windows на true .
Если ваш сценарий предназначен для личного использования, сделайте это. Если вы попросите кого-нибудь еще включить эту настройку, он будет разумным и оправданным отказаться с предубеждением.
Там в настоящее время нет эквивалентной настройки для Chrome.
Chrome Исправлены проблемы безопасности в версии 36.0.1985.125
Chrome 36.0.1985.125 СРЕДА, 16 ИЮЛЯ 2014 выпуске
По моим наблюдениям, это обновление исправило проблему с использованием window.close() для закрытия всплывающего окна. Вы увидите это в консоли, когда произойдет сбой: «Сценарии могут закрывать только те окна, которые были открыты им». Это означает, что хакерские обходные пути (ответ Брока Адамса) могут не работать в последней версии.
Таким образом, в предыдущих выпущенных сборках Chrome приведенный ниже блок кода мог работать, но не с этим обновлением.
Для этого обновления вы должны соответствующим образом обновить свой код, чтобы закрыть всплывающее окно. Одним из решений является захват идентификатора всплывающего окна и использование
способ удалить это. API-интерфейс расширений Chrome можно найти по адресу chrome.windows .
Собственно мое хромовое расширение MarkView столкнулось с этой проблемой, и мне пришлось обновить свой код, чтобы он работал для этого обновления Chrome. Кстати, MarkView — это инструмент для чтения и записи Awesome Markdown Files, он предоставляет такие функции, как структура содержимого, сортируемые таблицы и подсветка синтаксиса блока кода с номером строки.
Я также создал этот пост , любые комментарии приветствуются.
Android Webview: Scripts may close only the windows that were opened by it
I am loading a particular url
Afterwords I am redirecting it to some other domain and then coming back to my domain. Then I try to close the window in my javascript (window.close()). I get the below error while debugging remotely on chrome developer tools
Scripts may close only the windows that were opened by it.
I am getting the above error even though I am on the same domain with which I opened it.
Any help would be very much appreciated. Thank you.
1 Answer 1
This answer will be from Android App Developer perspective. I hope it will help someone.
The problem was very similar for me: I was opening a web site via webview, and some of the links were opening in a new window. The thing is that webview cannot work with web windows out of the box. I mean, it can be possible, but not as expected (in my case, when a link was opened in a separate window from javascript perspective, it were overriding previously opened page, and cannot be closed with a window.close() from javascript, which eventually were causing a state loss on a previous page).
So the task in my case was to open a single link in a window and go back to previous page without any state loss. That was my solution. I had two separate WebView s — one as a main one, and one for links in window. To be able to react on a «link in new window» event, I’ll configured main webView with this code:
We need only onCreateWindow callback to override in main webView chrome client, since it will only open new windows. And also allow a multiwindow support in webView.settings . When an onCreateWindow callback triggers, do the following:
Basically we’re sending this (create window) request to a separate webView . In it we should also allow a multiwindow support and attach a chrome client, in wich we should listen only onCloseWindow event, since this webView should behave as a window. When onCloseWindow triggers, we’re just closing (hiding/removing) webView that should act as a window, and returning to the main one. Here isWebWindowOpened method call just checks if the windowWebView is not null and visible.
The only thing I can mention, is that when a windowWebView is opened, onBackPressed action should close it calling handleCloseWebWindowRequest .
window.close and self.close do not close the window in Chrome
The issue is that when I invoke window.close() or self.close() it doesn’t close the window. Now there seems to be a belief that in Chrome you can’t close by script any window that is not script created. That is patently false but regardless it is supposed to still do it, even if it requires to pop up an alert to confirm. These are not happening.
So does anyone have real, functional and proven method of closing a window using something like javascript:window.close() or javascript:self.close() that actually does what is expected and something that happens just fine in every browser that is NOT Chrome based? Any suggestions would be greatly appreciated and I am looking for Javascript specific solution, nothing JQuery or third party implementation.
Update: While much of what has been suggested has serious limitations and usability issues, the latest suggestion (specific to TamperMonkey) using // @grant window.close in the script header will often do the trick even on those tabs that normally can’t handle the close method. While not entirely ideal and doesn’t generalized to every case, it is a good solution in my case.
16 Answers 16
Ordinary javascript cannot close windows willy-nilly. This is a security feature, introduced a while ago, to stop various malicious exploits and annoyances.
The close() method on Window objects should, if all the following conditions are met, close the browsing context A:
- The corresponding browsing context A is script-closable.
- The browsing context of the incumbent script is familiar with the browsing context A.
- The browsing context of the incumbent script is allowed to navigate the browsing context A.
A browsing context is script-closable if it is an auxiliary browsing context that was created by a script (as opposed to by an action of the user), or if it is a browsing context whose session history contains only one Document.
This means, with one small exception, javascript must not be allowed to close a window that was not opened by that same javascript.
Chrome allows that exception — which it doesn’t apply to userscripts — however Firefox does not. The Firefox implementation flat out states:
This method is only allowed to be called for windows that were opened by a script using the window.open method.
If you try to use window.close from a Greasemonkey / Tampermonkey / userscript you will get:
Firefox: The error message, » Scripts may not close windows that were not opened by script. »
Chrome: just silently fails.
The long-term solution:
The best way to deal with this is to make a Chrome extension and/or Firefox add-on instead. These can reliably close the current window.
However, since the security risks, posed by window.close , are much less for a Greasemonkey/Tampermonkey script; Greasemonkey and Tampermonkey could reasonably provide this functionality in their API (essentially packaging the extension work for you).
Consider making a feature request.
The hacky workarounds:
Chrome is currently was vulnerable to the «self redirection» exploit. So code like this used to work in general:
This is buggy behavior, IMO, and is now (as of roughly April 2015) mostly blocked. It will still work from injected code only if the tab is freshly opened and has no pages in the browsing history. So it’s only useful in a very small set of circumstances.
However, a variation still works on Chrome (v43 & v44) plus Tampermonkey (v3.11 or later). Use an explicit @grant and plain window.close() . EG:
Thanks to zanetu for the update. Note that this will not work if there is only one tab open. It only closes additional tabs.
Firefox is secure against that exploit. So, the only javascript way is to cripple the security settings, one browser at a time.
You can open up about:config and set
allow_scripts_to_close_windows to true .
If your script is for personal use, go ahead and do that. If you ask anyone else to turn that setting on, they would be smart, and justified, to decline with prejudice.
There currently is no equivalent setting for Chrome.
Ошибка Chrome “Scripts may close only the windows that were opened by it”
Chrome 45.0.2454.85 m, Firefox также имеет эту проблему.
1 ответ
У меня есть две страницы(index.html и main.html). это index.html метки тела: main page а на главной странице у меня есть кнопка, которая при нажатии на эту кнопку Я хочу закрыть это окно, но эта функция не работает! Как я могу это сделать? и в консоли дайте это.
Мы пытаемся заставить наше веб-приложение работать как полноэкранное веб-приложение. Я получил это для работы с помощью этих метатегов:
Вы должны хранить свое открытое окно в переменной.
EDIT: Открытие в _self не работает, так как вы открываете новую страницу на том же экране, вы можете сделать _blank, как я редактировал.
Похожие вопросы:
Я хочу, чтобы мое веб-приложение работало в окне, в котором нет строки меню, адресной строки и т. д. У меня есть страница Default.html, и на этой странице Я нажимаю кнопку Run Application, которая.
Я использую angularjs.I have link предположим, open tab теперь пользователь щелкает правой кнопкой мыши по ссылке и выбирает open link в новой вкладке , теперь у меня есть код на странице abc.html .
У меня всегда возникает проблема, когда я пытаюсь закрыть окно с помощью метода window.close() Javascript, в то время как браузер отображает приведенное ниже сообщение на консоли: Scripts may close.
У меня есть две страницы(index.html и main.html). это index.html метки тела: main page а на главной странице у меня есть кнопка, которая при нажатии на эту кнопку Я.
Мы пытаемся заставить наше веб-приложение работать как полноэкранное веб-приложение. Я получил это для работы с помощью этих метатегов: .
Ниже приведен мой код для вызова сервлета, который делает недействительным сеанс пользователя и закрывает вкладку браузера . В IE браузер запрашивает у пользователя подтверждение закрытия вкладки .
Я хочу закрыть текущую вкладку с помощью javascript. Но я не получил никаких решений. Я искал это по всему интернету, и некоторые из сообщений предлагают приведенное ниже решение.
У меня есть метод onExit() и попытка закрыть текущую вкладку браузера/выйти из приложения. Я уже пробовал с этим кодом component.ts onExit() < console.log(closing the web!); window.close(); >и.
У меня есть ссылка в page_a.php , которая открывается в новой вкладке с помощью target=_blank . Open Page B На странице B у меня есть скрипт, который.
Я нашел много вопросов, связанных с этим, но большинство из них относятся к 2012 году или раньше, и, похоже, в Google появились новые политики безопасности, поэтому вопрос здесь в 2019 году. Мое.