2013-01-21 46 views
4

我是Wicket的新手,如果按下某個功能鍵,我想創建一個調用Java代碼的ajax行爲。Wicket Ajax Keyevent

我的想法是創建一個行爲,發送一些Javascript到瀏覽器,只有F鍵導致ajax回調。

public class HomePage extends WebPage { 
public HomePage(final PageParameters parameters) { 
    super(parameters); 

    add(new AbstractDefaultAjaxBehavior(){ 

     @Override 
     protected void respond(AjaxRequestTarget target) { 
      //retrieve the Parametervalue from request 
      final Request request = RequestCycle.get().getRequest(); 
      final String jsKeycode = request.getRequestParameters() 
          .getParameterValue("keycode").toString(""); 

      //test output 
      target.appendJavaScript("alert('from wicket ajax. you pressed "+jsKeycode+"')"); 
     } 

     @Override 
     public void renderHead(Component component, IHeaderResponse response) { 
      super.renderHead(component, response); 

      //Append JavaScriptcode 
      response.render(OnDomReadyHeaderItem.forScript(
        "\n\n" + 
        "$(document).keydown(" + 
         "function(event){\n" + //120, 121 Example for F9 and F10 
          "if((event.keyCode == 120) || (event.keyCode == 121)){\n" + 
           "event.preventDefault();\n" + 
           "window.alert('F-Key pressed');\n" + 
           //perform ajax-callback with keyCode 
          "}\n" + 
         "});\n")); 
     } 
    }); 

現在我的問題是: 我要什麼代碼,即一個ajax回調將與按下的鍵碼作爲參數來執行?

回答

0

你應該使用decorators

@Override 
    protected void updateAjaxAttributes(AjaxRequestAttributes attributes) 
    { 
     super.updateAjaxAttributes(AjaxRequestAttributes attributes); 

     IAjaxCallListener listener = new IAjaxCallListener() 
     { 
     @Override 
     public CharSequence getBeforeHandler(Component c) { return handler; } 
     ..... 
    }; 

    attributes.getAjaxCallListeners().add(listener); 

}

7

osmdamv給我的提示找到 「Wicketsolution」 我的問題使用AjaxEventBehavior。現在這裏是我的代碼來捕捉按鍵,並只在某些情況下發送給wicketserver的ajaxrequest。

在這個例子中,其他用戶應該可以根據他們的需要來調整這些代碼。

public HomePage(final PageParameters parameters) { 
    super(parameters); 

    add(new AjaxEventBehavior("keydown"){ 
     @Override 
     protected void updateAjaxAttributes(AjaxRequestAttributes attributes) { 
      super.updateAjaxAttributes(attributes); 

      IAjaxCallListener listener = new AjaxCallListener(){ 
       @Override 
       public CharSequence getPrecondition(Component component) { 
        //this javascript code evaluates wether an ajaxcall is necessary. 
        //Here only by keyocdes for F9 and F10 
        return "var keycode = Wicket.Event.keyCode(attrs.event);" + 
          "if ((keycode == 120) || (keycode == 121))" + 
          " return true;" + 
          "else" + 
          " return false;"; 
       } 
      }; 
      attributes.getAjaxCallListeners().add(listener); 

      //Append the pressed keycode to the ajaxrequest 
      attributes.getDynamicExtraParameters() 
       .add("var eventKeycode = Wicket.Event.keyCode(attrs.event);" + 
        "return {keycode: eventKeycode};"); 

      //whithout setting, no keyboard events will reach any inputfield 
      attributes.setAllowDefault(true); 
     } 

     @Override 
     protected void onEvent(AjaxRequestTarget target) { 
      //Extract the keycode parameter from RequestCycle 
      final Request request = RequestCycle.get().getRequest(); 
      final String jsKeycode = request.getRequestParameters() 
          .getParameterValue("keycode").toString(""); 

      target.appendJavaScript("alert('from wicket ajax. you pressed "+jsKeycode+"')"); 
     } 
}); 

編輯:

我插入attributes.setAllowDefault(真)。現在它工作正確。