2011-06-27 7 views
-1

編集:誰も返答していないので、私は質問をより簡潔に述べようとします。 (右/左/スペースのような)ブラウザページ上のキーストロークを処理するときどのように1は、キーストロークにフォーカスがブラウザのページ上の要素で扱うか、それはだかどうかないを行くことになるだろうかどうかを教えてくれありませんそのオブジェクトによって処理され、それをグローバルに処理することは問題ありませんか?理想的には、フォーカスオブジェクトにキーストロークが表示されるようにして、フォーカスオブジェクトがそれを処理したかどうかを知ることができます。そうでない場合は、あなた自身で処理することができます。それを処理した場合は、何もしません(フォーカスオブジェクトがキーストロークでより重要な使用をしていると仮定して)。文書レベルでkeybdイベントをキャプチャする方法はありますが、編集可能なフィールドにはイベントがありますか?

ブラウザ以外の設定の典型的な例です。多くの典型的なダイアログボックスコントロール、カップルボタン、豊富なエディットコントロールを持つWindowsダイアログがあるとします。典型的なダイアログボックスコントロールの場合、キーボードのEnterキーはダイアログの[OK]ボタンをアクティブにし、ダイアログの変更を受け入れます。リッチエディットコントロールの場合は、Enterキーで改行を入力します。ダイアログボックスは、ダイアログボックスの現在のコントロールがエンターキーを処理するかどうか、またはグローバルに処理する必要があるかどうかを、何とか知ることができます。

特定のブラウザのケースでは、YUI2イベント処理を使用してドキュメントレベルでキーストロークをキャプチャしているため、キーボードの左右の矢印を使用してページ上のスライドショーを移動することはできませんページ上の特定の要素(ユーザーが好きな機能)にフォーカスを明示的に設定する必要があります。しかし、ページに編集可能なフィールドが含まれている場合は、それらの左/右の矢印を、スライドショーではなくページ上のそのフィールドで処理する必要があります。私はそれを行うためのエレガントな方法を探しています。

元のイベントターゲットを見て、そのターゲットが左/右の矢印(入力、テキストエリア、contenteditableなど)を処理できるかどうかを判断しようとしますが、私は望んでいましたより簡単な方法のために。 Webページ上のオブジェクトによって他の方法で処理されない場合にのみ、ドキュメントレベルでキーストロークを処理する方法はありますか?私のYUIキーボードハンドラでは、実際にはターゲットオブジェクトによって処理されるキーボードイベントもすべて取得しています。

は、ここに私のコードは、今のように見えるものだと私はやや脆いObjectWantsKeys機能を必要としないこと、これを行うために、よりエレガントな方法を探しています:

JF.Slideshow.prototype._HookupKeyNav = function() { 
    var k = YAHOO.util.KeyListener; 
    var key = k.KEY; 
    // see if keyboard handling is enabled or not 
    if (((this._config.keyboardNav == "auto") && (JF.SlideshowCnt <= 1)) || (this._config.keyboardNav == "on")) { 
     this._keyListener = new YAHOO.util.KeyListener(
     document, { 
      ctrl: false, 
      shift: false, 
      alt: false, 
      keys: [key.LEFT, key.RIGHT, key.SPACE] 
     }, { 
      fn: this._HandleKeys, 
      scope: this, 
      correctScope: true 
     }); 
     this._keyListener.enable(); 
    } 
} 
JF.Slideshow.prototype._HandleKeys = function (type, args, obj) { 
    var keyCode = args[0]; 
    var event = args[1]; 
    var target = event.srcElement || event.target; 
    if (JFL.ObjectWantsKeys(target)) return; // if the current focus object wants keystrokes, then we shouldn't process them 
    var key = YAHOO.util.KeyListener.KEY; 
    switch (keyCode) { 
    case key.LEFT: 
     this.Back(); 
     break; 
    case key.RIGHT: 
     this.Forward(); 
     break; 
    case key.SPACE: 
     this.StartStopToggle(); 
     break; 
    default: 
     break; 
    } 
} 
JFL.ObjectWantsKeys = function (o) { 
    // list of HTML object types that want the keystroke if they have focus 
    var list = { 
     "input": true, 
     "textarea": true 
    }; 
    try { 
     // unfortunately o.contentEditable set to an empty string means it is editable so we need this more complicated comparision 
     if ((typeof o.contentEditable !== "undefined") && (o.contentEditable === "true" || o.contentEditable === true || o.contentEditable === "")) { 
      return (true); // focus object is editable 
     } 
     if (o.tagName && list[o.tagName.toLowerCase()]) { 
      return (list[o.tagName.toLowerCase()]); // focus object can take keys 
     } 
    } catch (e) {} 
    return (false); 
} 

答えて

1

私がチェックすることでこれを解決しました焦点を当てていた要素の種類:

var tag = document.activeElement.tagName; 
if (tag == "INPUT" || tag == "TEXTAREA") 
    return; 

私もYAHOO.widget.Dialogが表示されたときのKeyListenerは、キーストロークを処理したくなかったので、これはBODY」のタグ名を与えることになる(完璧ではありませんでした")。 YAHOO.widget.OverlayManagerを使用して何かを一緒にスローし、アクティブなダイアログを確認する必要がありました。それがnullなら私はキーストロークを処理します。

これは洗練されていないと私はよりよい解決策を望んでいます。私はそこに答えを得る場合、それは同様にあなたを助けるかもしれない

http://yuilibrary.com/forum/viewtopic.php?p=26413

:私はYUIのフォーラムにメッセージを投稿しました。

+0

これまでのところ私の最高の解決策は、質問の中の私のコード内にある 'JFL.ObjectWantsKeys'関数です。これは同様にターゲット要素を見て、それが左/右を処理する要素の型かどうかを調べようとします。右矢印キー自体。確かに理想よりも少なく、キーを処理するカスタムオブジェクトに問題がある可能性があります。あなたが何か良いものを見つけたら、聞いてうれしいです。 – jfriend00

+0

@jfriend、同様に、あなたが何か良いものを見つけたら、この質問を更新してください。私は多くの検索をしましたが、これは珍しい問題ではありませんが、見つけられる大きな解決策はありません。 – Paul

関連する問題