Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Wicket调用Javascript函数_Java_Wicket - Fatal编程技术网

从Wicket调用Javascript函数

从Wicket调用Javascript函数,java,wicket,Java,Wicket,我想将html中javascript代码块的输出传递给相应的wicket组件。我尝试了抽象的行为,但似乎不起作用 以下是我的工作内容: HTML 请问我做错了什么?谢谢 更新 我将把一系列变量从wicket传递给JS,以便使用wicket组件显示每个javascript输出。我刚刚意识到,我必须使用dom就绪状态来开始交互。那很好。但是我仍然对wicket组件如何改变状态以接收来自javascript的更新响应感到困惑和不解。是否有一个wicket组件可以异步触发自身?您这样做是错误的,因为您在

我想将html中javascript代码块的输出传递给相应的wicket组件。我尝试了抽象的行为,但似乎不起作用

以下是我的工作内容:

HTML 请问我做错了什么?谢谢

更新
我将把一系列变量从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")
        );
    }
});