keydown,keypress,keyup三者之間的區別


最近看了Javascript高級教程中對過濾輸入的介紹,想實現比如電話號碼中不能包好非數值的字符,而相應文本中插入字符的操作是keypress事件,所以就想通過阻止這個事件的默認事件行為來阻止這個事件的默認行為來屏蔽此類字符,但是屏蔽之后所有的安檢操作都會被屏蔽,文本框會變成可讀的。如果只想屏蔽特定的字符,需要檢測keypress事件對應的字符編碼,然后決定如何響應。

但是我在利用keypree事件的時候,完全搞蒙了。因為前面看了keydown、keypress、keyup事件,它們到底怎么用呢?

下面是Js高級教程對三者的描述:
keydown:當用戶按下鍵盤上的任意鍵時觸發,如果按住不放的話,會重復觸發此事件;
keypress:當用戶按下鍵盤上的字符鍵時觸發,如果按住不讓的話,會重復觸發此事件;
keyup:當用戶釋放鍵盤上的字符鍵時觸發。

那么對應的keyCode(鍵碼)charCode(字符編碼)是什么樣子的呢?

  1. 在發生keydown和keyup事件時,event對象的keyCode屬性會包含一個代碼,與鍵盤上的一個特定的鍵對應。對數字字母鍵,keyCode屬性的值與ASCII碼中對應小寫字母或者數字的編碼相同,
  2. 發生keypress事件意味着按下的鍵會影響到屏幕中文本的顯示。在所有的瀏覽器中,按下能夠插入或者刪除字符的鍵都會觸發keypress事件。IE9,FireFox、Chrome和Safari的event對象都支持一個charCode屬性,這個屬性只有在發生keypress事件時,才包含值,而且這個值是按下的那個鍵所代表的字符的ASCII編碼。此時的keyCode通常等於0或者也可能等於所按鍵的鍵碼。

<input type="text" id="text1"/>
<script>
  var oTxt=document.getElementById("text1");
  oTxt.onkeyup=function getCharCode()
  {
    return false;
    if (typeof(event.CharCode)==="number")
    {

      alert(String.fromCharCode(event.charCode)) ;
    }
    else
    {
      alert(String.fromCharCode(event.keyCode));
    }
  };
</script>

比如上述的代碼,按下a就會顯示97,按下b會顯示98.
alert(String.fromCharCode(event.keyCode));會將其轉換成實際的字符,比如按下a則會顯示a,按下B則會x顯示b。String.fromCharCode():接收一個指定的unicode的值,返回一個字符串,該方法是String的靜態方法,不能自己電定義。
而三者之間的區別如下:(這里借鑒了一下貓在前端路上的博客,結合上面的理解,可能會好一點,后面我也會貼出他的博文):https://www.cnblogs.com/littlelan/archive/2013/03/28/2987851.html

按下鍵盤會觸發鍵盤事件,順序依次為:keydown->keypress->keyup.

  1. keydown、keypress、事件觸發在文字還沒敲進文本框,就像上面的keypress事件,只是按下字符鍵,顯示的結果,即得到的是觸發鍵盤事件前的文本。而keyup是事件觸發整個鍵盤事件的操作已經完成,獲得的是觸發鍵盤事件后的文本。

  2. keypress與keydown與keyup的主要區別:
    (1)對中文輸入法不友好,無法響應中文輸入;
    (2) 無法響應系統功能鍵(比如delete,backspace);
    (3) 由於前面兩個限制,keyCode與keydown和keyup不是很一致;

  3. 在keyup中無法是無法阻止瀏覽器的默認事件的,因為在keypress時,瀏覽器默認行為已經完成,即將輸入文本框(盡管這時還沒有顯示),這個時候不管是preventDefault還是return false,都不能阻止在文本框中輸入文字的行為,如要阻止在文本框中輸入文字,必須在keydown或者keypress時,即時阻止。

 

出處:https://blog.csdn.net/qq_26102281/article/details/83785085

===============================================================

按下鍵盤時會觸發鍵盤事件,順序為keydown -> keypress ->keyup。

1、keydown、keypress事件觸發在文字還沒敲進文本框,這時如果在keydown、keypress事件中輸出文本框中的文本,得到的是觸發鍵盤事件前的文本,而keyup事件觸發時整個鍵盤事件的操作已經完成,獲得的是觸發鍵盤事件后的文本

復制代碼
<input id="input" value="default" type="text" />
<script>
var input = document.getElementById('input');
input.onkeydown = function() {
    console.log('onkeydown ' + this.value);
}
input.onkeypress = function() {
    console.log('onkeypress ' + this.value);
}
input.onkeyup = function() {
    console.log('onkeyup ' + this.value);
}
</script>
復制代碼

在文本框中敲入數字1,輸出結果為:

onkeydown default
onkeypress default
onkeyup default1

 

2、keypress事件與keydown和keyup的主要區別

1)對中文輸入法支持不好,無法響應中文輸入

2)無法響應系統功能鍵(如delete,backspace)

3)由於前面兩個限制,keyCode與keydown和keyup不是很一直

 

3、在keyup事件中無法阻止瀏覽器默認事件,因為在keypress時,瀏覽器默認行為已經完成,即將文字輸入文本框(盡管這時還沒顯示),這個時候不管是preventDefault還是return false,都不能阻止在文本框中輸入文字的行為,如要阻止在文本框中輸入文字,必須在keydown或keypress時阻止

復制代碼
<input id="input" value="default" type="text" />
<script>
var input = document.getElementById('input');
input.onkeydown = function() {
    //return false;
    console.log('onkeydown ' + this.value);
}
input.onkeypress = function() {
    //return false;
    console.log('onkeypress ' + this.value);
}
input.onkeyup = function() {
    return false;
    console.log('onkeyup ' + this.value);
}
</script>
復制代碼

結果為keydown、keypress事件中return false文本框無法輸入文字,在keyup事件中return false文本框可以輸入文字

 

4、textInput事件

文本框的鍵盤響應事件把textInpput也加進來,觸發的順序為:keydown -> keypress ->textInput -> keyup

textInput事件是DOM3后支持的,主要用來替換keypress,與keypress的主要差別在於添加了對中文輸入法的支持,還有一點就是textInput只在可編輯文本區才能觸發(如input、textarea),而keypress是任何能獲得焦點的控件的能觸發(如button),但是textInput事件的支持還不是很好,目前只有safari、chrome支持。

 

 

出處:https://www.cnblogs.com/littlelan/archive/2013/03/28/2987851.html

=================================================================

C# 如何捕獲鍵盤按鈕和組合鍵以及KeyPress/KeyDown事件之間的區別 (附KeyChar/KeyCode值)

1. 首先將窗口屬性KeyPreview設為true,如果屬性對話框中找不到,就直接在代碼里添加; 
2. 添加KeyPress / KeyDown事件: 

1、KeyPress 和KeyDown 、KeyPress之間的區別
    1)KeyPress主要用來捕獲數字(注意:包括Shift+數字的符號)、字母(注意:包括大小寫)、小鍵盤等除了F1-12、SHIFT、Alt、Ctrl、Insert、Home、PgUp、Delete、End、PgDn、ScrollLock、Pause、NumLock、{菜單鍵}、{開始鍵}和方向鍵外的ANSI字符 
        KeyDown 和KeyUp 通常可以捕獲鍵盤除了PrScrn所有按鍵(這里不討論特殊鍵盤的特殊鍵) 
    2)KeyPress 只能捕獲單個字符 
        KeyDown 和 KeyUp 可以捕獲組合鍵。 
    3)KeyPress 可以捕獲單個字符的大小寫 
    4)KeyDown和KeyUp 對於單個字符捕獲的KeyValue 都是一個值,也就是不能判斷單個字符的大小寫。 
    5)KeyPress 不區分小鍵盤和主鍵盤的數字字符。 
        KeyDown 和KeyUp 區分小鍵盤和主鍵盤的數字字符。 
    6)其中PrScrn 按鍵KeyPress、KeyDown和KeyUp 都不能捕獲。 

2、KeyPress事件

Winform文本框只能輸入數字和退格鍵和小數點:

復制代碼
private void TextBox_KeyPress(object sender, KeyPressEventArgs e)
{
    if (e.KeyChar != 8 && !Char.IsDigit(e.KeyChar) && e.KeyChar != '.')
    {
        e.Handled = true;
    }
}
//或者 
private void TextBox_KeyPress(object sender, KeyPressEventArgs e)
{
    if (e.KeyChar != '\b' && !Char.IsDigit(e.KeyChar) && e.KeyChar != '.')
    {
        e.Handled = true;
    }
}
復制代碼

 

3、KeyChar取值:

另外2個特殊ASCII碼:回車=13,換行=10,退格='\b' 或者 退格=8

 

4、KeyDown事件:

捕獲單個按鍵:

復制代碼
private void Form1_KeyDown(object sender, KeyEventArgs e) 
{ 
       Keys key = e.KeyCode; 
       if (e.Control!=true)//如果沒按Ctrl鍵 
return; 
       switch (key) 
       { 
            case Keys.NumPad0: 
                //按下小鍵盤0以后 
                break; 
            case Keys.NumPad1: 
                //按下小鍵盤1以后 
                break; 
            case Keys.S: 
                //按下S鍵以后 
                break; 
            case Keys.Up: 
                //按下向下鍵以后 
                break; 
       } 
} 
復制代碼

捕獲組合鍵(以全選為例):

復制代碼
private void textBox1_KeyDown(object sender, KeyEventArgs e)
{
    if (e.Control && e.KeyCode == Keys.A)
    {
        (sender as TextBox).SelectAll();
    }
}
復制代碼

 

5、KeyCode取值: 

keycode    8 = BackSpace BackSpace 
keycode    9 = Tab Tab 
keycode   12 = Clear 
keycode   13 = Enter 
keycode   16 = Shift_L 
keycode   17 = Control_L 
keycode   18 = Alt_L 
keycode   19 = Pause 
keycode   20 = Caps_Lock 
keycode   27 = Escape Escape 
keycode   32 = space space 
keycode   33 = Prior 
keycode   34 = Next 
keycode   35 = End 
keycode   36 = Home 
keycode   37 = Left 
keycode   38 = Up 
keycode   39 = Right 
keycode   40 = Down 
keycode   41 = Select 
keycode   42 = Print 
keycode   43 = Execute 
keycode   45 = Insert 
keycode   46 = Delete 
keycode   47 = Help 
keycode   48 = 0 equal braceright 
keycode   49 = 1 exclam onesuperior 
keycode   50 = 2 quotedbl twosuperior 
keycode   51 = 3 section threesuperior 
keycode   52 = 4 dollar 
keycode   53 = 5 percent 
keycode   54 = 6 ampersand 
keycode   55 = 7 slash braceleft 
keycode   56 = 8 parenleft bracketleft 
keycode   57 = 9 parenright bracketright 
keycode   65 = a A 
keycode   66 = b B 
keycode   67 = c C 
keycode   68 = d D 
keycode   69 = e E EuroSign 
keycode   70 = f F 
keycode   71 = g G 
keycode   72 = h H 
keycode   73 = i I 
keycode   74 = j J 
keycode   75 = k K 
keycode   76 = l L 
keycode   77 = m M mu 
keycode   78 = n N 
keycode   79 = o O 
keycode   80 = p P 
keycode   81 = q Q at 
keycode   82 = r R 
keycode   83 = s S 
keycode   84 = t T 
keycode   85 = u U 
keycode   86 = v V 
keycode   87 = w W 
keycode   88 = x X 
keycode   89 = y Y 
keycode   90 = z Z 
keycode   96 = KP_0 KP_0 
keycode   97 = KP_1 KP_1 
keycode   98 = KP_2 KP_2 
keycode   99 = KP_3 KP_3 
keycode 100 = KP_4 KP_4 
keycode 101 = KP_5 KP_5 
keycode 102 = KP_6 KP_6 
keycode 103 = KP_7 KP_7 
keycode 104 = KP_8 KP_8 
keycode 105 = KP_9 KP_9 
keycode 106 = KP_Multiply KP_Multiply 
keycode 107 = KP_Add KP_Add 
keycode 108 = KP_Separator KP_Separator 
keycode 109 = KP_Subtract KP_Subtract 
keycode 110 = KP_Decimal KP_Decimal 
keycode 111 = KP_Divide KP_Divide 
keycode 112 = F1 
keycode 113 = F2 
keycode 114 = F3 
keycode 115 = F4 
keycode 116 = F5 
keycode 117 = F6 
keycode 118 = F7 
keycode 119 = F8 
keycode 120 = F9 
keycode 121 = F10 
keycode 122 = F11 
keycode 123 = F12 
keycode 124 = F13 
keycode 125 = F14 
keycode 126 = F15 
keycode 127 = F16 
keycode 128 = F17 
keycode 129 = F18 
keycode 130 = F19 
keycode 131 = F20 
keycode 132 = F21 
keycode 133 = F22 
keycode 134 = F23 
keycode 135 = F24 
keycode 136 = Num_Lock 
keycode 137 = Scroll_Lock 
keycode 187 = acute grave 
keycode 188 = comma semicolon 
keycode 189 = minus underscore 
keycode 190 = period colon 
keycode 192 = numbersign apostrophe 
keycode 210 = plusminus hyphen macron 
keycode 211 = 
keycode 212 = copyright registered 
keycode 213 = guillemotleft guillemotright 
keycode 214 = masculine ordfeminine 
keycode 215 = ae AE 
keycode 216 = cent yen 
keycode 217 = questiondown exclamdown 
keycode 218 = onequarter onehalf threequarters 
keycode 220 = less greater bar 
keycode 221 = plus asterisk asciitilde 
keycode 227 = multiply division 
keycode 228 = acircumflex Acircumflex 
keycode 229 = ecircumflex Ecircumflex 
keycode 230 = icircumflex Icircumflex 
keycode 231 = ocircumflex Ocircumflex 
keycode 232 = ucircumflex Ucircumflex 
keycode 233 = ntilde Ntilde 
keycode 234 = yacute Yacute 
keycode 235 = oslash Ooblique 
keycode 236 = aring Aring 
keycode 237 = ccedilla Ccedilla 
keycode 238 = thorn THORN 
keycode 239 = eth ETH 
keycode 240 = diaeresis cedilla currency 
keycode 241 = agrave Agrave atilde Atilde 
keycode 242 = egrave Egrave 
keycode 243 = igrave Igrave 
keycode 244 = ograve Ograve otilde Otilde 
keycode 245 = ugrave Ugrave 
keycode 246 = adiaeresis Adiaeresis 
keycode 247 = ediaeresis Ediaeresis 
keycode 248 = idiaeresis Idiaeresis 
keycode 249 = odiaeresis Odiaeresis 
keycode 250 = udiaeresis Udiaeresis 
keycode 251 = ssharp question backslash 
keycode 252 = asciicircum degree 
keycode 253 = 3 sterling 
keycode 254 = Mode_switch 
View Code

 

6、如何獲取鍵盤按鈕的keyChar值(keyCode同理)

private void Form1_KeyPress(object sender, KeyPressEventArgs e)  
{  
    char Key_Char = e.KeyChar;//判斷按鍵的 Keychar  
    MessageBox.Show(((int)(Key_Char)).ToString());//轉成整數顯示
} 

 

 

出處:https://www.cnblogs.com/feiyuhuo/p/5060773.html

==================================================================

雖然從字面理解, KeyDown是按下一個鍵的意思, 但實際上二者的根本區別是, 系統由KeyDown返回鍵盤的代碼, 然后由TranslateMessage函數翻譯成成字符, 由KeyPress返回字符值. 因此在KeyDown中返回的是鍵盤的代碼, 而KeyPress返回的是ASCII字符. 所以根據你的目的, 如果只想讀取字符, 用KeyPress, 如果想讀各鍵的狀態, 用KeyDown. 

 

keydown:用戶在鍵盤上按下某按鍵是發生。一直按着某按鍵則會不斷觸發(opera瀏覽器除外)。
keypress:用戶按下一個按鍵,並產生一個字符時發生(也就是不管類似shift、alt、ctrl之類的鍵,就是說用戶按了一個能在屏幕上輸出字符的按鍵keypress事件才會觸發)。一直按着某按鍵則會不斷觸發。
keyup:用戶釋放某一個按鍵是觸發。

 

