检测浏览器/选项卡关闭

时间:2014-01-07 14:36:48

标签: javascript jquery

我知道如果他们试图离开当前页面向用户显示警报,询问他们是否确定他们是否愿意这样做但是我想知道是否有办法只显示此警报窗口/标签正在关闭? 我希望仅在关闭窗口或标签时显示确认信息,而不是在用户点击链接时显示。

5 个答案:

答案 0 :(得分:2)

不可能。

唯一关闭的是onbeforeunload事件,但关闭的窗口/标签或导航到另一个页面之间没有区别(对于javascript)。

随访:

假设你可以将点击处理程序附加到页面上的每个锚点并使用“脏”标志,但这确实是黑客攻击。类似的东西(原谅我,但为了简单起见使用jquery):

(function(){
  var closingWindow = true;
  $('a').on('click', function(){
    if (this.href == /* on-domain link */){
      closingWindow = false;
    }
  });
  $(window).on('beforeunload',function(){
    if (closingWindow){
      // your alert
    }
  });
})();

但那就差不多了。 注意:如果其他javascript函数使用window.location等,则无效。

答案 1 :(得分:0)

此解决方案在Violentmonkey的Firefox中对我有效。
像所有window.onbeforeunload一样使用它,并检查是否按下了鼠标左键。因此,如果按下该按钮,则意味着单击可用空间或打开链接-而不是关闭标签。

    function DetectBrowserExit()
{
  if (butpres == 0)  {
   //your action before closing tab, alert not showing
  }
}

window.onbeforeunload = function(){ DetectBrowserExit(); }

// the key is pressed, then when window.onbeforeunload - link is opening, so, tab not closing 

        document.addEventListener('mousedown',function(e){
            if (e.which == 1) { //1-lbutton 2-mb 3-rb
                //e.preventDefault();
        butpres = 1
        setTimeout(function() {
          butpres = 0 //if after 3 seconds the script still works then the link has not been clicked, clear the click and continue to catch new clicks 

          //alert(butpres);
          }, 3000); //Two seconds will elapse and Code will execute.
         //alert(butpres);
                //command_lock();
            }
        },false);

答案 2 :(得分:0)

做这样的事情怎么样?

  1. 将全局变量设置为false(即var hasCLickedLink = false;

  2. 在所有链接(<a>)上,附加一个事件处理程序,将变量设置为true

  3. onbeforeunload上,检查变量的值以查看是否已点击链接。如果它仍然是false,那么他们没有点击链接,请给他们提醒。

答案 3 :(得分:0)

您需要明确指定您不想显示确认对话框的events

var validNavigation = 0;

function bindDOMEvents() {
    // Attach the event keypress to exclude the F5 refresh
    $(document).keydown(function(e)
    {
        var key = e.which || e.keyCode;
        if (key == 116)
        {
            validNavigation = 1;
        };
    });
    // Attach the event click for all links in the page
    $("a").bind("click", function()
    {
        validNavigation = 1;
    });
    // Attach the event submit for all forms in the page
    $("form").bind("submit", function()
    {
        validNavigation = 1;
    });
    // Attach the event click for all inputs in the page
    $("input[type=submit]").bind("click", function()
    {
        validNavigation = 1;
    });
};
$(document).ready(function()
{
    bindDOMEvents();
    window.onbeforeunload = function () {
        console.log(validNavigation);
        if (validNavigation == '1')
        {
            console.log("No Alert.. Continue");
        }
        else
        {
            return false;
        }
    };
});

答案 4 :(得分:0)

你无法区分这两者。

在浏览器卸载其资源之前立即触发

window.onbeforeunload。你不知道卸载的原因,只是它即将发生:

来自MDN

  

当窗口即将unload其资源时触发的事件。   该文档仍然可见,event is still cancelable