Сценарии не могут закрывать окна открытые другими сценариями

Вопрос:У меня проблема всегда, когда я пытаюсь закрыть окно с помощью метода window.close() для Javascript, в то время как браузер отображает на консоли следующее сообщение: "Scripts may close only the windows that were opened by it." Это происходит в каждой части страницы. Я могу запустить это прямо из ссылки, кнопки или script, но это сообщение

Вопрос:

У меня проблема всегда, когда я пытаюсь закрыть окно с помощью метода 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();

My application sends an e-mail to the manager with an approve and a reject button

  • When the manager clicks the button, the web page will open.
  • In that page is a close button. On click of close button it should close the browser window. But it is not closing and it throws an error message on console «Scripts may not close windows that were not opened by script.»

I tried to close the window, i.e, already open. The fallowing ways

var win = window.open('','_self');
win.close();

window.top.opener=null;
window.close();

var win=window.open("","_self");
win.close(); 

window.open('','_parent',''); 
window.close();

The above did not work. Can someone provide a solution for this.

Thank you in advance. Please don’t close this. Because i googled lot, I did not find solution.

surfmuggle's user avatar

surfmuggle

5,0636 gold badges44 silver badges74 bronze badges

asked Jun 9, 2015 at 6:26

user3747449_Santhosh's user avatar

6

See MDN on window.close():

This method is only allowed to be called for windows that were opened
by a script using the window.open() method. If the window was not
opened by a script, the following error appears in the JavaScript
Console: Scripts may not close windows that were not opened by script.

answered Jun 9, 2015 at 6:43

JNF's user avatar

I would use jQuery UI component Dialog.

 $(function() {
    $( "#dialog" ).dialog();
  });
<link href="//code.jquery.com/ui/1.11.4/themes/smoothness/jquery-ui.css" rel="stylesheet"/>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<script src="//code.jquery.com/ui/1.11.4/jquery-ui.js"></script>
<div id="dialog" title="Basic dialog">
  <p>This is the default dialog which is useful for displaying information. The dialog window can be moved, resized and closed with the 'x' icon.</p>
</div>

You get that error message because outlook redirects link clicks to a new browser instance. After it is opened he has no control over it.

You can close pages that it opens, but you definitely can not close browser instance itself.


If you send it via email then depending of mail viewer you have limited support. Ex: gmail strips away html head, body, all non inline css and javascript. In short : jQuery UI Dialog would not work.

Instead use a link with get parameters (ex: unique user id) and read it when page is opened.

answered Jun 9, 2015 at 6:43

Margus's user avatar

MargusMargus

19.5k14 gold badges54 silver badges102 bronze badges

3

My application sends an e-mail to the manager with an approve and a reject button

  • When the manager clicks the button, the web page will open.
  • In that page is a close button. On click of close button it should close the browser window. But it is not closing and it throws an error message on console «Scripts may not close windows that were not opened by script.»

I tried to close the window, i.e, already open. The fallowing ways

var win = window.open('','_self');
win.close();

window.top.opener=null;
window.close();

var win=window.open("","_self");
win.close(); 

window.open('','_parent',''); 
window.close();

The above did not work. Can someone provide a solution for this.

Thank you in advance. Please don’t close this. Because i googled lot, I did not find solution.

surfmuggle's user avatar

surfmuggle

5,0636 gold badges44 silver badges74 bronze badges

asked Jun 9, 2015 at 6:26

user3747449_Santhosh's user avatar

6

See MDN on window.close():

This method is only allowed to be called for windows that were opened
by a script using the window.open() method. If the window was not
opened by a script, the following error appears in the JavaScript
Console: Scripts may not close windows that were not opened by script.

answered Jun 9, 2015 at 6:43

JNF's user avatar

I would use jQuery UI component Dialog.

 $(function() {
    $( "#dialog" ).dialog();
  });
<link href="//code.jquery.com/ui/1.11.4/themes/smoothness/jquery-ui.css" rel="stylesheet"/>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<script src="//code.jquery.com/ui/1.11.4/jquery-ui.js"></script>
<div id="dialog" title="Basic dialog">
  <p>This is the default dialog which is useful for displaying information. The dialog window can be moved, resized and closed with the 'x' icon.</p>
</div>

You get that error message because outlook redirects link clicks to a new browser instance. After it is opened he has no control over it.

You can close pages that it opens, but you definitely can not close browser instance itself.


If you send it via email then depending of mail viewer you have limited support. Ex: gmail strips away html head, body, all non inline css and javascript. In short : jQuery UI Dialog would not work.

