Как программно определить, как браузер обрабатывает window.close()?

Различные веб-браузеры по-разному обрабатывают функцию window.close(). IE запрашивает у пользователя подтверждение, в то время как Firefox и Safari просто не соблюдают его, если окно изначально не было открыто с помощью Javascript и не отображает сообщение, говорящее об этом в консоли.

Стороннее веб-приложение, используемое внутри нашей организации, которое я поддерживаю, отображает кнопку «закрыть» в конце серии страниц, напоминающих мастер. Это хорошо работает для IE, которым пользуется большинство наших пользователей. Однако это явно не работает в FF. Я бы предпочел оставить кнопку и использовать Javascript, чтобы изящно ухудшить пользовательский интерфейс, не отображая эту кнопку в любом браузере, который не будет выполнять window.close().

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


person Brahm    schedule 24.10.2011    source источник
comment
Я не думаю, что это возможно. Вам, вероятно, лучше всего проверить, какой браузер используется - если это IE, вы можете предположить, что window.close() будет работать. Если это что-то другое, то предположим, что это не сработает.   -  person Joseph Redfern    schedule 25.10.2011
comment
До тех пор, пока IE не станет следовать за другими браузерами и не будет работать должным образом. Лучше написать разработчикам веб-приложения и попросить их исправить.   -  person RobG    schedule 25.10.2011


Ответы (3)


Попробуй это:

Демонстрация: http://jsfiddle.net/ThinkingStiff/mnv87/

Скрипт:

function hasClose() {

    var close = window.open( '', '', 'height=100,width=100,left=3500', false );
    close.close();
    return close.closed;

};

if( hasClose() ) {
    //show button
} else {
    //hide button
};

Примечание hasClose() также возвращает false, если всплывающие окна заблокированы.

person ThinkingStiff    schedule 29.10.2011
comment
К сожалению, это может оставить окно-сироту, так что это все еще уловка-22. - person ; 28.12.2011
comment
@pst Да, ты прав. Может быть, вы могли бы сделать это заставкой или чем-то полезным. - person ThinkingStiff; 28.12.2011
comment
Да, я думал о экране конфигурации :) - person ; 28.12.2011

Почему бы не проверить совместимость, а затем добавить, если она совместима? Использование jQuery:

<script type="text/javascript" src="latest_jquery_file.js"></script>
<script type="text/javascript">
  $(document).on("ready", (function(e)
  {
   $("body").append('<p><a href="#" id="windowcloser">Close The Window!!</a></p>');
      $('#windowcloser').click(function(){
         window.close();
      });
  })
  );
</script>

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

person sablefoste    schedule 22.04.2012
comment
... но вопрос в том, как проверить совместимость. - person Bob; 05.12.2014

Очень простой. Ваш скрипт должен попытаться (или try) выполнить window.close, и если он все еще жив после этой попытки, показать сообщение и, при желании, стереть/заменить содержимое страницы или использовать location.reload, чтобы у ваших пользователей не было никаких причин оставаться на странице больше. .

p.s.: имейте в виду, закрытие окон из JavaScript очень невежливо. Так что лучше иметь веские причины для этого ;)

person c69    schedule 25.10.2011
comment
Я подумал о том, чтобы определить, было ли окно закрыто после нажатия кнопки, но я бы предпочел не отображать кнопку в первую очередь. Кстати, использование try/catch в этом случае не помогает, поскольку и IE, и FF не выдают исключение с помощью window.close(). - person Brahm; 25.10.2011
comment
Что касается невежливости, хотя в целом это может быть правдой, есть исключения (аналогично подходу обнаружения функций и обнаружения браузера). Все дело в контексте и управлении ожиданиями. В этом случае веб-приложение используется нечасто для выполнения одной задачи. Он также доступен в режиме заблокированного киоска с экрана входа в систему Windows. Закрытие браузера возвращает к экрану входа в систему. Согласно закону Фиттса, наличие большой кнопки «Закрыть окно», расположенной по центру экрана под содержимым, может быть более интуитивно понятным, чем маленький крестик браузера киоска в правом верхнем углу. - person Brahm; 25.10.2011