Search code examples
javawicketkeypressmodal-window

Close ModalWindow on keypress


I would like to be able to close a ModalWindow when the user presses a key, in my case ESC.

I have a Javascript listener for the keypress which calls the click event of the cancel button's ID:

jQuery("#"+modalWindowInfo.closeButtonId).click();

Is this the correct way to do it?

I am wondering because it works in Chrome but not in FF, but it could be due my specific implementation.


Solution

  • The 'right' way to do it is to call the server, then close it with the response. You can do this with an ajax behavior:

    ModalTestPage.java

    public class ModalTestPage extends WebPage {
        public ModalTestPage(PageParameters parameters) {
            super(parameters);
    
            final ModalWindow modal = new ModalWindow("modal");
            modal.setContent(new Fragment(modal.getContentId(), "window", this));
            add(modal);
    
            add(new AjaxLink<Void>("link") {
                @Override
                public void onClick(AjaxRequestTarget target) {
                    modal.show(target);
                }
            });
    
            add(new CloseOnESCBehavior(modal));
        }
    
        private static class CloseOnESCBehavior extends AbstractDefaultAjaxBehavior {
            private final ModalWindow modal;
            public CloseOnESCBehavior(ModalWindow modal) {
                this.modal = modal;
            }    
            @Override
            protected void respond(AjaxRequestTarget target) {
                modal.close(target);
            }    
            @Override
            public void renderHead(Component component, IHeaderResponse response) {
                response.renderJavaScriptReference("https://ajax.googleapis.com/ajax/libs/jquery/1.5.0/jquery.min.js");
                response.renderJavaScript("" +
                    "$(document).ready(function() {\n" +
                    "  $(document).bind('keyup', function(evt) {\n" +
                    "    if (evt.keyCode == 27) {\n" +
                    getCallbackScript() + "\n" +
                    "        evt.preventDefault();\n" +
                    "    }\n" +
                    "  });\n" +
                    "});", "closeModal");
            }
        }
    }
    

    ModalTestPage.html

    <html xmlns:wicket="http://wicket.apache.org">
    <head>
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    </head>
    <body>
    
      <a wicket:id="link">SHOW</a>
      <div wicket:id="modal"></div>
    
    <wicket:fragment wicket:id="window">
      Press ESC to dismiss
    </wicket:fragment>
    </body>
    </html>