Я разрабатываю веб-сайт электронной коммерции (PHP), и вот мое требование.
Как только клиент покинет страницу заказа или закроет браузер, я хотел бы предложить другой продукт с всплывающим окном или предупреждающим полем. Если они выбрали «Да», он будет перенаправляться на другую страницу продукта, а не на закрытие окна.
Я попытался использовать javascript window.open () в событии body onunload. Но браузеры блокируют его.
Нужно ли это сделать?
Благодарю вас, Den
Прежде всего: это совсем не удобно. Так же, как @Dagon сказал, никто не хочет, чтобы его ограничивали, оставляя страницу, а затем показывали спам различных продаваемых товаров. С учетом сказанного, я уверен, что у вас есть законная причина, или, скорее, им говорят сделать это. Итак, вот мой ответ —
Невозможно сделать это с событием onunload. Как только это событие будет запущено, нет возможности перенаправить или отменить разгрузку, потому что это буквально на событии разгрузки .
Ваш лучший шанс сделать это будет в событии onbeforeunload. Это единственное событие, которое фактически приостанавливает событие onunload и также может отменить onunload от выполнения. Событие onbeforeunload имеет два разных результата
Идея, которую вы, возможно, захотите попробовать (я никогда не пытался это сделать), попробуйте добавить гиперссылку в оператор return из события onbeforeunload. Опять же, не знаю, будет ли это работать.
Ниже представлен очень простой пример событий onbeforeunload и onunload:
<script type="text/javascript"> //may not be neccesary for your code window.onbeforeunload=before; window.onunload=after; function before(evt) { return "This will appear in the dialog box allong with some other default text"; //If the return statement was not here, other code could be executed silently (with no pop-up) } function after(evt) { //This event fires too fast for the application to execute before the browser unloads } </script>
того, как<script type="text/javascript"> //may not be neccesary for your code window.onbeforeunload=before; window.onunload=after; function before(evt) { return "This will appear in the dialog box allong with some other default text"; //If the return statement was not here, other code could be executed silently (with no pop-up) } function after(evt) { //This event fires too fast for the application to execute before the browser unloads } </script>
Я знаю, что вы хотите создать предупреждение или всплывающее подтверждение, но у вас тоже есть проблемы. Типичный программист не имеет доступа к исходному коду событий onbeforeunload и onunload, поэтому никто не на 100% уверен в том, что они делают. Из моего тестирования я знаю, что кажется невозможным, чтобы пользовательское всплывающее окно отображалось только один раз и также выполняло другой код.
Если пользователь закрывает веб-страницу, это единственный способ захвата, который находится в событии onbeforeunload. Из этого нет выхода. Если пользователь использует кнопку «Назад», там также запускается событие onbeforeunload. Я знаю, какова ваша конечная цель, но у меня есть предложение, если это допустимо, конечно. Попробуйте привязать ссылки или кнопки на своей странице. Если это абсолютно необходимо, чтобы это всплывающее окно, единственным надежным способом сделать это было бы привязать всплывающее окно к ссылкам / кнопкам, которые находятся на вашей веб-странице. Но, конечно, это будет работать только в том случае, если они будут пытаться перемещаться по вашим ссылкам (что будет немного более удобным для пользователя), но если они попытаются перемещаться по внешним ссылкам (например, любимым ссылкам или закрытию браузера), то это будет не выполняются.
Желаем удачи в ваших начинаниях. Onbeforeunload и onunload сложны.
То же самое на моем портале. Когда пользователь закрывает браузер, мне нужно некоторое время, чтобы отложить перезагрузку некоторых данных. Код, который я использую ниже, работает для меня. Когда пользователь закрывает просмотр, вкладку или пытается перенаправить на другую страницу, для пользователя будет отображаться сообщение о том, чтобы выбрать пребывание или отпуск.
var validNavigation = false; function wireUpEvents() { var dont_confirm_leave = 0; //set dont_confirm_leave to 1 when you want the user to be able to leave withou confirmation var leave_message = cmsLeaveMessage; function goodbye(e) { validNavigation = isUserLoggedIn == 0 ? true : validNavigation; if (!validNavigation) { if (dont_confirm_leave!==1) { if(!e) e = window.event; //e.cancelBubble is supported by IE - this will kill the bubbling process. e.cancelBubble = true; e.returnValue = leave_message; //e.stopPropagation works in Firefox. /* if (e.stopPropagation) { e.stopPropagation(); e.preventDefault(); } */ //return works for Chrome and Safari $.ajax({ url: linkResetTask, type: 'POST', dataType: "html", success:function(){ init("Employee"); } }); validNavigation = false; return leave_message; } }else { validNavigation = false; } } $(window).bind('beforeunload', goodbye ); // Attach the event keypress to exclude the F5 refresh $(document).bind('keydown keyup', function(e) { if(e.which === 116) { validNavigation = true; } if(e.which === 82 && e.ctrlKey) { validNavigation = true; } }); } // Wire up the events as soon as the DOM tree is ready $(document).ready(function() { wireUpEvents(); });