从Wicket调用Javascript函数
我想将html中javascript代码块的输出传递给相应的wicket组件。我尝试了抽象的行为,但似乎不起作用 以下是我的工作内容: HTML 请问我做错了什么?谢谢 更新从Wicket调用Javascript函数,java,wicket,Java,Wicket,我想将html中javascript代码块的输出传递给相应的wicket组件。我尝试了抽象的行为,但似乎不起作用 以下是我的工作内容: HTML 请问我做错了什么?谢谢 更新 我将把一系列变量从wicket传递给JS,以便使用wicket组件显示每个javascript输出。我刚刚意识到,我必须使用dom就绪状态来开始交互。那很好。但是我仍然对wicket组件如何改变状态以接收来自javascript的更新响应感到困惑和不解。是否有一个wicket组件可以异步触发自身?您这样做是错误的,因为您在
我将把一系列变量从wicket传递给JS,以便使用wicket组件显示每个javascript输出。我刚刚意识到,我必须使用dom就绪状态来开始交互。那很好。但是我仍然对wicket组件如何改变状态以接收来自javascript的更新响应感到困惑和不解。是否有一个wicket组件可以异步触发自身?您这样做是错误的,因为您在
部分设置了wicket:id
,因此,wicket将用标签的内容(javascript函数调用)替换它。您的javascript函数永远不可用,因为它从未发送到客户端。做你想做的事情的“好”方法是从你的脚本标记中删除wicket:id
,并在你的行为中使用特殊的方法target.appendJavascript(“initChannel();”)代码>(或prependJavascript
),而不是在标签上玩转义
请注意,如果您从未“触发”过ajax行为,那么第一种方法可能永远不会工作,第二种方法应该在导航器完成加载DOM并触发页面上的“onload”事件时工作(但我不确定该行为是否正确绑定,从未尝试过此…)
另一个注意事项是,您编写的JavaScript会污染窗口的全局命名空间,如果您考虑在实际项目中使用这个名称,请考虑阅读有关JavaScript命名空间的文档。
< P>不要使用标签作为脚本容器。Wicket有一些合适的方法来做到这一点。
下面的代码是可选的(假设您在wicket 1.5上)
如果要在站点完全加载后执行脚本,可以使用以下方法:
response.renderOnLoadJavaScript("doSomething();");
在wicket 1.4中,其工作方式不同。您必须使用那里的HeaderContributors。我一直在开发一个名为Wicket 6的扩展,它允许您以一种非常方便和干净的方式执行此操作
您的用例代码可以如下所示
add(new JsBehavior() {
@Override
protected IJavaScript domReadyJs() {
return new JsCall("initChannel");
}
});
这就转化为@Till已经提供的原生Wicket解决方案
如果您想在那里显示警报
,您可以这样做
add(new JsBehavior() {
@Override
protected IJavaScript domReadyJs() {
return new JsStatements(
new JsCall("alert", "got it"),
new JsCall("initChannel")
);
}
});
谢谢我应该向哪个组件添加target.appendJavascript(“initChannel()”)
?另外,如何激发ajax行为?AjaxRequestTarget如何定位js函数?很抱歉,我有点错觉,因为我花了几个小时试图理解发生了什么。为了理解事情应该如何运作,我建议您在页面中添加一个AjaxLink
,并在onClick
方法中添加您想要测试的JavaScript调用。好的。这似乎奏效了。如果我不需要onClick事件呢。事实上,我不需要什么活动。我只想将js附加到html标记中。你能告诉我为什么这样不起作用吗:AbstractDefaultAjaxBehavior=new AbstractDefaultAjaxBehavior(){protected void respond(AjaxRequestTarget目标){target.appendJavascript(“alert('hey');”)};添加(行为)代码>我猜是因为它没有附加到任何html标记?基本上,您需要一些东西来触发附加到组件的行为。如果你只想在页面加载时启动javascript,你甚至不需要附加一个行为,你可以简单地使用普通的javascript(附加一个dom就绪函数)来完成。对于页面加载,a可以简单地使用一个闭包函数——我尝试它时,它就起作用了。正如我在一篇评论中提到的,我需要html-intheHTML标记体中的JS代码。我需要JS变量在添加wicket组件的确切位置可用。我已经对此进行了测试。它起作用了。显然,我希望javascript代码在适当的位置(在html主体中),而不是在head中。这样,当我需要通过wicketAjaxGet在JS和Java之间传递变量时,我就可以在那里得到它(即添加wicket组件的地方)。你不能在头部定义JS并在需要代码的地方调用它吗?我怎么做?让javascript在加载时执行不是问题。让一个组件在加载时异步执行并从javascript检索值是我遇到的问题。我想这就是AjaxEventBehavior的用意。但这对我不起作用。也许这可以帮助你:
response.renderOnLoadJavaScript("doSomething();");
add(new JsBehavior() {
@Override
protected IJavaScript domReadyJs() {
return new JsCall("initChannel");
}
});
add(new JsBehavior() {
@Override
protected IJavaScript domReadyJs() {
return new JsStatements(
new JsCall("alert", "got it"),
new JsCall("initChannel")
);
}
});