Калитка Аякс Кейвент
Я новичок в Wicket и хочу создать ajax-поведение, которое вызывает мой Javacode, если нажата функциональная клавиша.
Моя идея состоит в том, чтобы создать поведение, которое отправит некоторый Javascript в Браузер, чтобы только F-Key вызывал ajax-callback.
public class HomePage extends WebPage {
public HomePage(final PageParameters parameters) {
super(parameters);
add(new AbstractDefaultAjaxBehavior(){
@Override
protected void respond(AjaxRequestTarget target) {
//retrieve the Parametervalue from request
final Request request = RequestCycle.get().getRequest();
final String jsKeycode = request.getRequestParameters()
.getParameterValue("keycode").toString("");
//test output
target.appendJavaScript("alert('from wicket ajax. you pressed "+jsKeycode+"')");
}
@Override
public void renderHead(Component component, IHeaderResponse response) {
super.renderHead(component, response);
//Append JavaScriptcode
response.render(OnDomReadyHeaderItem.forScript(
"\n\n" +
"$(document).keydown(" +
"function(event){\n" + //120, 121 Example for F9 and F10
"if((event.keyCode == 120) || (event.keyCode == 121)){\n" +
"event.preventDefault();\n" +
"window.alert('F-Key pressed');\n" +
//perform ajax-callback with keyCode
"}\n" +
"});\n"));
}
});
Теперь моя проблема: что я должен кодировать, чтобы обратный вызов ajax выполнялся с нажатой клавишей в качестве параметра?
2 ответа
osmdamv дает мне подсказку, чтобы найти "Wicketsolution" для моей проблемы. Теперь вот мой код для перехвата нажатия клавиш и отправки только в некоторых случаях ajaxrequest на сервер wicket.
В этом примере у другого пользователя должна быть возможность адаптировать этот код для своих нужд.
public HomePage(final PageParameters parameters) {
super(parameters);
add(new AjaxEventBehavior("keydown"){
@Override
protected void updateAjaxAttributes(AjaxRequestAttributes attributes) {
super.updateAjaxAttributes(attributes);
IAjaxCallListener listener = new AjaxCallListener(){
@Override
public CharSequence getPrecondition(Component component) {
//this javascript code evaluates wether an ajaxcall is necessary.
//Here only by keyocdes for F9 and F10
return "var keycode = Wicket.Event.keyCode(attrs.event);" +
"if ((keycode == 120) || (keycode == 121))" +
" return true;" +
"else" +
" return false;";
}
};
attributes.getAjaxCallListeners().add(listener);
//Append the pressed keycode to the ajaxrequest
attributes.getDynamicExtraParameters()
.add("var eventKeycode = Wicket.Event.keyCode(attrs.event);" +
"return {keycode: eventKeycode};");
//whithout setting, no keyboard events will reach any inputfield
attributes.setAllowDefault(true);
}
@Override
protected void onEvent(AjaxRequestTarget target) {
//Extract the keycode parameter from RequestCycle
final Request request = RequestCycle.get().getRequest();
final String jsKeycode = request.getRequestParameters()
.getParameterValue("keycode").toString("");
target.appendJavaScript("alert('from wicket ajax. you pressed "+jsKeycode+"')");
}
});
Редактировать:
Я вставляю attribute.setAllowDefault(true). Теперь это работает правильно.
Вы должны использовать AjaxEventBehavior, используя декораторы
@Override
protected void updateAjaxAttributes(AjaxRequestAttributes attributes)
{
super.updateAjaxAttributes(AjaxRequestAttributes attributes);
IAjaxCallListener listener = new IAjaxCallListener()
{
@Override
public CharSequence getBeforeHandler(Component c) { return handler; }
.....
};
attributes.getAjaxCallListeners().add(listener);
}