Instead use a link with get parameters (ex: unique user id) and read it when page is opened.

answered Jun 9, 2015 at 6:43

Margus's user avatar

MargusMargus

19.5k14 gold badges54 silver badges102 bronze badges

3

Проблема в том, что когда я вызываю window.close() или self.close(), окно не закрывается. Теперь, кажется, существует убеждение, что в Chrome вы не можете закрыть скриптом любое окно, которое не было создано скриптом. Это заведомо ложно, но, тем не менее, предполагается, что он все равно будет это делать, даже если для подтверждения требуется всплывающее предупреждение. Этого не происходит.

Итак, есть ли у кого-нибудь реальный, функциональный и проверенный метод закрытия окна с помощью чего-то вроде javascript:window.close() или javascript:self.close(), который действительно делает то, что ожидается, и что-то, что отлично работает в каждом браузере, который НЕ основан на Chrome? Буду очень признателен за любые предложения, и я ищу конкретное решение для Javascript, а не JQuery или стороннюю реализацию.

Обновление: хотя многое из того, что было предложено, имеет серьезные ограничения и проблемы с удобством использования, последнее предложение (конкретно для TamperMonkey) с использованием // @grant window.close в заголовке скрипта часто делайте трюк даже на тех вкладках, которые обычно не могут обрабатывать метод закрытия. Хотя это не совсем идеально и не обобщается на все случаи, в моем случае это хорошее решение.

17 ответов

В tampermonkey теперь можно использовать

// @grant        window.close

А потом просто позвони

window.close();


24

balping
19 Янв 2016 в 14:30

Многие люди до сих пор пытаются найти способ закрыть браузер Chrome с помощью javascript. Следующий метод работает только в том случае, если вы используете Chrome в качестве средства запуска приложений, например киоск!

Я проверил следующее:

Я использую следующее расширение: Close Kiosk.

Я следую инструкциям по использованию, и, похоже, все работает нормально (убедитесь, что вы очищаете кеш при выполнении тестов). Я использую javascript (прикрепленный к событию щелчка):

window.location.href = '/closekiosk';

Я надеюсь, что это поможет кому-то, так как это единственное рабочее решение, которое я нашел.

Примечание. Похоже, что расширение работает в фоновом режиме и добавляет значок на панели задач Chrome. У него отмечена следующая опция: «Разрешить Chrome работать в фоновом режиме» (или аналогичный текст). Возможно, вам придется поиграть с ним, пока он не сработает для вас. Я отключил его, и теперь он работает просто отлично!


13

Minister
5 Авг 2014 в 22:30

Я нашел новый способ, который отлично работает для меня

var win = window.open("about:blank", "_self");
win.close();


12

शेखर
27 Янв 2015 в 12:59

Несмотря на то, что вы думаете, что это «заведомо ложно», то, что вы говорите «кажется верой», на самом деле верно. В документации Mozilla для window.close говорится

Этот метод разрешено вызывать только для окон, которые были открыты сценарием с использованием метода window.open. Если окно не было открыто скриптом, в консоли JavaScript появляется следующая ошибка: Скрипты не могут закрывать окна, которые не открывались скриптом

Вы говорите, что это «должно быть по-прежнему», но я не думаю, что вы найдете какие-либо ссылки, подтверждающие это, может быть, вы что-то забыли?


13

Gareth
4 Ноя 2013 в 11:19

Код ниже работал для меня —

window.open('location', '_self', '');
window.close();

Протестировано на Chrome 43.0.2357.81


7

Stephan
29 Май 2015 в 10:49

Это может быть старым, но давайте ответим.

Я использую top.close(), чтобы закрыть вкладку. window.close() или другой метод open…close у меня не работал.


1

Soley
10 Авг 2014 в 17:32

Вы также можете попробовать использовать мой код ниже. Это также поможет вам перенаправить родительское окно:

Родитель:

<script language="javascript">

function open_a_window() 
{
    var w = 200;
        var h = 200;
        var left = Number((screen.width/2)-(w/2));
        var tops = Number((screen.height/2)-(h/2));

        window.open("window_to_close.html", '', 'toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=no, resizable=no, copyhistory=no, width='+w+', height='+h+', top='+tops+', left='+left);

   return false;
}

// opener:
window.onmessage = function (e) {
  if (e.data === 'location') {
    window.location.replace('https://www.google.com');
  }
};

</script>

<input type="button" onclick="return open_a_window();" value="Open New Window/Tab" />

