我正在开发一个电子商务(PHP)网站,这是我的要求。
客户离开订单页面或关闭浏览器后, 我想提供另一种带弹出或警告框的产品。 如果他们选择“是”,则会重定向到其他产品页面 而不是关闭窗口。
我在body“onunload”事件上尝试使用javascript window.open()。 但浏览器一直阻止它。
无论如何要做到这一点?
谢谢你, 巢穴
答案 0 :(得分:2)
首先:这根本不是用户友好的。就像@Dagon说的那样,没有人希望限制离开页面然后显示出售的不同商品的垃圾邮件。话虽如此,我确信你有合理的理由,或者更确切地说是被告知这样做。所以这是我的答案---
使用onunload事件无法做到这一点。一旦该事件被触发,就没有机会重定向或取消卸载,因为它实际上是 卸载事件。
你最好的机会就是参加onbeforeunload活动。这是实际暂停onunload事件的唯一事件,也可以取消onunload执行。 onbeforeunload事件有两个不同的结果
您可能想尝试的一个想法(我从未尝试过这个)是尝试在onbeforeunload事件的return语句中添加一个超链接。再次,不知道这是否有效。
以下是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>
我知道您要创建警报或确认弹出窗口,但这也存在一些问题。典型的程序员无法访问onbeforeunload和onunload事件的源代码,因此没有人能够100%确定他们所做的一切。根据我的测试,我所知道的是,似乎不可能只出现一次自定义弹出窗口并执行其他代码。
如果用户正在关闭网页,捕获它的唯一方法是在onbeforeunload事件中。没有办法摆脱那个。如果用户使用后退按钮,那么也会在那里触发onbeforeunload事件。我知道你的最终目标是什么,但我有一个建议,如果允许的话。尝试锚定页面上的链接或按钮。如果拥有此弹出窗口是绝对必要的,那么唯一可靠的方法是将弹出窗口固定到您网页上的链接/按钮。但是当然这只有在他们试图使用您的链接(这会更加用户友好)导航时才有效,但如果他们尝试使用外部链接(如喜欢的链接或关闭浏览器)导航,那么它会不被执行。
祝你好运。 Onbeforeunload和onunload很棘手。
答案 1 :(得分:0)
在我的门户网站中也是如此,当用户关闭浏览器时,我需要一些时间来推迟重置某些数据。我在下面使用的代码,它适合我。 当用户关闭浏览,选项卡或尝试重定向到另一个页面时,将显示一条消息供用户选择停留或离开。
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();
});