Проблема в том, что когда я вызываю window.close()
или self.close()
он не закрывает окно. Теперь кажется, что в Chrome невозможно закрыть с помощью скрипта любое окно, которое не было создано скриптом. Это явно неверно, но независимо от того, что он все еще должен это делать, даже если для подтверждения требуется всплывающее предупреждение. Это не происходит.
Так есть ли у кого-нибудь реальный, функциональный и проверенный метод закрытия окна с использованием чего-то подобного javascript:window.close()
или javascript:self.close()
действительно выполняющий то, что ожидается, и то, что происходит просто отлично в каждом браузере, НЕ основанном на Chrome? Любые предложения будут с благодарностью, и я ищу Javascript для конкретного решения, ничего JQuery или сторонней реализации.
Обновление: хотя большая часть из того, что было предложено, имеет серьезные ограничения и проблемы с удобством использования, последнее предложение (специфичное для TamperMonkey), используемое // @grant window.close
в заголовке скрипта, часто помогает, даже на тех вкладках, которые обычно не могут обработать метод close. Хотя это не совсем идеально и не обобщается на каждый случай, в моем случае это хорошее решение.
window.close()
у меня работает в хроме.window.close
не работает так, как должен, я думаю, что это может быть более полезным, чем сказать: «это не работает».<a href="javascript:window.close">CLOSE</a>
Ответы:
Обычный javascript не может закрывать окна волей-неволей. Это функция безопасности, представленная некоторое время назад, для предотвращения различных злонамеренных эксплойтов и неприятностей.
Из последней рабочей спецификации для
window.close()
:Это означает, что за одним небольшим исключением нельзя разрешать JavaScript закрывать окно, которое не было открыто этим же JavaScript.
Chrome допускает это исключение, которое не распространяется на пользовательские скрипты, а Firefox - нет. Реализация Firefox гласит :
Если вы пытаетесь использовать
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.
источник
dom.allow_scripts_to_close_windows;false
to,true
но я ничего не догадываюсь в Chrome, не взломав источник / перестройку, как я обошел это сейчас. Я знаю и поговорил с разработчиком ТМ, и в недавней альфа / бета-версии мы определили его как вариант совместимости (настройка сценария) для работы в стиле «человек посередине», работает. Думаю, если не считать взломов, у нас нет чистого решения, жалко.window.close()
будет работать в Tampermonkey, если вы установите@grant
значение, отличное отnone
. Смотрите эту тему .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, он предоставляет такие функции, как структура содержимого, сортируемые таблицы и подсветка синтаксиса блока кода с номером строки.
Я также создал этот пост , любые комментарии приветствуются.
источник
open(location, '_self').close();
- обратите внимание на использование возвращаемого значения изopen()
. Это все еще работает на Chrome36.0.1985.125 m
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 за комментарий.chrome.windows.remove
его, я не могу найти символ хрома. как я могу решить это? мне нужно добавить какую-то ссылку?В Tampermonkey теперь вы можете использовать
А потом просто позвоните
источник
Я использую метод, опубликованный Броком Адамсом, и он даже работает в Firefox, если он инициирован пользователем.
Я звоню по нажатию кнопки, чтобы он был инициирован пользователем , и он все еще работает нормально, используя Chrome 35-40, Internet Explorer 11, Safari 7-8 и ALSO Firefox 29-35. Я проверил, используя версию 8.1 Windows и Mac OS X 10.6, 10.9 и 10.10, если это отличается.
Самозакрывающийся код окна (на закрывающейся странице)
Полный код, который будет использоваться в открытом пользователем окне, которое может закрыться:
window_to_close.htm
JavaScript:
HTML:
Попробуйте эту тестовую страницу: (сейчас протестировано в Chrome 40 и Firefox 35)
http://browserstrangeness.bitbucket.io/window_close_tester.htm
Код открывания окна (на странице, которая открывается вышеупомянутой страницы)
Чтобы это работало, кросс-браузерная совместимость с обеспечением безопасности требует, чтобы закрываемое окно уже было открыто пользователем, нажимающим кнопку в том же домене сайта.
Например, окно, которое использует метод, описанный выше, чтобы закрыть себя, может быть открыто со страницы с помощью этого кода (код предоставлен из моей страницы-примера, ссылки на которую приведены выше):
window_close_tester.htm
JavaScript:
HTML:
источник
<button onclick="open(location,'_self').close()" >Close Window</button>
. Я делаю что-то явно неправильно? Мне кажется, что это также инициируется пользователем. Обратите внимание, что я получаю тот же результат, если я использую<button>
или<input type="button">
.window.open('', '_self', ''); window.close();
но это работало сopen(location, '_self').close();
Многие люди все еще пытаются найти способ закрыть браузер Chrome с помощью JavaScript. Следующий метод работает только в том случае, если вы используете Chrome в качестве программы запуска приложений - например, киоск!
Я проверил следующее:
Я использую следующее расширение: Close Kiosk
Я следую инструкциям по использованию, и, похоже, все работает нормально (убедитесь, что вы очищаете кеш при выполнении тестов). Я использую javascript (прикрепленный к событию клика):
Надеюсь, это кому-нибудь поможет, так как это единственное рабочее решение, которое я нашел.
Примечание. Похоже, расширение работает в фоновом режиме и добавляет значок Chrome в трее. У него отмечена следующая опция: «Дать Chrome работать в фоновом режиме» (или аналогичный текст). Возможно, вам придется поиграть с ним, пока он не сработает для вас. Я снял флажок, и теперь он работает просто отлично!
источник
Несмотря на то, что вы думаете, что это «явно ложно», то, что вы говорите «кажется верой», на самом деле правильно. Документация Mozilla для window.close говорит
Вы говорите, что «он все еще должен это делать», но я не думаю, что вы найдете какую-либо ссылку, подтверждающую это, может быть, вы что-то неправильно запомнили?
источник
Я нашел новый способ, который работает для меня безупречно
источник
Приведенный ниже код работал для меня -
Протестировано на Chrome 43.0.2357.81
источник
Это может быть старым, но давайте ответим.
Я использую top.close (), чтобы закрыть вкладку. window.close () или другой метод open ... close для меня не работает.
источник
"Scripts may not close windows that were not opened by script."
проблемы, упомянутой в других ответах.В моем случае страница должна была закрыться, но, возможно, была открыта по ссылке и, таким образом
window.close
, потерпела неудачу.Решение, которое я выбрал, состоит в том
window.close
, чтобы выпустить , а затемwindow.setTimeout
перенаправить на другую страницу.Таким образом, в случае
window.close
успеха выполнение на этой странице останавливается, но если происходит сбой, через секунду он перенаправляет на другую страницу.источник
Этот ответ от Брока, чтобы он работал на меня. javascript не должен закрывать окно, которое не было открыто этим же javascript.
Я могу закрыть дочернее окно, только если я буду закрывать его из родительского javascript. так что в моем родителе я могу сделать что-то вроде этого.
источник
Вы также можете попробовать использовать мой код ниже. Это также поможет вам перенаправить родительское окно:
родитель:
Неожиданно возникнуть:
источник
Для TamperMonkey:
Ссылка: https://www.tampermonkey.net/documentation.php#_grant
источник
Только если вы откроете новое окно с помощью window.open (), оно сможет закрываться с использованием кода, как я уже упоминал выше. Это прекрасно работает для меня :) Примечание: Никогда не используйте href, чтобы открыть страницу в новой вкладке. Window.close () не работает с "href". Вместо этого используйте window.open ().
источник
Я хотел поделиться своим «решением» с этой проблемой. Похоже, что большинство из нас пытается закрыть окно браузера в стандартном сеансе браузера, когда пользователь посещает тот или иной веб-сайт, после того, как он посетил другие веб-сайты, и до того, как они посетят еще несколько.
Однако моя ситуация такова, что я создаю веб-приложение для устройства, которое, по сути, будет единственным, что делает устройство. Вы загружаете его, он запускает Chrome и переходит к нашему приложению. Он даже не подключен к Интернету, все серверы, к которым он обращается, находятся в наших локальных контейнерах Docker. Пользователю нужен способ закрыть приложение (или закрыть Chrome), чтобы он мог получить доступ к терминалу для выполнения обновлений системы.
Таким образом, он загружается, запускает Chrome в режиме киоска, по правильному адресу уже. Это легко удовлетворяет второму варианту в спецификации:
Так что просто звонить
window.close()
из моего киоска приложение просто работает !источник
Попробуйте что-то вроде этого onclick = "return self.close ()"
источник