Pergunta

Preciso adicionar um comportamento a ModalWindow de forma que, quando um usuário clicar fora do modal, se uma determinada condição for atendida (verificado no lado do servidor em meu método respond()), o modal será dispensado.

Tentei implementar algo com base esta resposta .O problema é que não consigo anexar um ouvinte de clique à janela modal div porque ele não é adicionado ao DOM até que o modal seja mostrado (o exemplo anexa um keyup ao próprio documento).

Pensei em estender ModalWindow e adicionar o JS por meio de getShowJavascript(), mas não tenho nenhum meio de conectá-lo a um método AbstractDefaultAjaxBehavior.respond() para o teste.

Foi útil?

Solução

Resolvi isso adicionando o comportamento não ao modal, mas ao widget que adicionei ao modal via ModalWindow.setContent().Quando meu widget é adicionado ao modal, a máscara div está presente no DOM e posso anexar com êxito um manipulador de cliques.

A saber:

public static class CloseModalOnOutsideClickBehavior extends AbstractDefaultAjaxBehavior
{
    private final ModalWindow modal;

    public CloseModalOnOutsideClickBehavior(ModalWindow modal)
    {
        this.modal = modal;
    }

    @Override
    protected void respond(AjaxRequestTarget target)
    {
        if (myConditionIsMet()) modal.close(target);
    }

    @Override
    public void renderHead(IHeaderResponse response)
    {
        response.renderJavascriptReference("http://ajax.googleapis.com/ajax/libs/jquery/1.5.2/jquery.min.js");
        response.renderJavascript("" +
                "$(document).ready(function() {\n" +
                "  $('div.wicket-mask-dark').bind('click', function(evt) {\n" +
                        getCallbackScript() + "\n" +
                "        evt.preventDefault();\n" +
                "  });\n" +
                "});", "closeModal");
    }
}

Observe que estou um tanto precariamente dependendo da máscara da janela modal ter uma classe chamada "wicket-mask-dark";pode não ser o caso se você alterar as configurações CSS usadas por ModalWindow.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top