Выскакивать:

<!DOCTYPE html>
<html>
<body onload="quitBox('quit');">

<h1>The window closer:</h1>

<input type="button" onclick="return quitBox('quit');" value="Close This Window/Tab" /> 


<script language="javascript">

function quitBox(cmd) 
{      
    if (cmd=='quit')    
    {   
       window.opener.postMessage('location', '*');
       window.open(location, '_self').close();    
    }     
    return false;   
}

</script>

</body>
</html>


-1

Harshal Lonare
5 Дек 2019 в 13:48

Попробуйте что-то вроде этого onclick=»return self.close()»


-7

Ragven
27 Авг 2015 в 12:11

В моем случае страницу нужно было закрыть, но она могла быть открыта по ссылке, и поэтому window.close завершилась ошибкой.

Решение, которое я выбрал, состоит в том, чтобы выдать window.close, а затем window.setTimeout, который перенаправляет на другую страницу.

Таким образом, если window.close завершается успешно, выполнение на этой странице останавливается, но в случае сбоя через секунду выполняется перенаправление на другую страницу.

window.close();
window.setTimeout(function(){location.href = '/some-page.php';},1000);


2

user2182349
8 Окт 2018 в 17:22

Я хотел поделиться своим «решением» этой проблемы. Похоже, что большинство из нас пытаются закрыть окно браузера в стандартной сессии браузера, когда пользователь посещает тот или иной веб-сайт после того, как он посетил другие веб-сайты, и до того, как они посетят еще несколько.

Однако моя ситуация такова, что я создаю веб-приложение для устройства, которое, по сути, будет единственным, что делает устройство. Вы загружаете его, он запускает Chrome и переходит к нашему приложению. Он даже не подключен к Интернету, любые серверы, с которыми он взаимодействует, находятся в наших локальных контейнерах Docker. Пользователю нужен способ закрыть приложение (также известный как закрыть Chrome), чтобы он мог получить доступ к терминалу для выполнения обновлений системы.

Итак, он загружается, запускает Chrome в режиме киоска уже по правильному адресу. Это происходит, чтобы легко удовлетворить второй вариант в спецификации:

Контекст просмотра закрывается сценарием, если это вспомогательный контекст просмотра, созданный сценарием (а не действием пользователя), или если это контекст просмотра верхнего уровня, история сеансов которого содержит только один документ.

Поэтому простой вызов window.close() из моего киоск-приложения просто работает!


2

Jonathan Tuzman
13 Фев 2020 в 20:57

Только если вы откроете новое окно с помощью window.open(), новое окно сможет закрыться с помощью кода, как я упоминал выше. Это отлично работает для меня :) Примечание: никогда не используйте href, чтобы открыть страницу в новой вкладке. Window.close() не работает с «href» . Вместо этого используйте window.open().


-2

DfrDkn
28 Май 2015 в 18:56

Chrome Исправлены проблемы безопасности в версии 36.0.1985.125.

Хром 36.0.1985.125 СРЕДА, 16 ИЮЛЯ 2014 ГОДА Примечание к выпуску

По моим наблюдениям, это обновление устранило проблему с использованием window.close() для закрытия всплывающего окна. Вы увидите это в консоли, когда произойдет сбой: «Сценарии могут закрывать только те окна, которые были открыты им». Это означает, что хакерские обходные пути (ответ Брока Адамса) могут не работать в последней версии.

Таким образом, в предыдущих выпущенных сборках Chrome приведенный ниже блок кода мог работать, но не с этим обновлением.

window.open('', '_self', '');
window.close();

Для этого обновления вам необходимо соответствующим образом обновить свой код, чтобы закрыть всплывающее окно. Одним из решений является захват идентификатора всплывающего окна и использование

chrome.windows.remove(integer windowId, function callback)

Метод его удаления. API расширений Chrome для Windows можно найти по адресу chrome.windows.

На самом деле мое расширение Chrome MarkView столкнулось с этой проблемой, и мне пришлось обновить свой код, чтобы он работал для этого. Обновление Хрома. Кстати, MarkView — это инструмент для чтения и записи файлов Awesome Markdown, он предоставляет такие функции, как Content Outline, Sortable Tables и выделение синтаксиса блока кода с номером строки.

Я также создал эту запись, любые комментарии приветствуются.


34

swcool
29 Июл 2014 в 08:33

Требования для этого:

