Я реализовал прослушиватель клавиш CTRL в структуре ZK. Однако у меня проблема с Firefox и Chrome.
Если я нажму CTRL+R или CTRL+A или CTRL+S, событие моего приложения срабатывает, но в Firefox и Chrome также срабатывает событие по умолчанию CTRL; обновить, выбрать все и сохранить соответственно. Например, если я нажимаю CTRL+A, мое событие срабатывает и выделяется весь текст на странице.
Может ли кто-нибудь сказать мне, это проблема ZK или я делаю что-то не так.
Примечание. События запускаются для всей страницы, а не только для текстового поля.
В ZUL я использовал:
<window apply="org.zkoss.bind.BindComposer"
viewModel="@id('vm') @init('com.web.viewmodel.MyViewModel')"
width="100%" height="100%" mode="embedded" ctrlKeys="^a^q^r^s^d"
onCtrlKey="@command('doFireCtrlKeyEvent',code=event.getKeyCode())">
.. и в моей Java ViewModel я использовал следующее, этот метод поймает событие и передаст его соответствующему ViewModel
:
@Command
public void doFireCtrlKeyEvent(@ContextParam(ContextType.VIEW) Component view, @org.zkoss.bind.annotation.BindingParam("code") String ctrlKeyCode) {
int keyCode = Integer.parseInt(ctrlKeyCode);
String ctrlKey = "";
switch (keyCode) {
case 65:
ctrlKey = "CTRL+A";
break;
case 81:
ctrlKey = "CTRL+Q";
break;
case 82:
ctrlKey = "CTRL+R";
break;
case 83:
ctrlKey = "CTRL+S";
break;
case 68:
ctrlKey = "CTRL+D";
break;
}
Map map = new HashMap();
map.put("ctrlKeyCode", ctrlKey);
Tabpanel tabPanel = mainTab.getSelectedPanel();
Tab tab = mainTab.getSelectedTab();
Include inc = (Include) tabPanel.getChildren().get(0);
if (inc != null) {
if (inc.getFirstChild() instanceof Window) {
Window win = (Window) inc.getFirstChild();
Map maps = win.getAttributes();
Binder bind = (Binder) maps.get("binder");
if (bind == null)
return;
bind.postCommand("doCtrlKeyAction", map);
}
if (inc.getFirstChild() instanceof Hbox) {
Hbox hbox = (Hbox) inc.getFirstChild();
Map maps = hbox.getAttributes();
Binder bind = (Binder) maps.get("binder");
if (bind == null)
return;
bind.postCommand("doCtrlKeyAction", map);
}
}
}