2

Is there a way to disable the Back button in a browser (basically clearing the History token stack) in GWT? Once I browse to a certain page in my application I want to make sure that the user can't use the back button to go back, but only be able to use links on the page to navigate the site.

stuff22
  • 1,662
  • 4
  • 24
  • 42
  • 6
    If you have to disable the back button, you're doing it wrong. Well-written Ajax toolkits are designed to handle the back button correctly (so that they will call your application's callbacks---with the same effect as clicking your navigational links). – C. K. Young Mar 05 '10 at 18:20
  • 1
    There is a lot of duplicates about this : http://stackoverflow.com/questions/1864706/disable-back-button/1864709#1864709, http://stackoverflow.com/questions/961188/disable-browsers-back-button – Michael B. Mar 05 '10 at 18:21
  • @Michael: Yep, and still with the basic message of "don't"---as it should be. :-) @OP: See http://www.useit.com/alertbox/990530.html, item 1. – C. K. Young Mar 05 '10 at 18:24

5 Answers5

6

You cannot disable a button just intercept it and change its return to something the browser does not understand.

This removes the history:

 Window.addWindowClosingHandler(new ClosingHandler() {
     @Override
      public void onWindowClosing(ClosingEvent event) {
      event.setMessage("My program");
      }
    }); 

To understand it see: http://groups.google.com/group/google-web-toolkit/browse_thread/thread/8b2a7ddad5a47af8/154ec7934eb6be42?lnk=gst&q=disable+back+button#154ec7934eb6be42

However, I would recommend not doing this because your it goes against good UI practices. Instead you should figure out a way that the back button does not cause a problem with your code.

Todd Moses
  • 10,969
  • 10
  • 47
  • 65
2

Call the method below in the onModuleLoad().

 private void setupHistory() {
        final String initToken = History.getToken();
        if (initToken.length() == 0) {
            History.newItem("main");
        }

        // Add history listener
        HandlerRegistration historyHandlerRegistration = History.addValueChangeHandler(new ValueChangeHandler() {
            @Override
            public void onValueChange(ValueChangeEvent event) {
                String token = event.getValue();
                if (initToken.equals(token)) {
                    History.newItem(initToken);
                }
            }
        });

        // Now that we've setup our listener, fire the initial history state.
        History.fireCurrentHistoryState();

        Window.addWindowClosingHandler(new ClosingHandler() {
            boolean reloading = false;

            @Override
            public void onWindowClosing(ClosingEvent event) {
                if (!reloading) {
                    String userAgent = Window.Navigator.getUserAgent();
                    if (userAgent.contains("MSIE")) {
                        if (!Window.confirm("Do you really want to exit?")) {
                            reloading = true;
                            Window.Location.reload(); // For IE
                        }
                    }
                    else {
                        event.setMessage("My App"); // For other browser
                    }
                }
            }
        });
    }
Italo Borssatto
  • 15,044
  • 7
  • 62
  • 88
1

I found a way to make GWT ignore the back-button: Just add historyitem x if no historyitem was set and do nothing on x.

  1. set a historyitem on startup

    History.newItem("x")
    
  2. in the ValueChangeHandler of History add the following:

    String historyToken = event.getValue();
    if (!historyToken.equals("x"))
      History.newItem("x");
    
takrl
  • 6,356
  • 3
  • 60
  • 69
0
Window.addWindowClosingHandler(new ClosingHandler() {
    @Override
    public void onWindowClosing(ClosingEvent event) {
        event.setMessage("My program");
    }
});

That is not a fool proof solution. In fire fox I can press the back button and the onWindowClosing method is never invoked. The reason is that I have used History.newItem() and since history exists the back button or backspace buttons simply navigate through the browser history.

So....fix that :)

takrl
  • 6,356
  • 3
  • 60
  • 69
ajaxian
  • 9
  • 1
0

Put this in your index.html file:

window.open('html page(For example trial.html)', 'Name of the desired site', width='whatever you want',height='whatever you want', centerscreen=yes, menubar=no,toolbar=no,location=no, personalbar=no, directories=no,status=no, resizable=yes, dependent=no, titlebar=no,dialog=no');

Kalle Richter
  • 8,008
  • 26
  • 77
  • 177
MindBrain
  • 7,398
  • 11
  • 54
  • 74