self.close () не работает & hellip; Есть ли какая-нибудь работа для этого? [Дубликат]

Поскольку они являются объектно-ориентированными глобальными переменными, вы можете обычно создавать свои классы таким образом, чтобы они вам не нужны.

134
задан GµårÐïåñ 16 February 2016 в 19:54
поделиться

12 ответов

Теперь в tampermonkey вы можете использовать

// @grant        window.close

, а затем просто назовите

window.close();
14
ответ дан balping 21 August 2018 в 06:11
поделиться
  • 1
    Я подтвердил, что это работает во многих случаях, но все же иногда упрямо, но лучше, чем ничего, спасибо. Я добавлю его в сообщение. – GµårÐïåñ 16 February 2016 в 19:51
  • 2
    Как примечание: не работает для меня в Greasemonkey 3.10 – mt025 2 April 2017 в 17:39

Обычный javascript не может закрыть окна волей-неволей. Это функция безопасности, введенная некоторое время назад, чтобы остановить различные вредоносные эксплойты и раздражения.

Из последней рабочей спецификации для window.close() :

Метод close() для объектов Window должен, если выполняются все следующие условия, закройте контекст просмотра A :

  • Соответствующий контекст просмотра [ является script-closable .
  • Контекст просмотра действующего сценария знаком с контекстом просмотра A .
  • В контексте просмотра действующего сценария разрешено перемещаться по контексту просмотра A .

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

Это означает, что с одним небольшим исключением 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 уязвим для эксплойта «самоперехвата». Так что код, подобный этому, использовался для работы в целом:

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

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

Тем не менее, вариант по-прежнему работает на Chrome (v43 и v44) плюс Tampermonkey (v3.11 или новее). Используйте явные @grant и обычные window.close(). EG:

// ==UserScript==
// @name        window.close demo
// @include     http://YOUR_SERVER.COM/YOUR_PATH/*
// @grant       GM_addStyle
// ==/UserScript==

setTimeout (window.close, 5000);

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

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

Вы можете открыть about:config и установить allow_scripts_to_close_windows на true.

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

В настоящее время для Chrome нет эквивалентных настроек.

151
ответ дан Community 21 August 2018 в 06:11
поделиться
  • 1
    Эй, друг мой, рад наконец услышать от тебя. Просто заметьте, что на Fx вы можете обойти это ограничение, перевернув dom.allow_scripts_to_close_windows;false на true, но я ничего не думаю об этом в Chrome, не взломав исходный / перестроенный, так как теперь я обходил его. Я знаю и говорил с разработчиком TM, и в недавней альфа-бетах мы поставили его как вариант совместимости (настройка скрипта) для работы в стиле «человек в середине». Я догадываюсь, что у нас нет чистого решения, жалость. – GµårÐïåñ 5 November 2013 в 02:13
  • 2
    Если у кого-то возникают проблемы с window.close или особой разницей поведения между браузерами, внимательно прочитайте этот ответ - у него действительно есть вся необходимая информация. – Bron Davies 25 February 2014 в 18:06
  • 3
    Есть ли способ проверить, открыто ли окно скриптом или нет? (Мне нужно показать / скрыть кнопку «Назад», я не хочу использовать хак). Спасибо EDIT: window.opener === null – Cétia 24 June 2014 в 09:07
  • 4
    это не работает для меня прямо сейчас – Simona Adriani 13 May 2015 в 11:35
  • 5
    window.close() будет работать в Tampermonkey, если вы установите @grant на значение, отличное от none. См. эту нить . – zanetu 27 August 2015 в 20:59

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

-1
ответ дан DfrDkn 21 August 2018 в 06:11
поделиться
  • 1
    Он просто заменяет текущее окно. Больше не надо. – RicardoGonzales 8 August 2015 в 20:09

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

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

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

5
ответ дан Gareth 21 August 2018 в 06:11
поделиться

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

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

Я вызываю его нажатием на кнопку, поэтому он инициируется пользователем, и это все еще работает отлично, используя Chrome 35-40, Internet Explorer 11, Safari 7-8 и ALSO Firefox 29-35. Я тестировал версию 8.1 Windows и Mac OS X 10.6, 10.9 и amp; 10.10 если это другое.


Полный код:

HTML:

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

JavaScript:

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

Попробуйте следующую тестовую страницу: (Теперь протестировано в Chrome 40 и Firefox 35)

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

13
ответ дан Jeff Clayton 21 August 2018 в 06:11
поделиться
  • 1
    Забыл об пользовательских исключениях; хороший улов. Я думаю, что большинству userscripters требуется полностью автоматическая работа. У них уже есть удобный, инициированный пользователем закрытый механизм - тот маленький X в правом верхнем углу. (^_^) – Brock Adams 16 May 2014 в 01:51
  • 2
    Так или иначе, это не работает для меня. Ни на firefox 30, ни на Chrome 37. Все это делает страницу пустой (действительно странное поведение). Мой код <button onclick="open(location,'_self').close()" >Close Window</button>. Я делаю что-то явно неправильно? Мне кажется, что это тоже пользователь. Обратите внимание, что я получаю тот же результат, если я использую <button> или <input type="button">. – LordOfThePigs 28 August 2014 в 23:47
  • 3
    В ответе для вас добавлена ​​тестовая страница. – Jeff Clayton 29 August 2014 в 00:12
  • 4
    Ссылка мертва ????????????????????????????? где это????????? – YumYumYum 15 April 2017 в 23:24
  • 5
    @YumYumYum спасибо за сообщение, bitbucket.org недавно изменил ссылку на bitbucket.io - исправлено в ответе сейчас – Jeff Clayton 16 April 2017 в 02:58

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

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

Я использую следующее расширение: Закрыть киоск

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

window.location.href = '/closekiosk';

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

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

9
ответ дан Minister 21 August 2018 в 06:11
поделиться

Попробуйте что-то подобное onclick = "return self.close ()"

-4
ответ дан Ragven 21 August 2018 в 06:11
поделиться

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

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

2
ответ дан Soley 21 August 2018 в 06:11
поделиться
  • 1
    Это также страдает от проблемы "Scripts may not close windows that were not opened by script.", упомянутой в других ответах. – kad81 15 September 2014 в 07:49
  • 2
    Это не работает. Аналогично parent.close () – Xin 12 July 2016 в 13:57
  • 3
    пожалуйста, дайте решение по вашему ответу. пожалуйста, не обсуждайте проблему только по вашему ответу. – Bimal Das 4 August 2017 в 05:05

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

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

Проверено на Chrome 43.0.2357.81

4
ответ дан Stephan 21 August 2018 в 06:11
поделиться
  • 1
    Можете ли вы добавить свою версию Chrome, пожалуйста? – Stephan 28 May 2015 в 11:35
  • 2
    Моя версия хром - 43.0.2357.81. – DfrDkn 28 May 2015 в 15:52
  • 3
    Для меня это просто заменяет текущее окно, с окном в / location. – alianos- 1 June 2015 в 14:13
  • 4
    @ alianos - для меня тоже. – RicardoGonzales 8 August 2015 в 20:03
  • 5
    Не работает в последнем хроме - Версия 61.0.3163.100 (Official Build) (64-разрядная версия) – Subhajit 5 October 2017 в 07:23

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

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

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

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

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

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

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

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

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

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

25
ответ дан swcool 21 August 2018 в 06:11
поделиться
  • 1
    Правильный взлом - open(location, '_self').close(); - обратите внимание на использование возвращаемого значения из open(). Это все еще работает на Chrome 36.0.1985.125 m – Brock Adams 21 July 2014 в 01:26
  • 2
    В моем случае, я просто снова тестирую с помощью open(location, '_self').close();, я получил «Несанкционированный». ошибка на этом. Эта ошибка отличается от «window.close () (warning on this"Scripts may close only the windows that were opened by it."). It looked like open (location,« _self »). Close ();` немного продвинулся вперед, но в моем случае он не может завершиться. Спасибо @ brock-adams за комментарий. – swcool 21 July 2014 в 16:42
  • 3
    У меня есть машинопись, и когда я положил chrome.windows.remove, он говорит, что не мог найти символ хром. как я могу это решить? мне нужно добавить какую-то ссылку? – DevT 22 July 2014 в 13:03
  • 4
    @devt chrome.windows.remove - API расширения Chrome, ваш javascript должен быть распознан вашей программой расширения chrome. Вы можете попробовать его внутри background.js, в вашем расширении манифеста chrome. Вам нужно иметь: & quot; background & quot ;: {& quot; scripts & quot ;: [& quot; background.js & quot;], ...}, – swcool 22 July 2014 в 20:28
  • 5
    Я удалил функцию входа в систему MarkView для свободного доступа пользователей. Поэтому приведенный выше пример не доступен. – swcool 3 December 2016 в 16:05

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

var win = window.open("about:blank", "_self");
win.close();
4
ответ дан शेखर 21 August 2018 в 06:11
поделиться
  • 1
    Не работает. : / – Ivan Ivković 10 March 2015 в 07:42
  • 2
    это не работает в IE11 – VimalKumar 26 October 2015 в 20:40
  • 3
    это 2017, и я все еще получаю сообщение об ошибке «Скрипты могут не закрывать окна, которые не были открыты скриптом». – Rotimi Olawale 8 March 2017 в 15:26
  • 4
    Nice hack для подтверждения кнопки IE 11. – Gopal00005 9 August 2017 в 10:31
  • 5
    Не работает и в последнем хроме. – Subhajit 5 October 2017 в 07:22
0
ответ дан user2182349 1 November 2018 в 01:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: