2012-06-29 66 views
1

我正在試圖防止某些鍵被輸入到輸入框,但只有特定的鍵被按下轉變鍵被防止按鍵同時shift鍵舉行

$('selector').keydown(function(e) { 
    console.log(e.shiftKey); 
    if (e.shiftKey && e.which == 51) { 
    e.preventDefault(); 
    alert('Disallowed'); 
    } 
}); 

警報觸發但字符仍顯示在文本框中。

我試着四處尋找解釋,爲什麼會發生這種情況,但無濟於事,任何幫助將不勝感激!

編輯

卸下alert似乎解決這個問題(這似乎奇怪的),我真的很想知道爲什麼這樣的行爲雖然,它似乎沒有任何意義。

感謝

+0

用'return false'代替'e.preventDefault();'會做這個工作 – Teneff

+0

我試過了,它似乎不工作: – billyonecan

+0

http://jsfiddle.net/GEngv/工作得很好(在Firefox中)! – rodneyrehm

回答

2

如果現在的問題是:爲什麼alert()有所作爲?

alert是一個有趣的語句(和confirmprompt),它暫停您的JavaScript的執行,但釋放了任何其他等待您的JavaScript執行的瀏覽器處理。它會干擾調試相當多。

瀏覽器將不會對您preventDefault()發言作出反應,直到你的JavaScript已經完成,將在alert有已暫停你的JavaScript,因此瀏覽器並沒有在這一點上接收到的事件的返回狀態,而不幸的是,alert已允許瀏覽器處理其他事件,即keypress,該事件潛行過去,因此您看到不想輸入的字符出現。

你不能使用alert,或者,如果你需要它(?!),你可以發佈它包裹在一個setTimeout,所以它不會阻止你的JavaScript和​​的結果將導致keypress之中抑制。

-

或者,您可以首先使用了keypress

$('selector').keypress(function(e) { 
    console.log(e.shiftKey); 
    if (e.which == 163) { 
    e.preventDefault(); 
    alert('Disallowed'); 
    } 
}); 

儘管如此,這仍然不能阻止字符被替代方法輸入,所以我個人不會首先考慮到這一點。 : -/

5

只需使用e.which,而不是e.keyCode

$('#input').keydown(function(e) { 
    if (e.shiftKey && e.which == 51) { 
    e.preventDefault(); 
    alert('Disallowed'); 
    } 
}); 

Working sample

,因爲從jQuery的文檔:

對於鍵或鼠標事件,此屬性指示特定鍵或 按鈕是pressed.The event.which財產歸event.keyCodeevent.charCode。建議觀看事件,其中用於鍵盤按鍵輸入。 event.which也歸按鈕按壓(鼠標按下和mouseupevents),報告1左按鈕2中間,和3爲右。使用event.which而不是event.button

如果你想刪除輸入英鎊符號上.keyup()

$('#input').keyup(function(e) { 
    var val = $.trim(this.value); 
    if (e.shiftKey && e.which == 51) { 
    $(this).val(val.replace(/\#/,'')); 
    } 
}); 

DEMO

試試這個,然後嘗試:

$(this).val(val.replace(/\u00A3/g, '')); 

的完整代碼

$('#input').keyup(function(e) { 
    var val = $.trim(this.value); 
    if (e.shiftKey && e.which == 51) { 
    $(this).val(val.replace(/\u00A3/g, '')); 
    } 
}); 
+0

它不適用於我:|儘管警報顯示,角色仍然出現在框中。我已經在Chrome 19.x和FF 14.x中進行了測試,感謝有關'e.which'的信息,我從現在開始使用它! +1 – billyonecan

+0

@deifwud請檢查我的第二個演示 – thecodeparadox

+0

與此相同的東西,字符仍然出現在文本框中:/ – billyonecan

1
$('#selector').keydown(function(e) { 
    console.log(e.shiftKey); 
    if (e.shiftKey && e.keyCode == 51) { 
    $(this).prop('disabled', true); 
    //do something, fade an object in...display a message, etc 
    setTimeout(function(){ 
     $(this).prop('disabled', false); 
    }, 500); 
    } 
}); 

這對我的作品。

編輯

新增setTimeout函數來複制你的願望。

+0

這工作,直到我刪除警報:( – billyonecan

+0

條件化語句,禁用屬性,然後把setTimeout並重新啓用它。 – Ohgodwhy

+0

@deifwud請參閱更新。 – Ohgodwhy