0

我正在尝试从 JavaScript 调用 Wicket 组件的方法,并从该方法接收一个值,我想在我用来调用该组件的 JavaScript 函数的剩余位中使用该值。但是,我似乎只能调用 Wicket 组件而不等待它产生结果。

更明确地说,我想实现一个AbstractDefaultAjaxBehavior允许我在用户离开页面时有条件地警告用户。这个条件现在是通过某种OuterClass.shouldWarn方法来确定的。但是,即使在下面的示例中调用了此方法,我似乎既无法等待此方法的结果,也无法返回某种结果。相反,JavaScript 只是继续并发执行 Java 方法调用。

我希望下面的(未正确运行)示例能澄清我的问题:

 class PageExitWarningBehavior extends AbstractDefaultAjaxBehavior {

        @Override
        protected void respond(AjaxRequestTarget target) {
            target.appendJavaScript("return " + 
                (OuterClass.this.shouldWarn() ? "false" : "true"));
        }

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

            String callbackFunktion = String.format(
                    "Wicket.Event.add(window, 'beforeunload', function( e ) {%n"
                          + "if( e ) { e.returnValue = '%s'; }%n"
                          + "var attrs = { 'u': '%s', 'c': '%s', 'ep': { } };%n"
                          + "Wicket.Ajax.get( attrs );%n"
                          + "return false;%n;"
                          + "});",
                    this.getCallbackUrl(),
                    OuterClass.this.getMarkupId());

            response.render(JavaScriptHeaderItem.forScript(callbackFunktion, 
                 "remind-of-running-task"));
        }

    }
4

1 回答 1

1

我相信有一种比实现自己的 AjaxBehavior 更简单的方法来拦截页面退出事件:

尝试实现以下行为:

public class PageExitWarningBehavior extends Behavior {

  private boolean shouldWarn = false;

  @Override
  public void renderHead(Component component, IHeaderResponse response) {
    super.renderHead(component, response);
    if (shouldWarn) {
      response.render(new OnDomReadyHeaderItem("window.onbeforeunload = function (e) {"
    + "var message = 'Your confirmation message goes here.'," 
        + "e = e || window.event;" + "if (e) {"
    + "e.returnValue = message;" + "}" + "return message;" + "};"));
    }
  }

  @Override
  public void onEvent(Component component, IEvent<?> event) {
    super.onEvent(component, event);
    if (event.getPayload() instanceof PageExitWarningEvent) {
      PageExitWarningEvent exitEvent = (PageExitWarningEvent) event.getPayload();
    this.shouldWarn = exitEvent.isPageExitWarningEnabled();
    }
  }
}

在 renderHead 方法中,您有条件地添加一个简单的 javascript,它会触发浏览器在离开页面时显示确认对话框(javascript 代码来自这篇文章)。

在 onEvent 方法中,我们监听其他 Wicket 组件是否发送了 PageExitWarningEvent 来通知我们应该显示警告。您可以从任何 Wicket 组件(例如链接或按钮)发送此类事件,如下所示:

send(HomePage.this, Broadcast.BREADTH, new PageExitWarningEvent(true));

PageExitWarningEvent 类如下所示:

public class PageExitWarningEvent {

  private boolean pageExitWarningEnabled = false;

  public PageExitWarningEvent(boolean pageExitWarningEnabled) {
    this.setPageExitWarningEnabled(pageExitWarningEnabled);
  }

  public boolean isPageExitWarningEnabled() {
    return pageExitWarningEnabled;
  }

  public void setPageExitWarningEnabled(boolean pageExitWarningEnabled) {
    this.pageExitWarningEnabled = pageExitWarningEnabled;
  }

}

让我知道这是否符合您的要求。

于 2013-05-13T22:11:52.837 回答