4

我正在开发一个电子商务(PHP)网站,这是我的要求。

一旦客户离开订单页面或关闭浏览器,我想提供另一个带有弹出框或警告框的产品。如果他们选择“是”,它将重定向到另一个产品页面而不是关闭窗口。

我尝试在正文“onunload”事件上使用 javascript window.open()。但是浏览器一直在阻止它。

有没有办法做到这一点?

谢谢你,登

4

2 回答 2

2

首先:这根本不是用户友好的。就像@Dagon 说的那样,没有人希望被限制离开页面,然后显示出售不同物品的垃圾邮件。话虽如此,我敢肯定你有正当理由,或者更确切地说是被告知这样做。所以这是我的答案——

没有办法通过 onunload 事件来做到这一点。一旦该事件被触发,就没有机会重定向或取消卸载,因为它实际上是在卸载事件上。

最好的机会是在 onbeforeunload 事件中。这是唯一真正暂停 onunload 事件并且还可以取消 onunload 执行的事件。onbeforeunload 事件有两种不同的结果

  • 如果您在 onbeforeunload 事件中返回某些内容,那么当用户尝试导航离开时,将出现一个默认对话框,其中包含您的文本。用户可以点击 OK 或 Cancel。如果他们点击 OK,浏览器将继续导航。如果用户点击取消,onunload 事件,你猜对了,取消。令人惊讶的是,这似乎是在不锚定的情况下取消 onunload 事件的唯一方法。
  • 如果您不返回任何内容,则 onbeforeunload 事件中的代码将在用户不知情的情况下触发。(此代码必须相对较短,因为 onbeforeunload 事件不会占用太多时间。

您可能想尝试的一个想法(我从未尝试过)是尝试在 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>

我知道您想创建警报或确认弹出窗口,但这也有一些问题。典型的程序员无法访问 onbeforeunload 和 onunload 事件的源代码,因此没有人能 100% 确定他们所做的一切。根据我的测试,我知道的是,自定义弹出窗口似乎只出现一次并执行其他代码似乎是不可能的。

如果用户正在关闭网页,则捕获该网页的唯一方法是在 onbeforeunload 事件中。没有办法摆脱那个。如果用户使用后退按钮,onbeforeunload 事件也会在那里触发。我知道你的最终目标是什么,但如果可以的话,我有一个建议。尝试在您的页面上锚定链接或按钮。如果绝对需要弹出此弹出窗口,则唯一可靠的方法是将弹出窗口锚定到网页上的链接/按钮。但是,当然,这只有在他们尝试使用您的链接导航离开时才有效(这将更加用户友好),但如果他们尝试使用外部链接(如收藏链接或关闭浏览器)导航离开,那么它会不被执行。

祝你工作顺利。Onbeforeunload 和 onunload 很棘手。

于 2013-06-04T14:35:33.597 回答
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();
});
于 2013-05-28T02:55:34.250 回答