Вы должны открыть окно/вкладку из средства запуска окон, чтобы получить дескриптор javascript, чтобы он работал, поскольку он не всегда работает на вкладке, которая не была открыта с помощью сценария средства запуска окон. На этой тестовой странице показано, как:

http://browserstrangeness.bitbucket.io/window_close_tester.htm

Если вы не видите, что он работает из моего лаунчера, необходимо опубликовать свой браузер, ваше устройство и версии. Браузеры разных версий ведут себя по-разному на разных устройствах. (Например, Firefox и Chrome на iPad, которые НЕ являются тем, за что себя выдают. Это Safari с другой оболочкой!)

Поэтому важно сказать, например, «Я использую Safari 10.14 на iPad с iOs 14.5«, чтобы я (или другой полезный человек здесь, в stackoverflow) мог исследовать его. для вас и публикации результатов, чтобы помочь другим пользователям. Заранее спасибо за это. Если вы пользуетесь лаунчером и он у вас работает на моем примере, то он работает.

Я использую метод, опубликованный Броком Адамсом, и он работает даже в Firefox, если пользователь инициирует его запуском с помощью кнопки или ссылки из другого окна.

open(location, '_self').close();

Я вызываю его нажатием кнопки, поэтому он инициируется пользователем, и он по-прежнему работает нормально с использованием Chrome 90, Internet Explorer 11, Edge, Safari 7–10, а также Firefox 35 и 88. Я протестировал используя версии 8.1 и 10 Windows и Mac OS X 10.6, 10.9, 10.10 и 10.14, если они отличаются.


Код самозакрывающегося окна (на странице, которая закрывается сама)

Полный код, который будет использоваться в открытом пользователем окне, которое может само закрыться:

window_to_close.htm

JavaScript:

function quitBox(cmd)
{   
    if (cmd=='quit')
    {
        open(location, '_self').close();
    }   
    return false;   
}

HTML:

<input type="button" name="Quit" id="Quit" value="Quit" onclick="return quitBox('quit');" />

Вот эта тестовая страница снова с рабочим примером: (Теперь тестируется в Chrome 90.0 и Firefox 88.0 — как в Windows 10, так и в Mac 10.14 Mojave)

http://browserstrangeness.bitbucket.io/window_close_tester.htm


Код открывателя окна (на странице, открывающей указанную выше страницу)

Чтобы это работало, кросс-браузерная совместимость в целях безопасности требует, чтобы окно, которое должно быть закрыто, уже было открыто пользователем, нажимающим кнопку в том же домене сайта.

Например, окно, которое использует описанный выше метод для самозакрытия, может быть открыто со страницы с помощью этого кода (код приведен на моей примерной странице, ссылка на которую приведена выше):

window_close_tester.htm

JavaScript:

function open_a_window() 
{
    window.open("window_to_close.htm"); 

    return false;
}

HTML:

<input type="button" onclick="return open_a_window();" value="Open New Window/Tab" />


21

Jeff Clayton
13 Авг 2021 в 15:27

Если вы не можете закрыть окна, которые не открываются скриптом, вы можете уничтожить свою страницу, используя этот код:

 document.getElementsByTagName ('html') [0] .remove ();


2

Ibnul Husainan
5 Сен 2020 в 03:51

Для тех, кто использует тег привязки для открытия дочернего окна, эта статья описывает решение этой проблемы.

Насколько я понимаю, в новых версиях Chrome для атрибута rel по умолчанию установлено значение noopener для тегов привязки с целью _blank. Таким образом, установив его на opener, вы вернете старое поведение.

Имейте в виду, что это было введено, чтобы избежать атак tab-napping.


1

Jacqueline Rodriguez
24 Июн 2021 в 19:53

Этот ответ от Брока заставил меня работать. Javascript нельзя разрешить закрывать окно, которое не было открыто этим же javascript.

Я могу закрыть дочернее окно только в том случае, если я буду закрывать его из родительского javascript. поэтому в моем родителе я могу сделать что-то подобное.

var myChildWindow;

function openWindow(){
myChildWindow = window.open("","myChildWindow","width=400,height=400");
}

function closeWindow() {
myChildWindow.close();
}


0

Crismogram
15 Апр 2020 в 18:26

