2009-10-28 39 views
9

Bir düğmem ve aşağıdaki javascript yordamım var. Bunu anlaşılacağı gibiNeden geri arama işlemi yanlış yapıldığında geri arama geri çağırma düğmesi tıklama etkinliğini durdurmuyor?

$("button").keydown(function(key) { 
    switch(key.keyCode) { 
    case 32: //space 
    return false; 
    } 
}); 

, return false; işlenmekte tuşa basma durdurmak olacaktır. Yani $("button").click(); çağrılmayacaktı. Diğer keyCodes için bu beklendiği gibi çalışır. Örneğin, aşağı tuşu olan 40'u kesiyorsam sayfa ilerlemiyor.

Bu davranışı firefox'ta gördüm.

return false; neden boşluktaki tıklama olayını durdurmuyor? Javascript özellikleri bunun hakkında ne söylüyor?

+1

Gerçek kodunuzda "geri dönüş" yazıyor mu? Eğer öyleyse, bu senin problemin olabilir. fale'nın. – rmeador

+0

Kod snippet'inizde "get fale;" - Bu kod mevcut mu? eğer öyleyse bu bir düz yazım hatasıdır. – artlung

+0

Hayır Hayır Gerçek kodum yanlış döndürüyor. Aslında bu kodu aşağıdakine benzer diğer düğmeleri engellemek için kullanıyorum ve onlar için çalışıyor. – johannes

cevap

13

Umut bu sorunuza yanıt HTML'de bir etkinlik işleyicisi özniteliğinin sonunda çağrılırsa tarayıcılar arasında bir etkinlik. Bu davranış, bildiğim kadarıyla herhangi bir yerde resmi olarak belirtilmemiş.

yerine DOM öğesi (örneğin button.onkeydown = function(evt) {...}) ya da kullanma konusunda bir olay işleyicisi mülkiyet yoluyla etkinlik ayarlarsanız addEventListener/attachEvent (örn button.addEventListener("keydown", function(evt) {...}, false)) sonra sadece her tarayıcıda çalışmadığını işlevinden false dönen ve yapmanız gereken Diğer yanıtımdan returnValue ve preventDefault() şeyler. preventDefault, DOM 2 spec numaralı belgede belirtilmiştir ve çoğu genel modern tarayıcı tarafından uygulanır. returnValue, IE'ye özgüdür.

+0

Asp.net formumda, sayfa yenilemesinden hala çıkılıyor. – Si8

+1

@ Si8: Yukarıdaki 'doOtherStuff() 'eşdeğiniz, bir hata atarsa ​​bu olabilir. –

6

İlk olarak, boşluk gibi yazdırılabilir bir karakter tespit ediyorsanız, keypress etkinliğiyle daha iyi durumda olursunuz. İkincisi, varsayılan eylemi engellemenin yolu, IE olmayan tarayıcılarda olayla ilgili preventDefault() numaralı telefonu aramak ve etkinliğin returnValue özelliğini IE'de false olarak ayarlamaktır.

var button = document.getElementById("button"); 
button.onkeypress = function(evt) { 
    evt = evt || window.event; 
    var charCode = evt.keyCode || evt.which; 
    if (charCode == 32) { 
     if (evt.preventDefault) { 
      evt.preventDefault(); 
     } else { 
      evt.returnValue = false; 
     } 
    } 
}; 

Bir jQuery uzman değilim ve ben sizin için olayı elde ilgilenir varsayalım:

<input type="button" value="Press" onkeydown="doOtherStuff(); return false;"> 

return false; başarıyla iptal:

$("button").keypress(function(evt) { 
    var charCode = evt.keyCode || evt.which; 
    if (charCode == 32) { 
     if (evt.preventDefault) { 
      evt.preventDefault(); 
     } else { 
      evt.returnValue = false; 
     } 
    } 
}); 
+0

Test ettim ve 'key.preventDefault();', firefox'taki hiçbir şeyi değiştirmez. 'keydown' yazdırılabilir karakterler üreten tuşları algılar, bu yüzden 'keydown' ile yanlış olan nedir? – johannes

+0

Tamam. Düğmeyi üreten HTML nedir? Tuşa basılan işleyicinin çağrıldığından emin misiniz? Boşluk durumunda, muhtemelen 'keydown' ve 'keyCode' 32'yi kullanmanız yeterlidir, ancak genellikle 'keypress' kullanılarak yazdırılabilir karakterlerle klavyeden veya diğer giriş aygıtları arasındaki olası farklar, Bir giriş cihazındaki bir tuşa karşılık gelen bir kod yerine tuşa basma. –

+0

@Tim: OP'lerin orijinal kod örneği, etkinliği iptal etmek için geçerli bir jQuery öğesidir.Bu durumda, her zamanki çapraz tarayıcı kod anahtarının hiçbiri gerekli değildir. –