2011-06-13 136 views
1

我需要添加一个行为到ModalWindow,这样当用户在模态外点击时,如果满足某个条件(在我的respond()方法中检查服务器端),模态是驳回。Wicket ModalWindow:点击外部模态关闭

我试着根据this answer执行某些操作。问题是,我不能将一个点击监听器附加到模态窗口div,因为它没有添加到DOM,直到显示模态(示例将keyup附加到文档本身。)

我想扩展ModalWindow并通过getShowJavascript()添加JS,但是我没有任何方法将它连接到测试的AbstractDefaultAjaxBehavior.respond()方法。

回答

2

我解决了这个问题,通过添加行为不是模式,而是通过ModalWindow.setContent()添加到模式的小部件。当我的小部件被添加到模式中时,mask div存在于DOM中,然后我可以成功连接一个click处理程序。

机智:

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"); 
    } 
} 

请注意,我有点摇摇欲坠取决于有一个名为“检票面罩黑暗”类的模态窗口的面具;如果您更改ModalWindow使用的CSS设置,则情况可能不是这种情况。