Как запретить пользователям закрывать окно в Javascript?

Можно ли запретить пользователям закрывать окно с помощью кнопки выхода [X]? На самом деле я предоставляю пользователям кнопку закрытия на странице, чтобы закрыть окно. В основном то, что я пытаюсь сделать, это заставить пользователей заполнить форму и отправить ее. Я не хочу, чтобы они закрывали окно, пока не отправят его.

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

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


person manraj82    schedule 09.02.2010    source источник
comment
Слава Богу, что нет.   -  person Vincent Ramdhanie    schedule 09.02.2010
comment
Я не хочу, чтобы мое окно пыталось заставить меня отправить какую-то форму. Убить процесс браузера - это способ, которым вы не сможете предотвратить это с помощью javascript.   -  person Natrium    schedule 09.02.2010
comment
С точки зрения удобства использования, что, если пользователь не хочет заполнять форму и покидать/закрывать окно по какой-либо причине? Не расстроит ли это пользователей вашего сайта и не оттолкнет ли их? Или, что еще хуже, ввести мусорные данные только для того, чтобы окно закрылось?   -  person John Lechowicz    schedule 09.02.2010
comment
Не минусуйте, потому что вы находите веб-сайты, которые делают это неприятными. Предложите конструктивную альтернативу в надежде, что он увидит выгоду от того, что сделает это по-другому. Вопрос резонный.   -  person Jonathon Faust    schedule 09.02.2010
comment
Сеть работает иначе — это не должно быть возможным. Ваше приложение отправляет пользователю некоторый HTML и Javascript, а затем оно выходит из-под контроля. К счастью, JavaScript не имеет НАСТОЛЬКО контроля над клиентом.   -  person FrustratedWithFormsDesigner    schedule 09.02.2010
comment
ребята, я очень ценю ваши комментарии, я не думаю о размещении на каком-либо коммерческом веб-сайте. это внутреннее дело, мы на самом деле приглашаем всех сотрудников принять участие в этом опросе, который мы разрабатываем....   -  person manraj82    schedule 09.02.2010
comment
@manraj82: Многие современные системы опросов смогут отслеживать прогресс пользователя по одной странице за раз. Если пользователь прерывает работу в середине, он может возобновить работу сразу после последнего завершенного этапа.   -  person FrustratedWithFormsDesigner    schedule 09.02.2010


Ответы (8)


Взгляните на onBeforeUnload.

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

<script language="JavaScript">
    window.onbeforeunload = confirmExit;
    function confirmExit() {
        return "You have attempted to leave this page. Are you sure?";
    }
</script>

Редактировать: большинство браузеров больше не поддерживают персонализированное сообщение для onbeforeunload.

См. этот отчет об ошибке от 18 февраля 2016 года.

В современном Интернете диалоговые окна onbeforeunload используются для двух целей:
1. Предотвращение непреднамеренной потери данных пользователями.
2. Мошенничество пользователей.

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

Firefox уже делает это[...]

person Pool    schedule 09.02.2010
comment
Это не будет работать в Opera, так как оно не срабатывает при событиях перед выгрузкой. - person Marcel Korpel; 09.02.2010
comment
Опера - это браузер!!!! Как 1,6% людей могут его использовать! w3schools.com/browsers/browsers_stats.asp - person Parixit; 02.07.2013
comment
1,6% людей, которых не раздражают диалоги с вопросом, хотят ли они закрыть окно? Серьезно подумываю о переходе на Opera и о том, чтобы стать частью 1,603%.. - person FrancescoMM; 04.07.2013
comment
Firefox не показывает никаких пользовательских строковых сообщений, возвращаемых функцией confirmExit(). - person Nehal; 09.07.2013
comment
@FrancescoMM Существует множество возможных причин, по которым вы можете захотеть подтвердить, что пользователь хочет закрыть страницу, чтобы он не сделал это случайно. - person jugg1es; 17.03.2015
comment
Документация MDN об этом находится по адресу developer.mozilla.org/en- США/документы/Интернет/API/WindowEventHandlers/ - person Stav Pan Geffen; 04.06.2015
comment
Теперь это не работает в Firefox 59.0.2 и Chrome 65.0.3325.181, и как я могу вызвать функцию, когда страница закрыта? - person gavinSong; 07.05.2018
comment
Для этого есть законное применение. Я внедряю решение для наставничества на базе потоков Эфириума. Если пользователь просто закроет окно, он потеряет деньги. - person Loic Coenen; 20.01.2020
comment
Работающий. Потрясающий - person Ali Azhar; 21.01.2020
comment
мое законное использование заключается в том, что мы позволяем диспетчерам редактировать записи в табеле учета рабочего времени для водителей, и в этой сетке выполняется множество проверок, которые запускаются при нажатии кнопки возврата. Простое закрытие вкладки позволит прервать финансовый расчет. Меня не волнует аспект пользовательского интерфейса. Деньги превыше красоты. - person John Lord; 06.07.2020
comment
Когда загрузка изображений не завершена, нам нужно сказать пользователю не закрывать вкладку. - person DawnSong; 13.12.2020
comment
Ahah единственный браузер, позволяющий создавать собственные сообщения в настоящее время IE! Боже, это как чувак, потянувшийся на вечеринку, когда все ушли. - person TechNyquist; 06.04.2021

Если вы не хотите отображать всплывающее окно для всех событий, вы можете добавить такие условия, как

window.onbeforeunload = confirmExit;
    function confirmExit() {
        if (isAnyTaskInProgress) {
           return "Some task is in progress. Are you sure, you want to close?";
        }
    }

Это отлично работает для меня

person Imam    schedule 15.07.2015
comment
Я протестировал его на IE8, Firefox и Chrome, он работает нормально. - person Imam; 15.07.2015

Что вы будете делать, когда пользователь нажмет ALT + F4 или закроет его из диспетчера задач

Почему бы вам не отслеживать, если они не заполнили его в файле cookie или БД, и когда они придут в следующий раз, просто верните тот же экран...: Кстати... вы не закончили заполнение этой формы... "

Конечно, если бы вы жили до краха доткомов, вы бы помнили порноштормы, когда, если вы закроете 1 окно, откроется 15 других… так что да, есть код, который обнаружит закрытие окна, но если вы дважды нажмете ALT + F4, оно закроется. дочерний и родительский (если это было всплывающее окно)

person SQLMenace    schedule 09.02.2010
comment
Во-первых, конечно, такой функцией не следует злоупотреблять. Всегда существует вероятность того, что действие, которое необходимо подтвердить/отложить, является критическим и/или чувствительным ко времени. Например, онлайн-банкинг. Я отправляю платежную транзакцию для платежа, который необходимо инициировать сегодня. Мне показывают страницу обзора/подтверждения, где я могу Edit, Confirm или Cancel. Я переключаюсь на другую вкладку браузера, а затем случайно закрываю браузер. Мне нужна банковская страница, чтобы показать и сообщить мне, что требуется подтверждение. Ждать до следующей недели, когда я снова открою счет, не идеально. - person Kevin Fegan; 23.11.2016

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

var message = "You have not filled out the form.";
window.onbeforeunload = function(event) {
    var e = e || window.event;
    if (e) {
        e.returnValue = message;
    }
    return message;
};

Затем вы можете отключить его до отправки формы или чего-то еще с помощью

window.onbeforeunload = null;

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

person Gipsy King    schedule 09.02.2010
comment
у вас есть тип в строке 3, он должен быть var e = event || window.event - person samthet; 14.04.2021

Как насчет этого?

function internalHandler(e) {
    e.preventDefault(); // required in some browsers
    e.returnValue = ""; // required in some browsers
    return "Custom message to show to the user"; // only works in old browsers
}

if (window.addEventListener) {
    window.addEventListener('beforeunload', internalHandler, true);
} else if (window.attachEvent) {
    window.attachEvent('onbeforeunload', internalHandler);
}
person Aleksei    schedule 23.01.2012

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

person John Lechowicz    schedule 09.02.2010
comment
Я почти уверен, что есть много готовых систем опросов, которые уже способны на это (не уверен, что они стоят много долларов, но это другая тема). - person FrustratedWithFormsDesigner; 09.02.2010
comment
на самом деле мы зависели от этой предварительно созданной системы опросов, но она оказалась бесполезной... поэтому мы думали о более простом способе сделать это, но в любом случае спасибо за ваши комментарии.... - person manraj82; 09.02.2010

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

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

person Jonathon Faust    schedule 09.02.2010
comment
Угу, это тоже очень раздражает. Это отличный способ гарантировать, что я не вернусь на сайт. - person FrustratedWithFormsDesigner; 09.02.2010
comment
Это раздражает, согласен. Но это лучше, чем заставлять меня закрывать браузер с помощью диспетчера задач. Вместо этого я просто закрываю надоедливую вкладку. - person Jonathon Faust; 09.02.2010

Ну, вы можете использовать событие window.onclose и вернуть false в обработчике событий.

function closedWin() {
    confirm("close ?");
    return false; /* which will not allow to close the window */
}
if(window.addEventListener) {
     window.addEventListener("close", closedWin, false);
}

window.onclose = closedWin;

Код взят с этого сайта.

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

person jpabluz    schedule 09.02.2010
comment
тогда Firefox, вероятно, сломан. Они единственные, которые не являются производными от хрома, и наш код для нашего сайта (а также библиотека, за которую мы заплатили, которую мы используем) наполнен специальным кодом для исправления вещей, чтобы он правильно отображался в Firefox. Кроме того, я надеюсь, что вы не проголосовали за это. Этому ответу десять лет, и тогда он, вероятно, сработал. - person John Lord; 06.07.2020