Как да блокирам потребителите да затварят прозорец в 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, тъй като не задейства onbeforeunload събития. - person Marcel Korpel; 09.02.2010
comment
Opera браузър ли е!!!! Как може 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- US/docs/Web/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
Има някои законни приложения за това. Внедрявам решение за менторство на ethereum stream-base. Ако потребителят просто затвори прозореца, той ще загуби пари. - 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
Аха, единственият браузър, позволяващ персонализирано съобщение в днешно време е 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 или го затвори от диспечера на задачите

Защо не следите дали не са го попълнили в бисквитка или DB и когато посетят следващия път просто върнете същия екран...:BTW..не сте завършили попълването на този формуляр... "

Разбира се, ако бяхте наоколо преди срива на dotcom, щяхте да си спомните порно бури, където, ако затворите 1 прозорец, щяха да се отворят 15 други... така че да, има код, който ще открие затваряне на прозорец, но ако натиснете ALT + F4 два пъти, той ще се затвори детето и родителят (ако беше изскачащ прозорец)

person SQLMenace    schedule 09.02.2010
comment
Първо, разбира се, не трябва да се злоупотребява с този вид функция. Винаги има възможност действието, което трябва да бъде потвърдено/отложено, да е критично и/или чувствително към времето. Например онлайн банкиране. Изпращам транзакция за плащане на сметка за плащане, което трябва да бъде инициирано днес. Показва ми се страница за преглед/потвърждение, където мога Edit, Confirm или Cancel. Превключвам към друг раздел на браузъра и след това неволно затварям браузъра. Трябва да се покаже банковата страница и да ме уведомите, че се изисква потвърждение. Чакането до следващата седмица, когато отворя отново billpay, не е идеално. - 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% участие от служителите на вашата компания, тогава по-добрият начин би бил просто формулярът да следи ID/потребителско име/имейл на отговорилите и т.н. На всеки няколко дни просто изпращайте хубаво малко напомняне по имейл на хората във вашата организация да попълнят анкетата... вероятно дори бихте могли да автоматизирате това.

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 вероятно е повреден. Те са единствените, които не са извлечени от chromum, а нашият код за нашия сайт (както и библиотеката, за която платихме, която използваме) е пълен със специален код за коригиране на неща, така че да се показва правилно във firefox. Освен това се надявам, че не сте гласували против това. Този отговор е отпреди десет години и вероятно тогава е работил. - person John Lord; 06.07.2020