0

我在 ZK 框架中实现了一个CTRL键监听器。但是,我遇到了 Firefox 和 Chrome 的问题。

如果我按CTRL+RCTRL+ACTRL+ 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);
        }
    }
}
4

2 回答 2

0

恐怕无法从我们的应用程序更改/禁用浏览器级键盘控件(阅读:来自 JavaScript);这是一个安全和可用性问题。

FirefoxChrome(后者由 Google 制作)都有插件来更改这些浏览器级别的控件。但这对您没有帮助,因为您需要所有用户重新配置他们的浏览器。

使用原生 HTML 元素,您可以免费获得大量控件。例如:在文本字段中全选。如果您的用例无法在这些范围内工作,那么我建议您回避这种方法(或这些键盘命令),因为它存在可用性冲突。

于 2013-07-01T13:39:03.510 回答
0

这只是常见的行为——如果没有焦点,则同时执行 ctrlkeys 和默认操作。

作为一种解决方法,您可以使用另一个可聚焦组件(例如“a”)作为第二个控制键侦听器,侦听文档的单击事件和窗口的焦点事件,并聚焦“a”组件以使其在单击时处理控制键无法聚焦的组件/窗口聚焦。

简单示例:http: //zkfiddle.org/sample/f9ejg7/5-Ctrlkeys-prevent-default

于 2013-07-01T14:08:11.950 回答