Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 浏览器关闭时显示弹出窗口_Php_Javascript_Popup_Onunload - Fatal编程技术网

Php 浏览器关闭时显示弹出窗口

Php 浏览器关闭时显示弹出窗口,php,javascript,popup,onunload,Php,Javascript,Popup,Onunload,我正在开发一个电子商务(PHP)网站,以下是我的要求 一旦客户离开订单页面或关闭浏览器, 我想提供另一种带有弹出框或警告框的产品。 如果他们选择“是”,它将重定向到另一个产品页面 而不是关闭窗口 我尝试在主体“onunload”事件上使用javascript window.open()。 但是浏览器一直在阻止它 有没有办法做到这一点 谢谢,, Den在我的门户中也是一样,当用户关闭浏览器时,我需要一些时间来推迟重置一些数据。下面是我使用的代码,它适合我。 当用户关闭浏览、选项卡或尝试重定向到其他

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

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

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

有没有办法做到这一点

谢谢,,
Den

在我的门户中也是一样,当用户关闭浏览器时,我需要一些时间来推迟重置一些数据。下面是我使用的代码,它适合我。 当用户关闭浏览、选项卡或尝试重定向到其他页面时,将显示一条消息,供用户选择停留或离开

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();
});

首先:这根本不是用户友好的。正如@Dagon所说,没有人希望被限制离开页面,然后显示不同商品的垃圾邮件。说到这里,我相信你有一个正当的理由,或者更确切地说,你被告知要这么做。这就是我的答案---

对于onunload事件,无法做到这一点。一旦触发该事件,就没有机会重定向或取消卸载,因为它实际上在卸载事件上

执行此操作的最佳机会是onbeforeunload事件。这是唯一一个实际暂停onunload事件的事件,也可以取消onunload的执行。onbeforeunload事件有两种不同的结果

  • 如果您在onbeforeunload事件中返回了一些内容,那么当用户尝试导航离开时,将出现一个默认对话框,其中包含您的文本。用户可以点击OK或Cancel。如果单击“确定”,浏览器将继续导航。如果用户点击Cancel,那么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>
//对于您的代码可能不是必需的
window.onbeforeunload=before;
window.onunload=after;
前功能(evt)
{
return“这将与其他默认文本一起出现在对话框中”;
//如果return语句不在这里,其他代码可以静默执行(没有弹出窗口)
}
后功能(evt)
{
//此事件触发太快,应用程序无法在浏览器卸载之前执行
}
我知道您想创建一个警报或确认弹出窗口,但这也有一些问题。典型的程序员无法访问onbeforeunload和onunload事件的源代码,因此没有人100%确定他们所做的一切。从测试中我知道,定制弹出窗口似乎不可能只出现一次,也不可能同时出现执行其他代码

如果用户关闭网页,唯一的捕获方式是onbeforeunload事件。没有办法。如果用户使用“后退”按钮,onbeforeunload事件也会在那里触发。我知道你的最终目标是什么,但我有一个建议,如果允许的话,当然。尝试在你的页面上锚定链接或按钮。如果是绝对的有了这个弹出窗口是非常必要的,唯一可靠的方法是将弹出窗口锚定到网页上的链接/按钮上。当然,这只有在他们试图使用你的链接(这会更方便用户)导航时才有效,但如果他们试图使用外部链接导航时才有效(如收藏夹链接或关闭浏览器)则不会执行


祝您好运。Onbeforeunload和onunload都很棘手。

如果
e.preventDefault()
window.event.returnValue=false
没有帮助,那么就没有办法进行自定义模式对话框…很多浏览器都会阻止
window.open()
s弹出窗口,因此有更好的方法(IMO)使用javascript+css创建人工弹出窗口,而不是使用
window.open()
。使用js的警报/确认功能使用
confirm()
-这必须根据规范进行阻止。我不会成为一家商店的客户,这种商店会以这种方式困扰我
somevalue=confirm(文本,默认);如果(somevalue){redirect}