Как заблокировать пользователей от закрытия окна в JavaScript?
Можно ли запретить пользователям закрывать окно с помощью кнопки выхода [X]? На самом деле я предоставляю кнопку закрытия на странице, чтобы пользователи закрывали окно. В основном, я пытаюсь заставить пользователей заполнить форму и отправить ее. Я не хочу, чтобы они закрывали окно, пока они не отправят его.,
ребята, я очень ценю ваши комментарии, я не думаю о размещении на любом коммерческом веб-сайте. Это внутренняя вещь, мы фактически привлекаем весь персонал для участия в этом опросе, который мы разработали.... я знаю, что это не правильный путь, но Интересно, было ли решение проблемы, которую мы получили здесь...
9 ответов
Взгляни на 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 используются в Modern Web для двух вещей:
1. Предотвращение непреднамеренной потери данных пользователями.
2. Мошенничество с пользователями.В попытке ограничить их использование для последнего, не останавливая первое, мы не будем отображать строку, предоставленную веб-страницей. Вместо этого мы собираемся использовать общую строку.
Firefox уже делает это [...]
Если вы не хотите отображать всплывающее окно для всех событий, вы можете добавить такие условия, как
window.onbeforeunload = confirmExit;
function confirmExit() {
if (isAnyTaskInProgress) {
return "Some task is in progress. Are you sure, you want to close?";
}
}
Это прекрасно работает для меня
Что вы будете делать, когда пользователь нажимает ALT + F4 или закрывает его из диспетчера задач
Почему бы вам не отследить, если они не заполнили его в файле cookie или в БД, и когда они зайдут в следующий раз, просто верните тот же экран...: Кстати... вы еще не закончили заполнение этой формы... "
Конечно, если бы вы были вокруг, прежде чем доткомы бюста вы помните порно штормов, где, если вы закрыли 1 окно 15 других бы open..so да есть код, который обнаружит закрытие окна, но если вы нажмете ALT + F4 в два раза закроется ребенок и родитель (если это было всплывающее окно)
Появится диалоговое окно с вопросом о том, действительно ли он хочет закрыть или остаться, с сообщением.
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;
Имейте в виду, что это очень раздражает. Если вы пытаетесь заставить своих пользователей заполнить форму, которую они не хотят заполнять, то у вас ничего не получится: они найдут способ закрыть окно и никогда не вернуться на ваш злой сайт.
Как насчет этого?
function internalHandler(e) {
return "Please don't leave our page ever!";
}
if (window.addEventListener) {
window.addEventListener('beforeunload', internalHandler, true);
} else if (window.attachEvent) {
window.attachEvent('onbeforeunload', internalHandler);
}
Если вы отправляете внутренний опрос, который требует 100% участия со стороны сотрудников вашей компании, то лучшим способом было бы просто иметь форму для отслеживания идентификатора респондента / имя пользователя / адрес электронной почты и т. Д. Каждые несколько дней или просто отправлять милые маленькие отправьте по электронной почте напоминание тем, кто работает в вашей организации, чтобы завершить опрос... возможно, вы даже можете автоматизировать это.
теоретически да [попробуйте демо]
но пожалуйста, пожалуйста, не делай этого
С помощью API BroadcastChannel мы действительно можем в некоторой степени запретить пользователю закрывать вкладку.
Однако этот метод основан на двух условиях:
- пользователь открывает два экземпляра страницы
- всплывающие окна не отключены
По сути, внедрив этот фрагмент, мы можем запретить пользователю закрывать все экземпляры текущей страницы:
const bc = new BroadcastChannel("close-channel");
window.addEventListener("beforeunload", (e) => {
bc.postMessage("close");
});
bc.addEventListener("message", (event) => {
window.open(location.href, "_blank", "");
})
Это работает так: когда открыты хотя бы два экземпляра страницы, и если пользователь пытается закрыть один экземпляр, он отправляет сообщение черезBroadcastChannel
сообщая другому экземпляру открыть другой экземпляр самого себя. Теоретически невозможно закрыть все экземпляры вкладки.
Однако это крайне опасный метод. Если пользователь попытается закрыть окно, вкладки будут бесконечно дублироваться, что приведет к сбою браузера.
Единственный способ выйти из этой ситуации — закрыть браузер или отключить всплывающие окна.
Это плохая практика - заставлять пользователя делать то, что он не обязательно хочет делать. Вы никогда не сможете помешать им закрыть браузер.
Вы можете достичь аналогичного эффекта, сделав div
на текущей веб-странице, чтобы наложить поверх остальных элементов управления, чтобы ваша форма была единственной доступной.
Ну, вы можете использовать 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;
Код был взят с этого сайта.
С другой стороны, если они форсируют закрытие (используя диспетчер задач или что-то в этих строках), вы ничего не можете с этим поделать.