定義和用法

完整的 key press 過程分為兩個部分:1. 按鍵被按下;2. 按鍵被松開。

當按鈕被按下時,發生 keydown 事件。

keydown() 方法觸發 keydown 事件,或規定當發生 keydown 事件時運行的函數。

 

[html] 
  1. <html>  
  2. <head>  
  3. <script type="text/javascript" src="/jquery/jquery.js"></script>  
  4. <script type="text/javascript">  
  5. $(document).ready(function(){  
  6.   $("input").keydown(function(){  
  7.     $("input").css("background-color","#FFFFCC");  
  8.   });  
  9.   $("input").keyup(function(){  
  10.     $("input").css("background-color","#D6D6FF");  
  11.   });  
  12. });  
  13. </script>  
  14. </head>  
  15. <body>  
  16. Enter your name: <input type="text" />  
  17. <p>當發生 keydown 和 keyup 事件時,輸入域會改變顏色。請試着在其中輸入內容。</p>  
  18. </body>  
  19. </html>  

 

中所周知,jquery封裝了很多事件交互方法,這里講到的問題在原生js中也是有的。

keyup是在用戶將按鍵抬起的時候才會觸發的,屬於整個按鍵過程中的最后階段,所以有其特定的用處,就是在左側輸入,右側同步顯示的過程中很有用處。典型的例子就是郵件編輯預覽的應用。

[html]  view plain copy
 
  1. <html xmlns="http://www.w3.org/1999/xhtml">  
  2. <head>  
  3.     <title>無標題頁</title>  
  4.   
  5.     <script src="JS/jquery-1.4.2.js" type="text/javascript"></script>  
  6.   
  7.     <script type="text/javascript">  
  8.         $(function() {  
  9.             $('#t1').live('keyup', function() {  
  10.                 $('#v1').text($(this).val());  
  11.             });  
  12.             $('#t2').live('keydown', function() {  
  13.                 $('#v2').text($(this).val());  
  14.             });  
  15.             $('#t3').live('keypress', function() {  
  16.                 $('#v3').text($(this).val());  
  17.             });  
  18.         });      
  19.     </script>  
  20.   
  21. </head>  
  22. <body>  
  23.     <textarea id="t1"></textarea>  
  24.     <div id="v1">  
  25.     </div>  
  26.     <textarea id="t2"></textarea>  
  27.     <div id="v2">  
  28.     </div>  
  29.     <textarea id="t3"></textarea>  
  30.     <div id="v3">  
  31.     </div>  
  32. </body>  
  33. </html>  

這里分別應用了三種事件,其中t1能夠完整的同步到v1中,而keypress和keydown總是少最后一個字符,這樣就說明了這三種事件觸發的小小區別,keydown是在按下時觸發,不能得到最后的輸入結果,keypress也是一樣。

 

例如:keydown綁定文本框,每次點擊觸發事件,在獲取文本框的值,總是打印上次操作時文本框的內容,

這是因為keydown操作后,事件觸發了,但值還未顯示在文本框中,所以這類操作要用keyup 一個完整的按鍵動作后,才可以獲取文本框的值。

 

 keydown與keypress更適用於通過鍵盤控制頁面類功能的實現。

獲取鍵盤點擊的鍵位:

[html]  view plain copy
 
  1. <html>  
  2. <head>  
  3. <script type="text/javascript" src="/jquery/jquery.js"></script>  
  4. <script type="text/javascript">  
  5. $(document).ready(function(){  
  6.   $("input").keydown(function(event){   
  7.     $("div").html("Key: " + event.which);  
  8.   });  
  9. });  
  10. </script>  
  11. </head>  
  12. <body>  
  13.   
  14. 請隨意鍵入一些字符:<input type="text" />  
  15. <p>當您在上面的框中鍵入文本時,下面的 div 會顯示鍵位序號。</p>  
  16. <div />  
  17.   
  18. </body>  
  19. </html>

 

出處:https://blog.csdn.net/z69183787/article/details/25700837


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM