开发者

How to determine when a user is leaving a webpage (excluding certain links)

The situation: I have a Grails webpage with two tables. One table displays a persons information (including certain flags), and the second table has a list of flags with 开发者_Python百科an "add button" that allows the user to add a given flag to themselves.

Now, there is a save button that, when clicked, pushes the current "state" of the users flags to our database. So I want to be able to display a prompt if there is unsaved information being displayed when a user tries to navigate to another part of the site. This is easy enough by using an existing isDirty boolean that each flag stores. I can just loop through the persons active flags and check if it is dirty or not. If the person contains at least 1 dirty flag, I need to display a prompt if they try to leave, because that data won't be saved unless they explicitly hit the button.

The problem: There are many ways to navigate away from this page. I am using <body onbeforeunload="checkForDirtyFlags();">, where checkForDirtyFlags() is a basic js function to check for any dirty flags. But here's the thing - when a user adds or removes a flag, that causes a page reload because the way the page is setup is to redirect to a url like this:

"http://my.url/addFlag/123456"

The controller then knows to add the flag with id 123456 to the current person. This does NOT change where the person is in the website however, because the same page is still rendered (it just contains updated tables). So basically, when I see a URL with addFlag or removeFlag, I do not want to prompt the user if they are sure they want to navigate away from the page, because in the eyes of the user they are not leaving the page.

The question: Is there any way to determine what the target is during an onbeforeunload? So that I can have something like this in my javascript:

function checkForDirtyFlag() {
    if( justAdding ) { //We are just adding a flag. No prompt necessary
        //Don't do anything
    }
    else if( justRemoving ) { //We are just removing a flag. No prompt necessary
        //Don't do anything
    }
    else { // In this case, we want to prompt them to save before leaving
        alert('You have unsaved data on the page. Leaving now will lose that data. Are you sure you want to leave?');
    }
}

If any of this isn't clear, please let me know and I'll try and clear it up.

Thanks!


I don't think you can get the target location in unload event. What I'd do is bind the save/submit button to a function that disables the unload event if the button is pressed, therefore disabling the prompt. If the user tries to leave by pressing back etc, the unload event would fire.


Why don't you push the changes immediately to the database, without them having to press the Save Button, or store them in a temporary database so that they do not lose their unsaved changes when the navigate to a different part of the site.


I'm not quite sure if I get you right - but you actually wrote the solution already down there. Why don't you just return a string-message from within an onbeforeunload when necessary ?

For instance:

window.onbeforeunload = function() {
    if( justAdding ) { //We are just adding a flag. No prompt necessary
        //Don't do anything
    }
    else if( justRemoving ) { //We are just removing a flag. No prompt necessary
        //Don't do anything
    }
    else { // In this case, we want to prompt them to save before leaving
        return 'You have unsaved data on the page. Leaving now will lose that data. Are you sure you want to leave?';
    }
};

If you return a string value from that event, the browser will take care of a modal dialog window which shows up. Otherwise nothing happens.

0

上一篇:

下一篇:

精彩评论

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

最新问答

问答排行榜