Содержание

  1. Ограничения window.close()
  2. Почему браузеры ограничивают команду close()?
  3. Что написано в стандартах?
  4. Как поступают браузеры?
  5. ▍Internet Explorer
  6. ▍Chromium (Microsoft Edge, Google Chrome и другие браузеры)
  7. ▍Chromium: пользовательский опыт
  8. ▍Chromium: любопытные факты об очень редкой ошибке
  9. ▍Safari/WebKit
  10. ▍Firefox
  11. Итоги
  12. Error: Scripts may close only the windows that were opened by them. #130
  13. Comments
  14. camilobenito commented Nov 15, 2020
  15. camilobenito commented Nov 15, 2020
  16. baumblatt commented Nov 16, 2020
  17. cecilkootz commented Dec 25, 2020 •
  18. cecilkootz commented Dec 28, 2020
  19. window.close и self.close не закрывают окно в Chrome
  20. Долгосрочное решение:
  21. Хакерские обходные пути:
  22. Chrome Исправлены проблемы безопасности в версии 36.0.1985.125
  23. How to close current tab in a browser window?
  24. 19 Answers 19
  25. Context:
  26. Current Functionality:
  27. Browser Specific work-arounds:
  28. Google Chrome:
  29. Firefox:
  30. Форум
  31. Справочник
  32. window.close
  33. Синтаксис
  34. Описание, примеры

Ограничения window.close()

aujfoxg

Порой веб-разработчики с удивлением обнаруживают, что команда windows.close() не всегда закрывает окно браузера. А в консоли инструментов разработчика браузера при этом выводится сообщение, указывающее на то, что скрипты могут закрывать только окна, которые ими же и открыты:

Почему браузеры ограничивают команду close()?

Кое-что тут, конечно, имеет отношение и к безопасности, и к защите пользователей браузеров от мошенников. Например, если браузерные вкладки могли бы свободно сами себя закрывать — это могло бы найти применение на вредоносных страницах, пугающих пользователей, или в каких-нибудь мошеннических схемах.

Что написано в стандартах?

Вот что об этом всём говорится в разделе dom-window-close стандарта HTML:

Контекст просмотра может закрываться скриптами в том случае, если это вспомогательный контекст, созданный скриптом (в отличие от контекста, созданного в результате действий пользователя ), или если это контекст верхнего уровня, история сессий которого содержит только один Document.

Тут, вроде бы, всё достаточно просто и понятно, хотя те части текста, которые я выделил, скрывают в себе много сложностей и тонкостей. (Совершенно закономерным можно счесть такой вопрос: «Что делать, если скрипт был запущен в ответ на действия пользователя?».)

Как поступают браузеры?

К нашему сожалению, у каждого браузера имеется собственный набор моделей поведения, связанный с window.close() (можете поэкспериментировать с этой тестовой страницей). Отчасти это так из-за того, что большинство этих моделей поведения было реализовано до появления соответствующего стандарта.

▍Internet Explorer

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

image loader

Окна для подтверждения закрытия вкладки или окна

▍Chromium (Microsoft Edge, Google Chrome и другие браузеры)

Как видите, тут наблюдается небольшое отличие того, что требует спецификация, от того, что реализовано в браузере.

В ветке трекера ошибок Chromium, посвящённой проблеме 1170131, можно видеть, как эту проблему пытаются решить путём подсчёта количества объектов Document в стеке навигации. Но сделать это непросто, так как в настоящее время у процесса, отвечающего за рендеринг страницы, в котором выполняется JavaScript-код, есть доступ только к количеству записей в стеке навигации, но не к их URL.

▍Chromium: пользовательский опыт

А пользователю, который в консоль обычно не смотрит, об этом никак не сообщается. Это может показаться странным тому, кто щёлкнул по кнопке или по ссылке, предназначенной для закрытия страницы. В недавно появившемся сообщении об ошибке 1170034 предлагается показывать пользователю в такой ситуации диалоговое окно, вроде того, что показывается в Internet Explorer. (Между прочим, это сообщение об ошибке задаёт новый стандарт подготовки подобных сообщений. В нём, в виде, напоминающем комикс, показано, как несчастный пользователь превращается в счастливого в том случае, если в Chromium будет реализован предлагаемый функционал.)

▍Chromium: любопытные факты об очень редкой ошибке

То, о чём пойдёт речь, представляет собой весьма хитрый сбой, «пограничный случай», возникающий лишь в особых ситуациях. Но я, в течение пяти лет, встречался с сообщениями о подобном сбое, касающимися и Chrome, и Edge.

Речь идёт о том, что если установить свойство Chromium On Startup (При запуске) в значение Continue where you left off (Восстановить вкладки предыдущего сеанса), перейти на страницу, которая пытается сама себя закрыть, а после этого закрыть окно браузера, то браузер потом, при каждом запуске, будет сам себя закрывать.

