开发者

window.onbeforeunload not working in chrome

This is the code which i used for window.onbeforeunload

<head>
<script>

    window.onbeforeunload = func;
    
    function func() 
    {
        var request = new XMLHttpRequest();
        request.open("POST", "exit.php", true); 
        request.onreadystatechange = stateChanged;
        request.send(null);
    }
    function stateChanged()
    {
        if (request.readyState == 4 || request.readyState == "complete")
            alert("Succes!");
    }
    </script>
</head>

this works with IE and M开发者_运维问答ozilla but does not work with Chrome..... please help...... thanks in advance.....


It seems that the only thing you can do with onbeforeunload in recent version of Chrome is to set the warning message.

window.onbeforeunload = function () {
    return "Are you sure";
};

Will work. Other code in the function seems to be ignored by Chrome


UPDATE: As of Chrome V51, the returned string will be ignored and a default message shown instead.


Know I'm late to this, but was scratching my head why my custom beforeunload message wasn't working in Chrome and was reading this. So in case anyone else does the same, Chrome from Version 51 onwards no longer supports custom messages on beforeunload. Apparently it's because the feature has been misused by various scams. Instead you get a predefined Chrome message which may or may not suit your purposes. More details at:

https://developers.google.com/web/updates/2016/04/chrome-51-deprecations?hl=en#remove-custom-messages-in-onbeforeload-dialogs

Personally do not think the message they've chosen is a great one as it mentions leaving the site and one of the most common legitimate uses for onbeforeunload is for dirty flag processing/checking on a web form so it's not a great wording as a lot of the time the user will still be on your site, just have clicked the cancel or reload button by mistake.


You should try this:

window.onbeforeunload = function(e) {
  e.returnValue = 'onbeforeunload';
  return 'onbeforeunload';
};

This works on latest Chrome. We had the same issue the e.returnValue with value of onbeforeunload solved my problem.

Your code should be like this:

    <head>
    <script>

    window.onbeforeunload = function(e) {
        e.returnValue = 'onbeforeunload';
        func();
        return ''onbeforeunload'';
    };

    function func() 
    {
        var request = new XMLHttpRequest();
        request.open("POST", "exit.php", true); 
        request.onreadystatechange = stateChanged;
        request.send(null);
    }
    function stateChanged()
    {
        if (request.readyState == 4 || request.readyState == "complete")
            alert("Succes!");
    }
    </script>
    </head>


Confirmed this behavior on chrome 21.0.1180.79

this seems to work with the same restritions as XSS, if you are refreshing the page or open a page on same domain+port the the script is executed, otherwise it will only be executed if you are returning a string (or similar) and a dialog will be shown asking the user if he wants to leans or stay in the page.

this is an incredible stupid thing to do, because onunload/onbeforeunload are not only used to ask/prevent page changes.

In my case i was using it too save some changes done during page edition and i dont want to prevent the user from changing the page (at least chrome should respect a returning true or change the page without the asking if the return is not a string), script running time restrictions would be enought.

This is specially annoying in chrome because onblur event is not sent to editing elements when unloading a page, chrome simply igores the curent page and jumps to another. So the only change of saving the changes was the unload process and it now can't be done without the STUPID question if the user wants to change it... of course he wants and I didnt want to prevent that...

hope chrome resolves this in a more elegant way soon.


Try this, it worked for me:

window.onbeforeunload = function(event) {
    event.returnValue = "Write something clever here..";
};


Try this. I've tried it and it works. Interesting but the Succes message doesn`t need confirmation like the other message.

window.onbeforeunload = function() 
{
    if ( window.XMLHttpRequest )
    {
        console.log("before"); //alert("before");
        var request = new XMLHttpRequest();
        request.open("POST", "exit.php", true); 
        request.onreadystatechange = function () {
            if ( request.readyState == 4 && request.status == 200 )
            {
                console.log("Succes!"); //alert("Succes!");
            }
        };
        request.send();
    }
}


None of the above worked for me. I was sending a message from the content script -> background script in the before unload event function. What did work was when I set persistent to true (in fact you can just remove the line altogether) in the manifest:

"background": {
    "scripts": [
        "background.js"
    ],
    "persistent": true
  },

The logic is explained at this SO question here.


Current versions of Chrome require setting the event's returnValue property. Simply returning a string from the event handler won't trigger the alert.

addEventListener('beforeunload', function(event) {
  event.returnValue = 'You have unsaved changes.';
});


I'm running Chrome on MacOS High Sierra and have an Angular 6 project whithin I handle the window.beforeunload an window.onbeforeunload events. You can do that, it's worked for me :

handleUnload(event) {
  // Chrome
  event.returnValue = true;
}

It show me an error when I try to put a string in event.returnValue, it want a boolean.


Don't know if it allows custom messages to display on the browser.

<script type="text/javascript">
    window.addEventListener("beforeunload", function(e) {
        e.preventDefault(); // firefox
        e.returnValue = ''; // Chrome
    });
</script>
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