私が書いた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の両方がこのソリューションを支援しました。私はブライアンに彼の評判を助けるための「答え」を与えました。みんな、ありがとう!
IE8では、window.Event
のkeyCode
プロパティは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();
}
ちょっと待って、これを試してください:
var keyCode = e.keyCode ? e.keyCode : e.which;
それは私のコードでこのように働いています:
var kcode = (window.event) ? event.keyCode : event.which;
これを試して:
function checkKeyCode(e){
if (!e) e = window.event; var kCd = e.which || e.keyCode;
return kCd;
}
私は個人的にマルチキーアプローチを好みます。これにより、複数のキーを検出できますが、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
の場合は13
、CTRL
の場合は17
などの特定のキーコードを構成します。
map={}
行は、マップオブジェクトをクリアして、フォーカスが外れた場合にキーを「保持」しないようにします。一方、return false
は、たとえば、CTRL+D
をチェックしたときにブックマークダイアログがポップアップしないようにします。場合によっては、それをe.preventDefault()
に置き換えたいと思うかもしれませんが、ほとんどの場合、return false
の方が効率的であることがわかりました。明確な見通しを得るために、CTRL+D
で試してみてください。 Ctrl
は17
であり、D
は68
です。 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チェーンの最初に配置して、Enter
とCTRL+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など、現在コンピューターに使用しているすべてのブラウザーで機能します。
これがお役に立てば幸いです。
またはそのようなもの。 var keyCode = e.which || e.keyCode;
Onkeyupイベントも追加して、同じ関数を呼び出してみてください。
ヒント:doSubmitの先頭にdebugger;
を追加してブレークを設定してから、keyCodeを調べることができます。
おもう window.Event.keyCode
IE8で動作します(今はテストできませんが)