0

ZK フレームワークにCTRLキー リスナーを実装しました。ただし、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);
        }
    }
}
4

2 に答える 2

0

残念ながら、私たちのアプリケーションからブラウザー レベルのキーボード コントロールを変更/無効にすることはできません (読み取り: JavaScript から)。それはセキュリティと使いやすさの問題です。

これらのブラウザーレベルのコントロールを変更するためのFirefoxChrome (後者は Google 製) の両方にプラグインがあります..しかし、すべてのユーザーがブラウザーを再構成する必要があるため、それは役に立ちません。

ネイティブの HTML 要素を使用すると、無料で多くのコントロールを取得できます。例: テキスト フィールドですべてを選択します。ユースケースがこれらの境界内で機能しない場合は、ユーザビリティの競合であるため、このアプローチ (またはこれらのキーボード コマンド) を避けることをお勧めします。

于 2013-07-01T13:39:03.510 に答える