对于一个新项目,我们使用一个复杂的外部JavaScript库,需要一些参数进行初始化。此参数值仅在运行时已知,因此我们希望构建某种AJAX机制,以便JavaScript在需要时加载参数。
我尝试通过以下机制实现这一目标:
PageThatContainsTheJavaScript.java
public GraphPanel(String id) {
add(new AbstractDefaultAjaxBehavior() {
protected void respond(final AjaxRequestTarget target) {
final RequestCycle requestCycle = RequestCycle.get();
TextRequestHandler textRequestHandler = new TextRequestHandler("text/plain", "UTF-8", content.toString()); //content - the parameter value
requestCycle.scheduleRequestHandlerAfterCurrent(textRequestHandler);
}
});
add(new Label("ajaxtest", ""));
}
@Override
protected void onBeforeRender() {
super.onBeforeRender();
String callbackUrl = behave.getCallbackUrl().toString();
String callbackFunction = String.format("Wicket.Ajax.get({'u':'%s'});",callbackUrl);
replace(new Label("ajaxtest", callbackFunction));
}
标签“ajaxtest”只是一种方便地访问生成的回调网址以进行测试的方法。
PageThatContainsTheJavaScript.html
function externalApplicationStart() {
var parameter = Wicket.Ajax.get({'u':"'"+document.getElementById('ajaxtest').innerHTML+"'"});
var application = new demo.yfiles.layout.modules.LayoutModulesDemo(parameter);
// arbitrary init code
application.start();
});
我没有找到关于这个问题的非常好的教程,所以有可能,这次尝试有问题,虽然我猜这总体方向是正确的。
我的问题是,只要存在Wicket.ajax.get行,JavaScript函数就会挂起。当我对该行进行注释并传递硬编码的默认参数时,应用程序将启动。 我做错了什么,如何从Wicket获取String参数到JavaScript函数?
我发现一个功能性解决方案是将参数值作为隐藏HTML标记的内容(如<span id='...' style='display:none;'>parameterValue</span>
)传递,但将来可能需要将更长的值传递给JavaScript(如XML内容)并且我不想将生成的HTML与所有那些非内容值混淆。
//编辑:生成的ajaxtest-HTML-Tag如下所示:
<span wicket:id="ajaxtest" id="ajaxtest">
Wicket.Ajax.get({'u':'./.?0-1.IBehaviorListener.0-graphContainer-graphControl'});
</span>
尝试在控制台中执行Wicket.Ajax.get({'u':'./.?0-1.IBehaviorListener.0-graphContainer-graphControl'});
只会产生undefined
。
此外,我不确定网址中的第二个点来自哪个(./.?0
...),但尝试使用./?0
...会产生相同的结果。
答案 0 :(得分:2)
在你的GraphPanel
我会覆盖renderHead()
并在那里初始化你的参数,alson就像这样启动你的JS组件:
@Override
public void renderHead(IHeaderResponse response) {
super.renderHead(response);
response.render(OnDomReadyHeaderItem.forScript("var parameter = 'aaa';"));
response.render(OnDomReadyHeaderItem.forScript("externalApplicationStart();"));
}
我脑海中的一个完整解决方案是renderHead还会加载你的js lib和一个包含控制你的js lib的函数的js文件。像这样:
@Override
public void renderHead(IHeaderResponse response) {
super.renderHead(response);
response.render(OnDomReadyHeaderItem.forScript("var parameter = 'aaa';"));
response.render(JavaScriptReferenceHeaderItem.forReference(yourJsLibResourceReference));
response.render(JavaScriptReferenceHeaderItem.forReference(yourJsToControlTheJsLib));
response.render(OnDomReadyHeaderItem.forScript("externalApplicationStart();"));
}
答案 1 :(得分:0)
您可以将自定义javascript事件添加到HTML元素中,然后通过触发器查看http://www.w3schools.com/jquery/event_trigger.asp或使用jQuery从您的javascript调用它。