2009-11-17 17 views
10

Yazdığım bazı JavaScript'lerle, ancak yalnızca Internet Explorer 8'de sorun yaşıyorum. Bunu Internet Explorer 7 veya daha önceki sürümlerinde veya Mozilla'da çalıştırırken sorun yaşıyorum Firefox 3.5 veya daha öncesi. Internet Explorer 8'de uyumluluk modunu kullandığımda da düzgün şekilde çalıştırılır.JavaScript KeyCode Değerleri Internet Explorer 8'de "tanımsız" olarak verilmiştir

Yaptığım şey, kullanıcı bir metin kutusuna bir değer girdiğinde Enter tuşunu geçersiz kılar. Yani benim elemana bu var:

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

Sonra aşağıdaki JavaScript yöntemi vardır: Yine

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

, bunların hepsi hemen hemen her tarayıcı ile sorunsuz çalışıyor. Internet Explorer 8 sadece zor zamanlar veriyor.

Elinizde olabilecek her türlü yardım büyük beğeni topluyor. Teşekkürler!

UPDATE: Hızlı geri bildiriminiz için herkese teşekkürler. Hem Chris Pebble hem de Bryan Kyle bu çözümle yardımcı oldular. Bryan'a ününe yardımcı olmak için "cevabı" verdim. Herkese teşekkürler!

cevap

24

görünüyor düşünüyorum değeri var. window.event kullanmayı deneyebilirsiniz.

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

Onkeyup olayını da eklemeyi deneyin ve aynı işlevi arayın.

İPUCU: Bir mola ayarlamak için doSubmit'in başlangıcında debugger;'u ekleyebilirsiniz, daha sonra keyCode'u inceleyebilirsiniz.

+0

İlginç, "onkeyup" olayı bile 8. –

0

IE8 altında window.Event ait keyCode mülkiyet undefined ama window.event o aynı özellik (küçük harflerle e unutmayın) gibi IE8'de window.Event.keyCode işleri (şu anda bile test edemez)

7

Sadece önsezi, şunu deneyin: Böyle

var keyCode = e.keyCode ? e.keyCode : e.which; 
+0

Internet Explorer bu durumda yürütmüyor Bu, Internet Explorer 8 üzerinde çalıştı, ancak bu kodun üzerinde çalıştığı diğer tarayıcılarda çalışmadı. –

+0

Chris, lütfen aşağıdaki yorumuma bakın. Bryan'ın yardımıyla yardımın bunu çöz! Tekrar teşekkürler! –

0

Ya bir şey. var keyCode = e.which || e.keyCode;

1

Ben şahsen çok anahtarlı yaklaşımı tercih ederim. Bu, birden çok tuşun algılanmasına izin verir, aynı zamanda tek bir tuşa da aynıdır ve test ettiğim her tarayıcıda çalışır.

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 
} 

alternatif bir yöntem, her olay haritası subitems onkeydown ve onkeyup olayları ayırmak ve açıkça tanımlamak olacaktır:

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

Her iki şekilde çalışıyor. Şimdi, aslında tuş vuruşlarını tespit etmek için, hata düzeltmelerini içeren yöntem vardır:

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

map[keycode]CTRL için Enter için 13 veya 17 gibi belirli bir anahtar kodu, oluşturmaktadır.

map={} hat return false önler, örneğin, haşhaş Bookmarks'tan iletişim kutusu CTRL+D için kontrol ederken ederken, unfocusing durumlarda tuşların üzerine "tutma" dan tutmak için harita nesnesi temizler. Bazı durumlarda, onu e.preventDefault() ile değiştirmek isteyebilirsiniz, ancak çoğu durumda daha verimli olması için return false buldum. Sadece net bir bakış açısı elde etmek için CTRL+D ile deneyin. Ctrl, 17 ve D, 68'dur. return false satırı olmadan, Yer İmleri iletişim kutusunun görüntüleneceğine dikkat edin.

bazı örnekler izleyin: akılda tutulması gereken

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 
} 

Bir şey daha küçük kombinasyonları son gelmelidir olmasıdır. Her zaman if.else zincirinde her zaman daha büyük kombinasyonlar koyun, böylece Enter ve CTRL+ENTER için aynı anda bir uyarı alamazsınız.

Şimdi, "hepsini bir araya getir" için tam bir örnek. Kullanıcı SHIFT+? tuşlarına bastığında giriş yapmak ve kullanıcı ENTER tuşlarına bastığında giriş yapmak için talimatları içeren bir mesajı uyarmak istediğinizi varsayalım. Bu örnek de, bu IE'de çalışır anlamına da çapraz tarayıcı uyumludur: bazı özel tuşlar farklı motorları için farklı kodlara sahip

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 
} 

Not. Ancak test ettiğim gibi, şu anda bilgisayarımda bulunan Maxthon 3, Google Chrome, Internet Explorer (9 ve 8) ve Firefox da dahil olmak üzere her tarayıcıda çalışıyor.

Umarım bu yardımcı olmuştur.

Benim kodunda bu yolda çalıştı
3

:

var kcode = (window.event) ? event.keyCode : event.which; 
1

bu deneyin:

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