我想能夠關閉一個ModalWindow當用戶按下一個鍵,在我的情況下ESC。關閉ModalWindow按鍵
我有一個Javascript監聽其通話取消按鈕的ID的單擊事件的按鍵:
jQuery("#"+modalWindowInfo.closeButtonId).click();
這是做了正確的方法是什麼?
我想知道,因爲它在Chrome中工作,但不是在FF中,但它可能是由於我的具體實施。
我想能夠關閉一個ModalWindow當用戶按下一個鍵,在我的情況下ESC。關閉ModalWindow按鍵
我有一個Javascript監聽其通話取消按鈕的ID的單擊事件的按鍵:
jQuery("#"+modalWindowInfo.closeButtonId).click();
這是做了正確的方法是什麼?
我想知道,因爲它在Chrome中工作,但不是在FF中,但它可能是由於我的具體實施。
「正確」的方法是調用服務器,然後用響應關閉它。你可以利用AJAX行爲做到這一點:
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>
上面的例子是好,非常好,但是有一個問題,它可能是對於一些編程用戶(對我來說)是至關重要的。
對於實際接近發生的情況,有2個Ajax請求發生 - 第一個發出CloseOnESCBehavior
,它調用window.close
。 MW.close()將呈現JavaScript,它首先會調用服務器以詢問其windowClosedCallback
,並且只會然後關閉(隱藏內容)模式窗口。
我建議不要做這樣的事情 - 在ModalWindow構造函數的代碼:
add(new AbstractBehavior() {
@Override
public void renderHead(IHeaderResponse response) {
response.renderOnDomReadyJavascript(
" if($(document).data('wicketWindowCloseBound')) {return;} "
+ " $(document).data('wicketWindowCloseBound', true); "
+ " $(document).bind('keyup', function(evt) {\n"
+ " if (evt.keyCode == 27) {\n"
+ getCloseJavacript()
+ "\n"
+ " evt.preventDefault();\n"
+ " evt.stopPropagation();\n"
+ " }\n"
+ " });\n");
}
});
此外,您還可以使用Wicket Jquery UI
HTML
<div wicket:id="dialog">[dialog]</div>
的Java
MessageDialog dialog = new MessageDialog("dialog", "Warning", "Is it ok?",
DialogButtons.OK_CANCEL, DialogIcon.WARN)
{
protected void onClose(AjaxRequestTarget target, DialogButton button)
{
if(button != null && button.equals(LBL_OK))
{
//do something here
//note1: #equals() compare either DialogButton or String (button text)
//note2: predefined button text are:
//LBL_OK, LBL_CANCEL, LBL_YES, LBL_NO, LBL_CLOSE, LBL_SUBMIT
}
}
}
this.add(dialog); //TODO: open it, using dialog.open(target);
而ESC鍵正常工作。你應該看到這個問題在Wicket JQuery UI demo page
這似乎是一個更簡潔的方式 - 謝謝!我已經實現了一個解決方案的版本(我說「版本」是因爲我的實現必須與多個ModalWindows一起工作,所以在JS中我保留了一個打開的窗口列表,以便連續按下ESC關閉下一個模式窗口) Chrome,但在FF中,我仍然在http請求旁邊的Firebug中「中止」。我在modal.close()上放置了一個斷點,它被觸發,但Firebug已經報告請求被中止。 – SlappyTheFish 2011-02-22 15:23:39