2

AS/400 CGI アプリケーションへの Web フロントエンドがあり、いくつかのF1キーF24(ページによって異なります) やページアップ、ページダウンなどを使用できます。これらは基礎となるアプリケーションに渡されます。それらを適切に処理します。たとえば、特定のページで、ユーザーはF3ボタンまたはF3キーを押すことができます。どちらも (非表示の) CmdKey 変数を設定して、名前が '_K03' で値が 'F03' になるようにします。ボタン操作はシンプルで問題ありません。ユーザーがキーボードの実際の F キーを押すのを処理するために、私は完全に動作する IE 互換スクリプトを長い間持っていました。

function setCmdKeyIE() {                                                        
  var cmdkeycode = "";                                                          
  if (window.event.keyCode != 13 &
    window.event.keyCode != 33 &                 
    window.event.keyCode != 34 &
    window.event.keyCode < 112 ) return;         
  window.event.keyCode = window.event.keyCode + 1000;                           
  if (window.event.shiftKey) window.event.keyCode = window.event.keyCode + 1000;
  switch(window.event.keyCode) {                                                
    case 1013: cmdkeycode = "EN"; break; /* Enter */                            
    case 1033: cmdkeycode = "UP"; break; /* Page Up */                          
    case 1034: cmdkeycode = "DN"; break; /* Page Down  */                       
    case 1112: cmdkeycode = "01"; break; /* F1 */                               
    case 1113: cmdkeycode = "02"; break; /* F2 */                               
    ...(F3 thru F24 here)...
    default:   return;                   /* Anything else should be ignored */
  }                                                         
  window.event.cancelBubble = true;                         
  window.event.returnValue = false;                         
  document.forms[0].CmdKey.value = "F" + cmdkeycode;        
  document.forms[0].CmdKey.name = "_K" + cmdkeycode;        
  if (ONSUBMITFUN() == true) document.forms[0].submit();    
}                                                           

これにより、CmdKey 要素が正しく設定されるだけでなく、ブラウザーの既定の動作 (存在する場合) が実行されないようにオーバーライド (停止) されます (たとえば、ユーザーが F3 キーを押すと、検索ボックスは表示されません)。

setCmdKeyIE()関数は次のように呼び出されます。

<body onKeyDown="setCmdKeyIE();" onHelp="return false;">

私は今、これを Firefox (そして、他のブラウザーでも可能性があります) で動作させる必要があり、あらゆる種類の問題を抱えています。最初に setCmdKeyIE 関数を変更しました (はい、IE 固有ではなくなったら名前を変更する必要があることはわかっていますが、それは私の心配ではありません!) イベントをパラメーターとして取得します (これは Firefox の場合のみです)。私は考えました)または(IEで)渡されない場合は現在の動作を使用します。他にもFirefoxのイベント伝播を止める処理を追加したのですが、うまくいきません...

これが新しい動作しないコードです - 親切な魂が私のやり方の誤りを指摘できますか?

function setCmdKey(e) {
  if (!e) {
    var e = window.event; /* IE event-handling */
  }
  var wrkkeyCode = e.keyCode;
  if (wrkkeyCode != 13 &
      wrkkeyCode != 33 &
      wrkkeyCode != 34 &
      wrkkeyCode != 27 &
      wrkkeyCode < 112 ) return;
  wrkkeyCode = wrkkeyCode + 1000;
  if (e.shiftKey) wrkkeyCode = wrkkeyCode + 1000;
  var cmdkeycode = "";
  switch(wrkkeyCode) {
    case 1013: cmdkeycode = "EN"; break; /* Enter */
    case 1033: cmdkeycode = "UP"; break; /* Page Up */
    case 1034: cmdkeycode = "DN"; break; /* Page Down  */
    case 1112: cmdkeycode = "01"; break; /* F1 */
    case 1113: cmdkeycode = "02"; break; /* F2 */
    ...(F3 thru F24 here)...
    default:   return;               /* Anything else should be ignored */
  }
  if (e.stopPropagation) {           /* FF */
    e.stopPropagation();
    e.preventDefault();
  }
  else {                             /* IE */
    e.cancelBubble = true;
    e.returnValue = false;
  }
  document.forms[0].CmdKey.value = "F" + cmdkeycode;
  document.forms[0].CmdKey.name = "_K" + cmdkeycode;
  if (ONSUBMITFUN() == true) document.forms[0].submit();
}

Firefox で setCmdKeyIE から false を返す必要がありますか? この手順が false を返す場合でも、これは成り立ちますか?

4

2 に答える 2

2

更新しました

これで整理できました。以下のコメントのコンテキストを削除して申し訳ありませんが、以前のバージョンがまだ残っています。

IE には修正すべき問題が 2 つあります。1 つ目は、前に述べたこととは逆に、 にonkeydown属性を配置しても<body>機能しないことです。代わりに、ドキュメントに添付する必要があります。keydown2 つ目の問題は、IE では、イベントのプロパティの変更を含む悪意のあるハッキングを行わない限り、F3 キーによってトリガーされる検索ダイアログなどの魔法の動作を抑制できないことですkeyCode。これは明らかに非常に間違ったことです。onkeydownいずれにせよ、 の属性を削除する<body>と、次のように処理されます (Opera でも機能するように修正されました)。

var keyCodeMap = {
    "1013": "EN",
    "1033": "UP",
    "1034": "DN",
    "1112": "01",
    "1113": "02",
    "1114": "03"
    // ...(F4 thru F24 here)...
};

var suppressKeypress = false;

function setCmdKey(e) {
    e = e || window.event;
    var wrkkeyCode = e.keyCode;
    if (wrkkeyCode != 13 &&
        wrkkeyCode != 33 &&
        wrkkeyCode != 34 &&
        wrkkeyCode != 27 &&
        wrkkeyCode < 112) return;

    wrkkeyCode += 1000;

    if (e.shiftKey) wrkkeyCode += 1000;
    var cmdkeycode = keyCodeMap[wrkkeyCode];
    if (!cmdkeycode) return; /* Anything else should be ignored */

    var input = document.forms[0].elements["CmdKey"];
    input.value = "F" + cmdkeycode;
    input.name = "_K" + cmdkeycode;

    try {
        // Prevent default action in IE by bad hacky means
        e.keyCode = 0;
    } catch (ex) {
        // Other browsers do not allow setting the keyCode
    }
    suppressKeypress = true;

    if (ONSUBMITFUN()) document.forms[0].submit();
    return false;
}

document.onkeydown = setCmdKey;
document.onkeypress = function() {
    if (suppressKeypress) {
        return false;
    }
};
于 2010-07-20T08:52:01.840 に答える
0

イベントを変更してデフォルトを防止した場合でも、イベント ハンドラーから常に false を返す必要があります。詳細については、 Quirks モードを参照してください。

于 2010-08-03T08:53:55.727 に答える