Попасть в такую ситуацию довольно сложно, но в Chrome/Edge 90 это вполне возможно.

▍Safari/WebKit

Код WebKit похож на код Chromium (что неудивительно, учитывая их генеалогию). Исключением является лишь тот факт, что WebKit не уравнивает переходы по noopener-страницам с переходами, инициированными через интерфейс браузера. В результате пользователь, работая в Safari, может перемещаться по множеству страниц с одного сайта, а команда close() при этом будет работоспособна.

Если же вызов close() окажется заблокированным, то в JavaScript-консоль Safari (надёжно скрытую от посторонних глаз) будет выведено сообщение, указывающее на то, что окно закрыть нельзя из-за того, что оно создано не средствами JavaScript:

▍Firefox

Когда Firefox блокирует close() — он выводит в консоль сообщение о том, что скрипты не могут закрывать окна, которые были открыты не скриптами:

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

Итоги

Что тут скажешь? Возможно, дело в том, что браузеры — это жутко сложные создания.

Приходилось ли вам сталкиваться с проблемами, вызванными отличиями реализаций чего-либо в разных браузерах?

Источник

Error: Scripts may close only the windows that were opened by them. #130

When trying the latest version on android, the cfaSignIn function opens a new Chrome window (external to the app) and shows the Google screen to select an account. After selecting an account it redirects to a blank screen and nothing happens after that.

After debugging I have found out the this new Chrome window generates the following alert:
handler.js:172 Scripts may close only the windows that were opened by them.

I’m guessing that this stops the window from closing and therefore the signin process doesn’t complete by sending the result back to the App.

Do you have any recommendations on how to solve this?

The text was updated successfully, but these errors were encountered:

I tried this on another android device with a previous android version and this time the Chrome tab closes but then Android stays on the chrome window. It does not switch back to the App. If I manually switch back to the app it is still waiting for the callback.

This sounds a little strange, on Google Sign-In the plugin call the Firebase SDK, and in this case, there is a native interface and not a browser window, can you please share more detail of your project?

I am experiencing the same issue. To debug a bit I setup a fresh project only configured for Capacitor using Quasar and login works as expected. However when I have firebase initialized for cross-device support I get the same behavior described above where calling cfaSignIn opens a browser page.

I am continuing to test different options. is there any areas best to look for debug/troubleshooting?

You can’t perform that action at this time.

You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.

Источник

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 объекты должны, если все следующие условия, близко контекст просмотра :

Контекст просмотра может быть закрыт сценарием, если он является вспомогательным контекстом просмотра, созданным сценарием (в отличие от действий пользователя), или если это контекст просмотра, история сеанса которого содержит только один Документ.

Это означает, что за одним небольшим исключением нельзя разрешать JavaScript закрывать окно, которое не было открыто этим же JavaScript.

Этот метод разрешается вызывать только для тех окон, которые были открыты скриптом с использованием window.open метода.

Если вы пытаетесь использовать window.close с Greasemonkey / Tampermonkey / userscript вы получите:
Firefox: Сообщение об ошибке « Scripts may not close windows that were not opened by script. »
Chrome: просто молча терпит неудачу.

Долгосрочное решение:

Хакерские обходные пути:

В настоящее время Chrome был уязвим для эксплойта «самостоятельного перенаправления». Так что код, подобный этому, работал в целом:

Это ошибочное поведение, IMO, и сейчас (по состоянию на апрель 2015 года) в основном заблокировано. Он все равно будет работать из введенного кода, только если вкладка была недавно открыта и не имеет страниц в истории просмотра. Так что это полезно только в очень небольших обстоятельствах.

Спасибо zanetu за обновление. Обратите внимание, что это не будет работать, если открыта только одна вкладка. Закрывает только дополнительные вкладки.

Если ваш сценарий предназначен для личного использования, сделайте это. Если вы попросите кого-нибудь еще включить эту настройку, он будет разумным и оправданным отказаться с предубеждением.

Там в настоящее время нет эквивалентной настройки для Chrome.

Chrome Исправлены проблемы безопасности в версии 36.0.1985.125

Chrome 36.0.1985.125 СРЕДА, 16 ИЮЛЯ 2014 выпуске

По моим наблюдениям, это обновление исправило проблему с использованием window.close() для закрытия всплывающего окна. Вы увидите это в консоли, когда произойдет сбой: «Сценарии могут закрывать только те окна, которые были открыты им». Это означает, что хакерские обходные пути (ответ Брока Адамса) могут не работать в последней версии.

