window.close () self.close () не работает в chrome версии 59.0.3071.86 [duplicate]

Когда вы конвертируете .1 или 1/10 в base 2 (двоичный), вы получаете повторяющийся шаблон после десятичной точки, точно так же, как пытаетесь представить 1/3 в базе 10. Значение не является точным, и поэтому вы можете 't делать точную математику с ней, используя обычные методы с плавающей запятой.

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

11 ответов

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

// @grant        window.close

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

window.close();
14
ответ дан balping 27 August 2018 в 22:01
поделиться

Обычный 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 27 August 2018 в 22:01
поделиться

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

-1
ответ дан DfrDkn 27 August 2018 в 22:01
поделиться

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

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

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

5
ответ дан Gareth 27 August 2018 в 22:01
поделиться

Я использую метод, опубликованный 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 27 August 2018 в 22:01
поделиться

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

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

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

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

window.location.href = '/closekiosk';

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

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

9
ответ дан Minister 27 August 2018 в 22:01
поделиться

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

-4
ответ дан Ragven 27 August 2018 в 22:01
поделиться

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

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

2
ответ дан Soley 27 August 2018 в 22:01
поделиться

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

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

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

4
ответ дан Stephan 27 August 2018 в 22:01
поделиться

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 27 August 2018 в 22:01
поделиться

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

var win = window.open("about:blank", "_self");
win.close();
4
ответ дан शेखर 27 August 2018 в 22:01
поделиться
Другие вопросы по тегам:

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