2011-06-13 112 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設置,則情況可能不是這種情況。