web-dev-qa-db-ja.com

Internet Explorer8ではJavaScriptのKeyCode値は「未定義」です

私が書いたJavaScriptの一部に問題がありますが、Internet Explorer 8でのみ問題が発生します。これは、Internet Explorer7以前またはMozillaFirefox3.5以前で問題なく実行できます。 Internet Explorer 8で互換モードを使用すると、正しく実行されます。

私がやっていることは、ユーザーがテキストボックスに値を入力したときにEnterキーストロークをオーバーライドすることです。だから私の要素にはこれがあります:

<asp:TextBox ID="ddPassword" runat="server" TextMode="Password" onkeypress="doSubmit(event)" Width="325"></asp:TextBox>

そして、私は次のJavaScriptメソッドを持っています:

function doSubmit(e)
{
    var keyCode = (window.Event) ? e.which : e.keyCode;
    if (keyCode == 13)
        document.getElementById("ctl00_ContentPlaceHolder1_Login").click();  
}

繰り返しますが、これは他のほとんどすべてのブラウザで正常に機能します。 Internet Explorer8は私に苦労しているだけです。

あなたが持っているかもしれないどんな助けも大いに感謝されます。ありがとう!

更新:迅速なフィードバックをありがとうございました。 ChrisPebbleとBryanKyleの両方がこのソリューションを支援しました。私はブライアンに彼の評判を助けるための「答え」を与えました。みんな、ありがとう!

11
Matt McCormick

IE8では、window.EventkeyCodeプロパティはundefinedのように見えますが、window.eventの同じプロパティ(小文字に注意してくださいe)には値。 window.eventを使用してみてください。

function doSubmit(e)
{
   var keyCode = (window.event) ? e.which : e.keyCode;
   if (keyCode == 13)
      document.getElementById("ctl00_ContentPlaceHolder1_Login").click();  
}
25
Bryan Kyle

ちょっと待って、これを試してください:

var keyCode = e.keyCode ? e.keyCode : e.which;
8

それは私のコードでこのように働いています:

var kcode = (window.event) ? event.keyCode : event.which;
3
Evelyn Loo

これを試して:

function checkKeyCode(e){  
    if (!e) e = window.event;   var kCd =  e.which ||  e.keyCode;
    return kCd;
}
2
coder

私は個人的にマルチキーアプローチを好みます。これにより、複数のキーを検出できますが、1つのキーもまったく同じであり、テストしたすべてのブラウザーで機能します。

map={}//declare object to hold data
onkeydown=onkeyup=function(e){
    e=e||event//if e doesn't exist (like in IE), replace it with window.event
    map[e.keyCode]=e.type=='keydown'?true:false
    //Check for keycodes
}

別の方法は、onkeydownイベントとonkeyupイベントを分離し、各イベントのマップサブアイテムを明示的に定義することです。

map={}
onkeydown=function(e){
    e=e||event
    map[e.keyCode]=true
}
onkeyup=function(e){
    e=e||event
    map[e.keyCode]=false
}

どちらの方法でも問題なく動作します。さて、実際にキーストロークを検出するための方法は、バグ修正を含めて、次のとおりです。

//[in onkeydown or onkeyup function, after map[e.keyCode] has been decided...]
if(map[keycode]){
    //do something
    map={}
    return false
}

map[keycode]は、Enterの場合は13CTRLの場合は17などの特定のキーコードを構成します。

map={}行は、マップオブジェクトをクリアして、フォーカスが外れた場合にキーを「保持」しないようにします。一方、return falseは、たとえば、CTRL+Dをチェックしたときにブックマークダイアログがポップアップしないようにします。場合によっては、それをe.preventDefault()に置き換えたいと思うかもしれませんが、ほとんどの場合、return falseの方が効率的であることがわかりました。明確な見通しを得るために、CTRL+Dで試してみてください。 Ctrl17であり、D68です。 return false行がないと、ブックマークダイアログがポップアップすることに注意してください。

いくつかの例を次に示します。

if(map[17]&&map[13]){//CTRL+ENTER
    alert('CTRL+ENTER was pressed')
    map={}
    return false
}else if(map[13]){//ENTER
    alert('Enter was pressed')
    map={}
    return false
}

覚えておくべきことの1つは、小さい組み合わせが最後に来る必要があるということです。常に大きい組み合わせをif..elseチェーンの最初に配置して、EnterCTRL+ENTERの両方のアラートを同時に受け取らないようにします。

さて、「すべてをまとめる」ための完全な例。ユーザーがSHIFT+?を押したときにログインし、ユーザーがENTERを押したときにログインするための指示を含むメッセージを警告するとします。この例は、クロスブラウザー互換でもあります。つまり、IEでも機能します。

map={}
keydown=function(e){
    e=e||event
    map[e.keyCode]=true
    if(map[16]&&map[191]){//SHIFT+?
        alert('1) Type your username and password\n\n2) Hit Enter to log in')
        map={}
        return false
    }else if(map[13]){//Enter
        alert('Logging in...')
        map={}
        return false
    }
}
keyup=function(e){
    e=e||event
    map[e.keyCode]=false
}
onkeydown=keydown
onkeyup=keyup//For Regular browsers
try{//for IE
    document.attachEvent('onkeydown',keydown)
    document.attachEvent('onkeyup',keyup)
}catch(e){
    //do nothing
}

一部の特殊キーには、エンジンごとに異なるコードがあることに注意してください。しかし、私がテストしたように、これは、Maxthon 3、Google Chrome、Internet Explorer(9および8)、Firefoxなど、現在コンピューターに使用しているすべてのブラウザーで機能します。

これがお役に立てば幸いです。

1
Braden Best

またはそのようなもの。 var keyCode = e.which || e.keyCode;

0
Alexsandro

Onkeyupイベントも追加して、同じ関数を呼び出してみてください。

ヒント:doSubmitの先頭にdebugger;を追加してブレークを設定してから、keyCodeを調べることができます。

0
dcp

おもう window.Event.keyCode IE8で動作します(今はテストできませんが)

0
Soufiane Hassou