Таким образом, в предыдущих выпущенных сборках Chrome приведенный ниже блок кода мог работать, но не с этим обновлением.

Для этого обновления вы должны соответствующим образом обновить свой код, чтобы закрыть всплывающее окно. Одним из решений является захват идентификатора всплывающего окна и использование

Источник

How to close current tab in a browser window?

I want to create a link on a webpage that would close the currently active tab in a browser without closing other tabs in the browser.
When the user clicks the close link, an alert message should appear asking the user to confirm with two buttons, «YES» and «NO». If the user clicks «YES», close that page and If «NO», do nothing.

How can it be done? Any suggestions?

iA04d

I might be late here but this is prevented by the browsers for a reason.

Think of yourself trying to close a window again and again and it’s not closing as its doing the «if no» part from your question which is ‘do nothing’.

19 Answers 19

You will need Javascript to do this. Use window.close() :

Note: the current tab is implied. This is equivalent:

or you can specify a different window.

You return false here to prevent the default behavior for the event. Otherwise the browser will attempt to go to that URL (which it obviously isn’t).

Now the options on the window.confirm() dialog box will be OK and Cancel (not Yes and No). If you really want Yes and No you’ll need to create some kind of modal Javascript dialog box.

Note: there is browser-specific differences with the above. If you opened the window with Javascript (via window.open() ) then you are allowed to close the window with javascript. Firefox disallows you from closing other windows. I believe IE will ask the user for confirmation. Other browsers may vary.

zGPGJ

This method works in Chrome and IE:

As far as I can tell, it no longer is possible in Chrome or FireFox. It may still be possible in IE (at least pre-Edge).

It is possible. I searched the whole net for this, but once when i took one of microsoft’s survey, I finally got the answer.

this will close the current tab for you.

Sorry for necroposting this, but I recently implemented a locally hosted site that had needed the ability to close the current browser tab and found some interesting workarounds that are not well documented anywhere I could find, so took it on myself to do so.

Note: These workarounds were done with a locally hosted site in mind, and (with the exception of Edge) require the browser to be specifically configured, so would not be ideal for publicly hosted sites.

Context:

In the past, the jQuery script window.close() was able to close the current tab without a problem on most browsers. However, most modern browsers no longer support this script, potentially for security reasons.

Current Functionality:

window.close() will work on tabs opened by a script, or by an anchor with target=»_blank» (opened in a new tab)

See @killstreet’s comment on @calios’s answer

Browser Specific work-arounds:

Google Chrome:

Chrome does not allow the window.close() script to be to be run and nothing happens if you try to use it. By using the Chrome plugin TamperMonkey however we can use the window.close() method if you include the // @grant window.close in the UserScript header of TamperMonkey.

For example, my script (which is triggered when a button with is clicked and if ‘yes’ is pressed on the browser popup) looks like:

Note: This solution can only close the tab if it is NOT the last tab open however. So effectively, it cannot close the tab if it would cause window to closes by being the last tab open.

Firefox:

Firefox has an advanced setting that you can enable to allow scripts to close windows, effectively enabling the window.close() method. To enable this setting go to about:config then search and find the dom.allow_scripts_to_close_windows preference and switch it from false to true.

This allows you to use the window.close() method directly in your jQuery file as you would any other script.

For example, this script works perfectly with the preference set to true:

This works much better than the Chrome workaround as it allows the user to close the current tab even if it is the only tab open, and doesn’t require a third party plugin. The one downside however is that it also enables this script to be run by different websites (not just the one you are intending it to use on) so could potentially be a security hazard, although I cant imagine closing the current tab being particularly dangerous.

Disappointingly Edge actually performed the best out of all 3 browsers I tried, and worked with the window.close() method without requiring any configuration. When the window.close() script is run, an additional popup alerts you that the page is trying to close the current tab and asks if you want to continue.

Edit: This was on the old version of Edge not based on chromium. I have not tested it, but imagine it will act similarly to Chrome on chromium based versions

CucLe

Final Note: The solutions for both Chrome and Firefox are workarounds for something that the browsers intentionally disabled, potentially for security reasons. They also both require the user to configure their browsers up to be compatible before hand, so would likely not be viable for sites intended for public use, but are ideal for locally hosted solutions like mine.

Источник

Форум

Справочник

window.close

Синтаксис

Описание, примеры

Если закрываемое окно не было открыто при помощи window.open, то
при его закрытии выводится предупреждение. Посетитель может отклонить закрытие.

