Janela Modal Wicket: clique fora do modal para dispensar
-
27-10-2019 - |
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.
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
.