从 Javascript 调用 Wicket 代码
Call Wicket Code from Javascript
我正在尝试从 Wicket 中的 Java 脚本调用一些 Java 代码。
这是我的 Java 代码:
public ShowUnternehmen() {
add(new AbstractDefaultAjaxBehavior() {
@Override
protected void respond(AjaxRequestTarget ajaxRequestTarget) {
System.out.println("respond");
}
@Override
public void renderHead(Component component, IHeaderResponse response) {
super.renderHead( component, response );
System.out.println(getCallbackUrl());
}
});
}
这是 Java脚本代码:
<wicket:head>
<script type="text/javascript" >
$(function() {
$.contextMenu({
selector: '.context-menu-one',
callback: function(key, options) {
var m = "clicked: " + key;
alert("BLA");
Wicket.Ajax.get({"u":"./com.emg.panels.unternehmen.ShowUnternehmen?1-1.IBehaviorListener.0-"})
},
items: {
"edit": {name: "Editieren", icon: "edit"},
"quit": {name: "Abbrechen", icon: function(){
return 'context-menu-icon context-menu-icon-quit';
}}
}
});
$('.context-menu-one').on('click', function(e){
console.log('clicked', this);
})
});
</script>
</wicket:head>
但是响应方法永远不会执行。我正在查看其他示例,但它们似乎都令人困惑。
我从 renderHead 方法
得到了这个url
从 Javascript 触发 java/wicket 代码的一种简单方法是使用带有事件行为的隐藏输入作为挂钩。
隐藏输入是 "invisible" 的表单元素,但对于这种情况非常有用。
设置 Wicket 组件
首先我们在 Wicket 页面上添加一个 HiddenField 并给它一个 AjaxEventBehavior
final HiddenField<Void> hiddenInput = new HiddenField<>("hiddenInput");
add(hiddenInput);
hiddenInput.add(new AjaxEventBehavior("change") {
@Override
protected void onEvent(final AjaxRequestTarget target) {
// Execute any code you like and respond with an ajax response
target.appendJavaScript("alert('Hidden Input Change Event Behaviour!');");
}
});
我以 Javascript 警报为例,因为 System.out.println 可能会被某些记录器系统忽略。我还使用了 change 事件,尽管其他事件也可能有效。
对应的HTML-Markup:
<input type="hidden" wicket:id="hiddenInput" id="hiddenInput1"/>
注意: 我给了输入一个固定的 id 值。由于 id 在每个页面上都应该是唯一的,因此您无法将其放入 Wicket 面板并将其多次添加到页面中。您必须让 wicket 创建 ID (setOutputMarkupId(true)
),然后找到一种方法将 ID 传递给您的 javascript。但是对于这个非常简单的例子,这应该足够了。
触发 Javascript
现在您需要做的就是在隐藏的输入上触发一个更改事件,它将执行您在 onEvent 方法中定义的代码。
有了JQuery和id,就非常简单了:
<script>
$('#hiddenInput1').change();
</script>
希望这个简单的例子能帮助您理解。正如我在评论中所说,这只有在您的 javascript 调用没有 need/care 响应并且您只想能够从 JavaScript 触发检票口代码时才真正有用。 =14=]
你做得很好。如果让wicket把回调函数渲染到页面上会更可靠。以下两个示例展示了如何做到这一点:
A) 渲染一个全局回调函数。缺点是您将只有一个回调端点。
(1) 创建如下行为:
public class CallFromJavascriptBehavior extends AbstractDefaultAjaxBehavior {
@Override
protected void respond(AjaxRequestTarget target) {
final StringValue parameterValue = RequestCycle.get().getRequest().getQueryParameters().getParameterValue("yourName");
System.out.println(String.format("Hello %s", parameterValue.toString()));
}
@Override
public void renderHead(Component component, IHeaderResponse response) {
super.renderHead(component, response);
response.render(JavaScriptHeaderItem.forScript(String.format("nameOfFunction=%s", getCallbackFunction(CallbackParameter.explicit("yourName"))), "CallFromJavascriptBehavior"));
}}
(2) 将此行为添加到您的 wicket 页面。
(3) 现在你可以调用 nameOfFunction('Markus');来自你的 javascript.
B) 为页面上的每个组件实例调用一个初始化函数。
(1) 为您的页面添加一个初始化函数
<script>
function initMyComponent(selector, callback){
$(selector).click(function(){
callback("Markus");
});
}
</script>
(2) 创建如下调用初始化函数并传递必要的选择器和回调函数的行为。
public class ComponentBehavior extends AbstractDefaultAjaxBehavior{
@Override
protected void respond(AjaxRequestTarget target) {
final StringValue parameterValue = RequestCycle.get().getRequest().getQueryParameters().getParameterValue("yourName");
System.out.println(String.format("Hello %s", parameterValue.toString()));
}
@Override
public void renderHead(Component component, IHeaderResponse response) {
super.renderHead(component, response);
response.render(OnDomReadyHeaderItem.forScript(String.format("initMyComponent('#%s', %s)", component.getMarkupId(), getCallbackFunction(CallbackParameter.explicit("yourName")))));
}}
(3) 将行为添加到您的 wicket 组件。
如果没有调用响应方法,则可能有不同的原因。您应该先检查您的控制台(ide 和浏览器)。
我正在尝试从 Wicket 中的 Java 脚本调用一些 Java 代码。
这是我的 Java 代码:
public ShowUnternehmen() {
add(new AbstractDefaultAjaxBehavior() {
@Override
protected void respond(AjaxRequestTarget ajaxRequestTarget) {
System.out.println("respond");
}
@Override
public void renderHead(Component component, IHeaderResponse response) {
super.renderHead( component, response );
System.out.println(getCallbackUrl());
}
});
}
这是 Java脚本代码:
<wicket:head>
<script type="text/javascript" >
$(function() {
$.contextMenu({
selector: '.context-menu-one',
callback: function(key, options) {
var m = "clicked: " + key;
alert("BLA");
Wicket.Ajax.get({"u":"./com.emg.panels.unternehmen.ShowUnternehmen?1-1.IBehaviorListener.0-"})
},
items: {
"edit": {name: "Editieren", icon: "edit"},
"quit": {name: "Abbrechen", icon: function(){
return 'context-menu-icon context-menu-icon-quit';
}}
}
});
$('.context-menu-one').on('click', function(e){
console.log('clicked', this);
})
});
</script>
</wicket:head>
但是响应方法永远不会执行。我正在查看其他示例,但它们似乎都令人困惑。
我从 renderHead 方法
得到了这个url从 Javascript 触发 java/wicket 代码的一种简单方法是使用带有事件行为的隐藏输入作为挂钩。
隐藏输入是 "invisible" 的表单元素,但对于这种情况非常有用。
设置 Wicket 组件
首先我们在 Wicket 页面上添加一个 HiddenField 并给它一个 AjaxEventBehavior
final HiddenField<Void> hiddenInput = new HiddenField<>("hiddenInput");
add(hiddenInput);
hiddenInput.add(new AjaxEventBehavior("change") {
@Override
protected void onEvent(final AjaxRequestTarget target) {
// Execute any code you like and respond with an ajax response
target.appendJavaScript("alert('Hidden Input Change Event Behaviour!');");
}
});
我以 Javascript 警报为例,因为 System.out.println 可能会被某些记录器系统忽略。我还使用了 change 事件,尽管其他事件也可能有效。
对应的HTML-Markup:
<input type="hidden" wicket:id="hiddenInput" id="hiddenInput1"/>
注意: 我给了输入一个固定的 id 值。由于 id 在每个页面上都应该是唯一的,因此您无法将其放入 Wicket 面板并将其多次添加到页面中。您必须让 wicket 创建 ID (setOutputMarkupId(true)
),然后找到一种方法将 ID 传递给您的 javascript。但是对于这个非常简单的例子,这应该足够了。
触发 Javascript
现在您需要做的就是在隐藏的输入上触发一个更改事件,它将执行您在 onEvent 方法中定义的代码。
有了JQuery和id,就非常简单了:
<script>
$('#hiddenInput1').change();
</script>
希望这个简单的例子能帮助您理解。正如我在评论中所说,这只有在您的 javascript 调用没有 need/care 响应并且您只想能够从 JavaScript 触发检票口代码时才真正有用。 =14=]
你做得很好。如果让wicket把回调函数渲染到页面上会更可靠。以下两个示例展示了如何做到这一点:
A) 渲染一个全局回调函数。缺点是您将只有一个回调端点。
(1) 创建如下行为:
public class CallFromJavascriptBehavior extends AbstractDefaultAjaxBehavior {
@Override
protected void respond(AjaxRequestTarget target) {
final StringValue parameterValue = RequestCycle.get().getRequest().getQueryParameters().getParameterValue("yourName");
System.out.println(String.format("Hello %s", parameterValue.toString()));
}
@Override
public void renderHead(Component component, IHeaderResponse response) {
super.renderHead(component, response);
response.render(JavaScriptHeaderItem.forScript(String.format("nameOfFunction=%s", getCallbackFunction(CallbackParameter.explicit("yourName"))), "CallFromJavascriptBehavior"));
}}
(2) 将此行为添加到您的 wicket 页面。
(3) 现在你可以调用 nameOfFunction('Markus');来自你的 javascript.
B) 为页面上的每个组件实例调用一个初始化函数。
(1) 为您的页面添加一个初始化函数
<script>
function initMyComponent(selector, callback){
$(selector).click(function(){
callback("Markus");
});
}
</script>
(2) 创建如下调用初始化函数并传递必要的选择器和回调函数的行为。
public class ComponentBehavior extends AbstractDefaultAjaxBehavior{
@Override
protected void respond(AjaxRequestTarget target) {
final StringValue parameterValue = RequestCycle.get().getRequest().getQueryParameters().getParameterValue("yourName");
System.out.println(String.format("Hello %s", parameterValue.toString()));
}
@Override
public void renderHead(Component component, IHeaderResponse response) {
super.renderHead(component, response);
response.render(OnDomReadyHeaderItem.forScript(String.format("initMyComponent('#%s', %s)", component.getMarkupId(), getCallbackFunction(CallbackParameter.explicit("yourName")))));
}}
(3) 将行为添加到您的 wicket 组件。
如果没有调用响应方法,则可能有不同的原因。您应该先检查您的控制台(ide 和浏览器)。