А также winkНо будет вопрос посетителю, хочет ли он закрыть окно.

function exit() <
var thisWindow = window.open(«Listing3.html»,’_self’);
var exit = confirm(«Хотите закрыть страницу?»);
if(exit) <
thisWindow.close();
>
>

Как из родительского окна можно передать фокус окну, открытому следующей командой?
wid = window.open(‘1.htm’,’wname’,’width=300,height=300′);
wname.focus()
wid.focus()
window.wid.focus()
window.wname.focus()
self.wid.focus()
помогите плиз.

а у меня не получается закрыть окно, которое открыто не скриптом.

window.close.php

js/window.js

Подскажите как закрыть страницу через javaScript

если вставить в страницу скрипт с window.close(); то ничего не происходит..

нежно что бы при открытии страницы она закрывалась скажем через 5 секунд.

Та же проблема. Не срабатывает window.close()

Для доступа к свойствам текущего окна используется self. Используйте self.close();

Почему-то window.close(), self.close(), this.close() работают только в Opera.

Просто навесить код на элемент находящийся внутри фрейма.

Дело в том, что все упирается в политику безопасности.

Если вы хотите сделать что-бы было просто, то будьте готовы, что у вас будут «самопроизвольно» (с помощью кода в баннере например) закрываться все вкладки.

Дело в том, что все упирается в политику безопасности.

Если вы хотите сделать что-бы было просто, то будьте готовы, что у вас будут «самопроизвольно» (с помощью кода в баннере например) закрываться все вкладки.

Всегда открывал окно примерно таким кодом:

function ShowWin(src, width, height) <
obj = window.open(«», «», «scrollbars=0,dialog=0,minimizable=1,modal=1,width=»+width+»,height=»+height+»,resizable=0″ ) ;
obj.document.write(» » ) ;
obj.document.write(» » ) ;
obj.document.write(» » ) ;
>

Потребовалось закрытие окна, при клике вне него. Нашел в и-нете такой код:

Добавил в свою функцию, последней строкой, т.е. получилось:

function ShowWin(src, width, height) <
obj = window.open(«», «», «scrollbars=0,dialog=0,minimizable=1,modal=1,width=»+width+»,height=»+height+»,resizable=0″ ) ;
obj.document.write(» » ) ;
obj.document.write(» » ) ;
obj.document.write(» » ) ;
this.onfocus=function()
>

Все работает, окно закрывается при клике «снаружи».
Не понимаю, почему ONFOCUS, а не ONBLUR?
Может, кто-нибудь пояснить? Помогите пожалуйста разобраться!

это какая-то магия, но работает
вызванная без аргументов, функция закрывает текущее окно

function close_window(url) <
var newWindow = window.open(», ‘_self’, »); //open the current window
window.close(url);
>

А может ко сможет мне помочь? Мне нужно, чтоб по нажатию «ОК» в диалоговом окне alert закрывалась браузерная вкладка

Как сделать так что бы при нажатии на ОК посетитель переходил на другую страницу, а если отмена закрывалась вкладка?

Если кто мучался с закрытием модольного окна, открытого через jquery, (Например:
highslide), то вот таблетка:

играю в браузерную игру
минимальную информацию обо мне в игре можно узнать просто нажав на мой профиль
где откроется отдельное окно
но и этого я бы не хотел
там можно загрузить свою картинку (с любого сайта), вписать домашнюю страницу, оставить свою почту
вот в этих вариантах есть возможность закрытия окна с моим профилем?
что бы просто автоматически закрывалась открывшись
например когда обращается за картинкой на какой то ресурс а оттуда сразу команда закрыть окно

javascript:close() в ссылку и не парься

Есть ли способ закрыть текущую страницу в последнем chrome.
var newWindow = window.open(», ‘_self’, »); //open the current window
window.close();
Этот способ не работает.
В консоль падает warning Scripts may close only the windows that were opened by it.

У меня работает только такой способ: self.close()

Доработал «читерский».
Пропишите следующего рода скрипт на закрываемую страницу.

И вызовите функцию DoCPExit();

Все успешно закрывается и без каких-либо подтверждений для пользователя.
Причем вызов функции можно настроить по времени истечения, например 5 секунд.

Источник

Понравилась статья? Поделить с друзьями:
  • Сценарии использования инфраструктуры цифрового профиля
  • Сценарии детских мультиков
  • Сценарии отчетных концертов сельских домов культуры
  • Сценарии начинающих авторов
  • Сценарии использования информационной системы