1. 程式人生 > >input text控制元件的onkeydown、onKeyPress、onkeyup事件的區別

input text控制元件的onkeydown、onKeyPress、onkeyup事件的區別

input text輸入框的這三個鍵盤響應事件看似是差不多的,實際上他們的執行事件還是有區別的,經過了半天的各種嘗試(這裡實際上就是想做一個能將金錢數額利用js轉換成為大寫的功能),遇到的問題就是每次都是無法在第一次就獲取input的value,一開始被迫使用了onblur和onchange。

但是這樣使用者體驗太差了,所以我就測試題目上三種的不同,首先down這個是按下後就相應了,基本上比較適合做遊戲的上下左右。

第二種press,這個是按下並鬆開後相應,這裡需要提示,利用這個事件,在最開始獲取到的input的值是空,因為數值還沒有來得及寫入input。

第三種up,這個是相應最好的,也就是鬆開後,值寫入到了input然後執行,也就是我所需要的。

這裡分享下js程式碼,也是網上參考的不過寫的真的不錯各種情況

JS實現數字轉換為貨幣漢字大寫數字的方法詳解

  1. function Chinese(num){     
  2. if(!/^\d*(\.\d*)?$/.test(num))throw(new Error(-1, "Number is wrong!"));     
  3. var AA = new Array("零","壹","貳","叄","肆","伍","陸","柒","捌","玖");     
  4. var BB = new Array("","拾","佰","仟","萬","億","圓","");     
  5. var CC = new Array(
    "角""分""釐");     
  6. var a = (""+ num).replace(/(^0*)/g, "").split("."), k = 0, re = "";     
  7. for(var i=a[0].length-1; i>=0; i--){     
  8. switch(k){     
  9. case 0 : re = BB[7] + re; break;     
  10. case 4 : if(!new RegExp("0{4}\\d{"+ (a[0].length-i-1) +"}$").test(a[0]))     
  11.                          re = BB[4] + re; break
    ;     
  12. case 8 : re = BB[5] + re; BB[7] = BB[5]; k = 0; break;     
  13.         }     
  14. if(k%4 == 2 && a[0].charAt(i)=="0" && a[0].charAt(i+2) != "0") re = AA[0] + re;     
  15. if(a[0].charAt(i) != 0) re = AA[a[0].charAt(i)] + BB[k%4] + re; k++;     
  16.     }     
  17. if(a.length>1){     
  18.         re += BB[6];     
  19. for(var i=0; i<a[1].length; i++){     
  20.             re += AA[a[1].charAt(i)] + CC[i];     
  21. if(i==2) break;     
  22.         }   
  23. if(a[1].charAt(0)=="0" && a[1].charAt(1)=="0"){  
  24.             re+="元整";  
  25.         }    
  26.     }else{  
  27.         re+="元整";  
  28.     }     
  29. return re;     

-------------------原始碼解析---------------------------------
function conver(num)  

  { 
          var AA = new Array("零","壹","貳","叄","肆","伍","陸","柒","捌","玖");   ////先建立一個數組放入是個大寫數字

          var BB = new Array("","拾","佰","仟","萬","億","圓","");   ////在將圓以上單位放入一個數組中

          var CC = new Array("角", "分", "釐");   ///將圓以下單位放入一個數組中

          var a = (""+num).replace(/(^0*)/g, "").split("."), k = 0, re = ""; //兩個“/###/”之間定義了正則表示式
  //以若干個0開始的數字,前面的0全部以空替換。如何00023就被轉換為23,之後再以"."分割,所以這裡的a是一個數組元素
  //在定義兩個元素,一個 k 一個是 re。
          for(var i=a[0].length-1; i>=0; i--)   /////這裡是轉換整數的情況

          {  

                  switch(k)   ///判斷當k等於0/4/8的情況,

                  {  

                          case 0 : re = BB[7] + re; break;   ///當k等於0時,re就定於“”

                          case 4 : if(!new RegExp("0{4}\\d{"+ (a[0].length-i-1) +"}$").test(a[0])) ///RegExp是建立正則表示式的物件
     //test 方法 返回一個 Boolean 值,它指出在被查詢的字串中是否存在模式。
     //這個判斷條件的意思就是判斷這個RegExp物件在a[0]中是否出現過也就是“0{4}\d{4}”這個正則是否在a[0]中出現
     //如果出現條件為假整個四位萬位都為空,就不用寫萬位了。直接從億到到千,如200002325就讀二億兩千三百二十五
                                            re = BB[4] + re; break;   ///當k等於4時,re等於“萬” 如果條件為真執行這條語句

                          case 8 : re = BB[5] + re; BB[7] = BB[5]; k = 0; break; ///判斷如果超過億就另說了!哇哈哈 

                  }  

                  if(k%4 == 2 && a[0].charAt(i)=="0" && a[0].charAt(i+2) != "0") re = AA[0] + re;   
   ///當k除4餘2和a[0]的第i個元素等於0還有a[0]的第i+2個元素不等於0同時成立時,re就等於AA[0]+re


                  if(a[0].charAt(i) != 0) re = AA[a[0].charAt(i)] + BB[k%4] + re; k++;   
   ///如果a[0]第i個元素不等於0;就讓re等於(陣列AA下標等於a[0].charAt(i)的元素 + 陣列BB[k%4]的元素 + re)然後讓k++,

   ///*例如當輸入      903205034.12      時,
  ///第一輪迴圈 i=8  
   switch(k)中k=0,先得到re="";
   然後執行if(k%4 == 2 && a[0].charAt(i)=="0" && a[0].charAt(i+2) != "0")判斷了條件為假跳過往下執行
   執行 if(a[0].charAt(i) != 0) re = AA[a[0].charAt(i)] + BB[k%4] + re; k++; 判斷條件為真執行if語句
   得到AA[4] + BB[0%4] + ""; k=1;得到re="肆"
  ///第二輪迴圈 i=7  
   switch(k)中k=1,沒有匹配的case;跳過switch往下執行
   然後執行if(1%4 == 2 && a[0].charAt(7)=="0" && a[0].charAt(7+2) != "0")判斷了條件為假跳過往下執行
   執行 if(a[0].charAt(7) != 0) re = AA[a[0].charAt(7)] + BB[1%4] + re; k++; 判斷條件為真執行if語句
   得到AA[3] + BB[1] + "肆"; k=2;得到re="叄"+"拾"+"肆"
  ///第三輪迴圈 i=6 
   switch(2)沒有匹配的case;跳過switch往下執行
   然後執行if(2%4 == 2 && a[0].charAt(6)=="0" && a[0].charAt(6+2) != "0")判斷了條件為真往下執行
   re = AA[0] + "叄"+"拾"+"肆"; re="零" + "叄"+"拾"+"肆"
   執行 if(a[0].charAt(6) != 0) re = AA[a[0].charAt(6)] + BB[2%4] + re; k++; 判斷條件為假跳回
  ///第四輪迴圈 i=5 
   switch(3)沒有匹配的case;跳過switch往下執行
   然後執行if(3%4 == 2 && a[0].charAt(6)=="0" && a[0].charAt(6+2) != "0")判斷了條件為假跳過往下執行
   執行 if(a[0].charAt(5) != 0) re = AA[a[0].charAt(5)] + BB[3%4] + re; k++; 判斷條件為真執行if語句
   得到AA[5] + BB[3] + "叄"+"拾"+"肆"; k=4;得到re="伍"+"仟"+"零"+"叄"+"拾"+"肆"
  ///第五輪迴圈 i=4 
   switch(4)匹配的case=4;執行
   然後執行if(3%4 == 2 && a[0].charAt(6)=="0" && a[0].charAt(6+2) != "0")判斷了條件為假跳過往下執行
   執行 if(a[0].charAt(5) != 0) re = AA[a[0].charAt(5)] + BB[3%4] + re; k++; 判斷條件為真執行if語句
   得到AA[5] + BB[3] + "叄"+"拾"+"肆"; k=4;得到re="伍"+"仟"+"零"+"叄"+"拾"+"肆"
  以此類推..........最後得到re=镹億零三百二十萬五千零三十四*/
  
   

          }   
  
          if(a.length>1) //加上小數部分(如果有小數部分)這個是轉換小數點後面的幾位

          {

                  re += BB[6];     //镹億零三百二十萬五千零三十四+圓

                  for(var i=0; i<a[1].length; i++)  

                  {  

                      re += AA[a[1].charAt(i)] + CC[i];

                      if(i==2) break;  

                  }     ///迴圈結束後re=镹億零三百二十萬五千零三十四圓一角二分
   if(a[1].charAt(0)=="0" && a[1].charAt(1)=="0")///這個if是判斷如果沒有角和分只有釐則忽略釐加上元整

   {

   re+="元整";
 
   } 

          }

  else  ///如果不帶小數也輸出

  {

   re+="元整";

  }  

          return re;   //最後返回“镹億零三百二十萬五千零三十四圓一角二分元整”

  }


然後我還加入了一些需要的方法:


判斷了是否為空。

以上的註釋寫的很詳細了,只要能瞭解正則表示式就能很好的瞭解作者是如何實現的。

其中需要的知識主要是

jquery

javascript

正則表示式符號含義

其中輸入框限制只能輸入數字和小數點:

<input onkeypress="return (/[/d.]/.test(String.fromCharCode(event.keyCode)))" style="ime-mode:Disabled" />

參考來自

不能輸入中文
 <input type="text" name="textfield"  onkeyup="this.value=this.value.replace(/[^/da-z_]/ig,'');"/>
只能輸入 數字和下劃線
<input onkeypress="return (/[/d_]/.test(String.fromCharCode(event.keyCode)))" style="ime-mode:Disabled" />
只能輸入 數字和小數點
<input onkeypress="return (/[/d.]/.test(String.fromCharCode(event.keyCode)))" style="ime-mode:Disabled" />

 只允許輸入漢字</br>
<input name="username" type="text" onkeyup="value=value.replace(/[^/u4E00-/u9FA5]/g,'')">


其一,只允許輸入數字和小數點。
<input onKeypress="return (/[/d.]/.test(String.fromCharCode(event.keyCode)))" style="ime-mode:Disabled">

其二,判斷的更詳細一些,甚至22..2這樣不算數字也判斷得出來

<script>
function check(){
if (isNaN(tt.value))
{alert("非法字元!");
tt.value="";}
}
</script>
<input type="text" name="tt" onkeyup="check();">

其三,只允許輸入整數。其實也完全可以根據第三條來舉一反三做一些限制。

<script language=javascript>
function onlyNum()
{
if(!(event.keyCode==46)&&!(event.keyCode==8)&&!(event.keyCode==37)&&!(event.keyCode==39))
if(!((event.keyCode>=48&&event.keyCode<=57)||(event.keyCode>=96&&event.keyCode<=105)))
event.returnValue=false;
}
</script><input onkeydown="onlyNum();" style="ime-mode:Disabled>
結語,其實

style="ime-mode:Disabled
這句是比較實用的。意為關閉輸入法。省得有些人開著全形輸入數字,結果輸入不進去來找你哭天抹淚的,還怪你設計的不好。

只允許輸入數字
<input name="username" type="text" onkeyup="value=this.value.replace(//D+/g,'')">

只允許輸入英文字母、數字和下劃線(以下二種方法實現)
<input name="username" type="text" style="ime-mode:disabled">
<input name="username" type="text" onkeyup="value=value.replace(/[^/w/.//]/ig,'')">

只允許輸入英文字母、數字和&[email protected]
<input name="username" type="text" onkeyup="value=value.replace(/[^/[email protected]&]|_/ig,'')">

只允許輸入漢字
<input name="username" type="text" onkeyup="value=value.replace(/[^/u4E00-/u9FA5]/g,'')">


以上都極為常用,僅供參考

相關推薦

input text控制元件onkeydownonKeyPressonkeyup事件區別

input text輸入框的這三個鍵盤響應事件看似是差不多的,實際上他們的執行事件還是有區別的,經過了半天的各種嘗試(這裡實際上就是想做一個能將金錢數額利用js轉換成為大寫的功能),遇到的問題就是每次都是無法在第一次就獲取input的value,一開始被迫使用了onblur

MFC中設定static text控制元件的背景色字型字號和顏色

在實際的應用中,可以用WM_CTLCOLOR 訊息改變mfc中控制元件的顏色,比如現在就來改變一個static text控制元件的 字型、字型大小、字型顏色和背景色。 例如對話方塊的類為CTestDlg. 1. 在對話方塊的類中新增兩個變數. 方法:在classview選項卡中,選擇CTestDlg,右鍵,

QT學習day04---Input Widgets控制元件(Text Edit(Double)Spin BoxDate/time EditDial)

此篇學習以下控制元件:  一、Text Edit 文字框:一個文字框,可以輸入內容 //常用函式 toPlainText();//得到文字內資料,返回值為QString ui介面雙擊可以進行

Python——EntryText控制元件

    background(bg)  :    文字框背景色;     foreground(fg)    :    前景色;     

winform控制元件縮寫(八九)水晶報表和其他

winform控制元件縮寫(八)水晶報表 序號 縮寫 空間名 1 crv CrystalReportViewer 2 rpd

機房收費系統之收取金額查詢(TPicker控制元件時間段取值SQL語句中單引號與雙引號區別

        收取金額查詢窗體較組合查詢而言就是小菜一碟,但即便是內容較少也有其精華之處,現在分享一下我的學習過程吧^_^ 一、收取金額查詢窗體的流程圖: 二、問題集 這是什麼錯誤呢,為什麼會出現這個型別的錯誤? 產生此問題的程式碼部分是什麼樣子的呢? 以

WebBrowser控制元件頁面內容放大縮小功能實現

在開發Winform程式中的WebBrowser控制元件時想要實現頁面內容放大、縮小功能,由於IE版本問題,WebBrowser中沒有Ctrl+滾輪實現放大、縮小頁面內容的功能,只能自己實現了。 實現具體程式碼如下: 1。在引用中引用COM元件Microsoft Inte

Android開發:如何在選單中呼叫控制元件(如ButtonTextView……)

當我們在類內定義控制元件的全域性變數時,如Button……,只能在onCreate()中初始化,這樣的控制元件變數引用在選單中不好引用,會報錯。 如果想在選單中呼叫控制元件,可以在選單中重新定義控制元件

laydate時間控制元件 (開始日期結束日期)

兩個input框,限制開始時間和結束時間 <input type="text" id='starttime' name='starttime' class="form-control input-date" /> <input type="t

C#中的自定義控制元件中的屬性事件及一些相關特性的總結

今天學習了下C#使用者控制元件開發新增自定義屬性的事件,主要參考了MSDN,總結並實驗了一些用於開發自定義屬性和事件的特性(Attribute)。 在這裡先說一下我的環境: 作業系統:Windows7旗艦版(Service Pack 1) VS版本:Microsoft

Android 使用shape定義不同控制元件的的顏色背景色邊框色

<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/

js中的鍵盤事件onkeydownonkeypressonkeyup

相關程式碼: <!doctype html> <html> <head> <!--聲明當前頁面編碼集(中文編碼<gbk,gb231

Javascript中的onkeydownonkeypressonkeyup區別

測試介面如下: 測試程式碼如下: html程式碼: <input type="text" onkeydown="downEvent()" onkeypress="pressEvent()

JS日曆控制元件集合----附效果圖原始碼

在進行開發的過程中,經常需要輸入時間,特別是在進行查詢、統計的時候,時間限定更為重要。       儘管ASP.NET也集成了日曆控制元件,但是其整合的程式碼量很大,你可以做一個測試,當你在頁面使用一個日曆控制元件時,在釋出之後檢視該頁面的原始碼,你會驚奇發現,日曆控制元件

Asp.Net 獲取FileUpload控制元件的檔案路徑檔名副檔名

string fileNameNo = Path.GetFileName(FileUploadImg.PostedFile.FileName); //獲取檔名和副檔名string DirectoryName = Path.GetDirectoryName(FileUploa

MFC的CEdit控制元件中實現複製貼上剪下等操作的快捷鍵

今天在一個MFC的GUI程式中實現了一個自定義的列表控制元件類(CListCtrl),在這個類裡嵌入了一個CEdit類以便於編輯列表項,為了實現在編輯每個列表項時能支援快捷鍵,在派生的CEdit類加入下面這個函式: [cpp] view plaincopyprint

我的YUV播放器MFC小筆記:設定picture控制元件背景為黑色視窗縮放

影象的顯示主要使用picture控制元件,一般播放器,在初始化時,播放畫面的區域背景都是黑色的,在YUV播放器,也如此。但在網上找了很久的資料才實現該功能,其實說白了,程式碼很簡單,在OnPaint函式中將picture畫為黑色即可。程式碼: //picture控制

SwipeToLoadLayout佈局中新增自定義控制元件仿美團餓了嗎等下拉效果

  SwipeToLoadLayout是一個可重用的下拉重新整理和上拉載入控制元件,理論上支援各種View和ViewGroup(ListView,ScrollView,RecyclerView,GridView,WebView,Linearlayout,Rela

Android仿微信朋友圈高清圖檢視控制元件可縮放雙擊移動

該庫支援和包含的功能: 1.圖片支援手勢操作, 可縮放、雙擊、移動 2.圖片載入時的進度條, 支援自定義 該庫的效果圖如下: 本地相簿圖片效果圖: 點選預覽大圖的效果 本想直接新增gradle依賴庫,不巧的是,之前版本已作廢,待現在版本穩定後,

菜鳥也瘋狂,易語言自繪控制元件__編輯框組合框

編輯框的自繪有點複雜,本原始碼採用了避重就輕的方式:只重繪了非客戶區(邊框),而客戶區部分其實並沒有在WM_PAINT重繪,而是通過編輯框的父視窗中的WM_CTLCOLOREDIT訊息,從而改變編輯框的前景色與背景色,其效果也不錯;         組合框ComboBox