4

私は Wicket を初めて使用し、Functionkey が押された場合に Javacode を呼び出す ajax 動作を作成したいと考えています。

私の考えは、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 コールバックが実行されるということですか?

4

2 に答える 2

7

osmdamvは、私の問題の「Wicketsolution」を見つけるためのヒントを教えてくれます。これが、キープレスをキャッチし、特定の場合にのみajaxrequestをwicketserverに送信するための私のコードです。

この例では、他のユーザーがこのコードをニーズに合わせて調整できるはずです。

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(true)を挿入します。これで正しく動作します。

于 2013-01-22T22:09:15.257 に答える
0

デコレータを使用して AjaxEventBehavior を使用する必要があります

  @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);

}

于 2013-01-22T00:18:44.627 に答える