鍵盤事件相關

轉自下面兩個鏈接:http://www.cnblogs.com/starof/p/6558581.html? ?http://www.cnblogs.com/cathsfz/archive/2011/05/29/2062382.html

?

在 JavaScript 中監聽 IME 鍵盤輸入事件

?

在 JavaScript 中監聽用戶的鍵盤輸入是很容易的事情,但用戶一旦使用了輸入法,問題就變得復雜了。輸入法應當如何觸發鍵盤事件呢?是每一下擊鍵都觸發一次事件,還是選詞完畢才觸發事件呢?整句輸入又該如何觸發事件呢?不同的操作系統和不同的瀏覽器對此有不同的看法。在最糟糕的情況下,用戶使用輸入法后瀏覽器就只觸發一次?keydown?,之后就沒有任何的鍵盤事件了。這對于 Suggestion 控件的實現來說是個大問題,因為 Suggestion 控件需要監聽文本輸入框的變化,而事件是最準確也最節省計算資源的做法,如果換成輪詢的話性能就可能受到影響。

首先,要監聽啟用輸入法后的擊鍵事件應當使用?keydown?事件,這是信息最豐富的一個事件,因為在啟用輸入法后別的鍵盤事件可能不會被觸發。其次,大多數操作系統和瀏覽器都實現了一個事實標準,就是在用戶使用輸入法輸入時,?keydown?事件傳入的?keyCode?取值為?229?。然而觸發?keydown?的頻率是不確定的,有些情況下每一下擊鍵都觸發事件,有些情況下只有選詞完畢才觸發事件。這時候,如果我們還是要實時監控文本框的內容變化,就必須使用輪詢了。

var timer;?
var imeKey = 229;?

function keydownHandler (e) {?
? clearInterval(timer)?
? if (e.keyCode == imeKey) {?
??? timer = setInterval(checkTextValue, 50);?
? } else {?
??? checkTextValue();?
? }?
}?

function checkTextValue() {?
? /* handle input text change */?
}

Opera 是一款有趣的瀏覽器,別人做的事情它都不做,別人都不做的事情它都喜歡做。例如說,它偏偏不支持?keyCode == 229?這個事實標準,而要使用?keyCode == 197?來表示輸入法的使用。因此,你需要在上述代碼的基礎上做一下改良,如果監測到是 Opera 瀏覽器,就換一個 keyCode 常量來做比較。

var imeKey = (UA.Opera == 0) ? 229 : 197;

最后,還有一個更不受重視的瀏覽器叫做 Firefox for Mac 。估計是因為 Mac 版本對于 Mozilla 來說實在是太不重要了,所以很多 Windows 版本都沒問題的地方 Mac 版本就會出小問題,例如說對上述事件的支持。 Firefox for Mac 不會出現?keyCode == 229?的情況,而且在輸入法啟用后只有第一下擊鍵會觸發?keydown?事件,因此只能在擊鍵后一直使用輪詢。

if (e.keyCode == imeKey || UA.Firefox > 0 && UA.OS == 'Macintosh') {

在添加了這兩項改進后,實時監控文本框的變化就沒有問題了,即使用戶啟用了輸入法。完整的代碼如下:

var timer;?
var imeKey = (UA.Opera == 0) ? 229 : 197;?

function keydownHandler (e) {?
? clearInterval(timer)?
? if (e.keyCode == imeKey || UA.Firefox > 0 && UA.OS == 'Macintosh') {?
??? timer = setInterval(checkTextValue, 50);?
? } else {?
??? checkTextValue();?
? }?
}?

function checkTextValue() {?
? /* handle input text change */?
}

javaScript事件(七)事件類型之鍵盤與文本事件

?

?

  • 任何可以獲得焦點的元素都可以觸發keypress事件,但只有可編輯區域才能觸發textInput事件。
  • textInput事件只會在用戶按下能夠輸入實際字符的鍵時才會觸發,而keypress事件則在按下那些能夠影響文本顯示的鍵時也會觸發(比如退格鍵)。

data屬性

textInput事件主要考慮的是字符,因此它的event對象中還包含一個data屬性,data值為用戶輸入的字符。

  • 用戶按下S鍵,data值就是“s”
  • 用戶按下上檔鍵時按下S鍵,data值就是"S"
EventUtil.addHandler(textbox,"textInput",function(event){event=EventUtil.getEvent(event);console.log(event.data);
});   

inputMethod屬性

另外,event對象上還有一個屬性,叫inputMethod,表示文本輸入到文本框中的方式。使用這個屬性可以確定文本是如何輸入到控件中,從而驗證其有效性。

  • 0,表示瀏覽器不確定是怎么輸入的
  • 1,表示是使用鍵盤輸入的
  • 2,表示文本是粘貼進來的
  • 3,表示文本是拖放進來的
  • 4,表示文本是使用IME輸入的
  • 5,表示文本是通過在表單中選擇某一項輸入的
  • 6,表示文本是通過手寫輸入的(比如使用手寫筆)
  • 7,表示文本是通過語音輸入的
  • 8,表示文本是通過集中方法組合輸入的
  • 9,表示文本是通過腳本輸入的

兼容性:支持textInput屬性的瀏覽器有IE9+,Safari和Chrome,只有IE支持inputMethod屬性。

擴展閱讀:?

javaScript事件(一)事件流

javaScript事件(二)事件處理程序

javaScript事件(三)事件對象

javaScript事件(四)event的公共成員(屬性和方法)

javaScript事件(五)事件類型之鼠標事件?

轉載于:https://www.cnblogs.com/wangjixianyun/p/6582912.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/456203.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/456203.shtml
英文地址,請注明出處:http://en.pswp.cn/news/456203.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【R】語言第二課----- 變量的使用方法

num1<-c(9.1,8.2,7.3) num2<-1:10 char<-c(a,b,c) #單引號or雙引號都可以 logit<-c(TRUE,FALSE,T,F) c(1,a,TRUE) sex<-c(F,M,F,M) sex sexf<-factor(sex) sexf num1[1]<-100 #索引一定要加方括號 num1[c(1,3)]<-c(99.9,77.7) num1[c(T,F,T)] num1[-2]…

Petuum - Careers

Petuum - CareersCloudformation

【R】語言第三課----矩陣

#矩陣 ?matrix m<-matrix(1:6,nrow 2,ncol3,dimnames list(c(r1,r2),c(c1,c2,c3))) m#默認按列排列 m<-matrix(1:6,nrow 2,ncol3,byrow T,dimnames list(c(r1,r2),c(c1,c2,c3)))m class(m) m[1,1] m[1,]# 相當于 m[c(T,F),] m[,1] m[r1,]m[1,] <- c(100,99,98…

誰說菜鳥不會數據分析--讀書筆記

如果看不清可以下載下來&#xff0c;打開&#xff0c;放大。僅供參考。 轉載于:https://www.cnblogs.com/sunshinewang/p/6591772.html

[MySQL 5.6優化] --order by limit x,x 優化

簡介&#xff1a;order by limit x ,x 在實際工作中有各種業務需求要有order by的排序&#xff0c;有時候處理不好則會造成系統宕機&#xff01;原理&#xff1a;a.通過索引來獲取排序b.通過內部算法獲取排序&#xff1a; 案例具體SQL&#xff1a; SELECT c.order_price orderP…

【R】語言第四課----讀取文件

install.packages("readxl") getwd() setwd("E:/作業4") library(readxl) tianmao<-read_excel(tianmaoTV.xlsx,skip1)#把第一行跳過&#xff0c;直接從第二行開始讀取 #創建新變量 tianmao[total_sales]<-tianmao$current_price*tianmao$month_sale…

Html.Partial和Html. RenderPartial用法

Html.Partial和Html. RenderPartial用法Html.partial和RenderPartial的用法與區別Html.partial和RenderPartial都是輸出html片段&#xff0c;區別在于Partial是將視圖內容直接生成一個字符串并返回&#xff08;相當于有個轉義的過程&#xff09;&#xff0c;RenderPartial方法是…

算術編碼簡單研究

算術編碼 是一種無損數據壓縮方法&#xff0c;也是一種熵編碼的方法。和其它熵編碼方法不同的地方在于&#xff0c;其他的熵編碼方法通常是把輸入的消息分割為符號&#xff0c;然后對每個符號進行編碼&#xff0c;而算術編碼是直接把整個輸入的消息編碼為一個數&#xff0c;一個…

Thinkphp5 還有這種操作?

2019獨角獸企業重金招聘Python工程師標準>>> 在 _initialize 中取出 控制器名和方法名 define(CONTROLLER_NAME,Request::instance()->controller()); define(MODULE_NAME,Request::instance()->module()); define(ACTION_NAME,Request::instance()->actio…

【R】語言第五課----畫圖

?plot#高級繪圖函數 可以完整地繪制出一張圖 ?mtcars plot(mtcars$wt) plot(mtcars[,1:2]) plot(mtcars) plot(mtcars$wt,mtcars$disp) plot(mtcars$wt,mtcars$disp,typep) plot(mtcars$wt,mtcars$disp,typel) plot(mtcars$wt,mtcars$disp,typeb) plot(mtcars$wt,mtcars$disp…

Solidworks如何將參考平面的圖形投影到某曲面上

1 畫好草圖&#xff0c;點擊曲線-分割線 2 選擇要投影的草圖和被投影的面&#xff08;那個球面&#xff09;&#xff0c;最后效果如下圖所示 3 為了獲取連續的軌跡&#xff0c;我們可以再次選擇這個草圖&#xff0c;然后在投影面中選擇平面&#xff0c;最后得到的圖形如下圖所示…

向極限挑戰:算術編碼 (轉)

向極限挑戰&#xff1a;算術編碼 (轉) http://blog.csdn.net/hhf383530895/archive/2009/08/24/4478605.aspx 我們在上一章中已經明白&#xff0c;Huffman 編碼使用整數個二進制位對符號進行編碼&#xff0c;這種方法在許多情況下無法得到最優的壓縮 效果。假設某個字符的出…

np.random.seed(0)作用

在用python時時常會看到如下代碼&#xff1a; import numpy as np np.random.seed(0) 其中np.random.seed(0)的作用是使得隨機數據可預測&#xff0c;當我們設置相同的seed&#xff0c;每次生成的隨機數相同。 如果不設置seed&#xff0c;則每次會生成不同的隨機數&#xf…

發送郵件被退回,提示: Helo command rejected: Invalid name 錯誤

我自己配置的 postfix dovecot server&#xff0c; 配置了outlook 后&#xff0c; 相同的賬號。 在有的電腦上能收發成功&#xff0c; 在有的電腦上發送郵件就出現退信。提示 Helo command rejected: Invalid name 錯誤。經過分析&#xff0c; 原來是計算機名的問題。 計算機名…

Series和DataFrame、相關性及NaN處理

pandas核心數據結構 pandas是以numpy為基礎的&#xff0c;還提供了一些額外的方法 Series series用來表示一維數據結構&#xff0c;與python內部的數組類似&#xff0c;但多了一些額外的功能。 series內部由兩個相互關聯的數組組成&#xff1a;主數組用來存放數組&#xff…

Hive謂詞解析過程分析

where col1 100 and abs(col2) > 0在Hive中的處理過程 where過濾條件稱為謂詞predicate。 以上where過濾條件在經過Hive的語法解析后&#xff0c;生成如下的語法樹&#xff1a; TOK_WHERE AND TOK_TABLE_OR_C…

算術編碼(Arithmetic Coding)源代碼

Ian H. Witten、Radford M. Neal和John G. Cleary在1987年發表了一篇啟發性的論文。論文中描述了一種基于整數運算的通用算術編碼器&#xff0c;而且還給出了由計算錯誤導致的效率低下的分析。以下源代碼來自于這篇論文&#xff1a;《基于算術編碼的數據壓縮》&#xff08;Arit…

pandas讀寫各種類型數據

read_X()通常是pandas模塊下的&#xff0c;to_X()是dataframe的方法 CSV 讀取 使用pandas.read_csv()方法&#xff0c;返回的是一個dataframe csv默認是以"&#xff0c;"分割的 csv文件內容 1、read_csv()默認以第一行數據作為標題 2、調用dataframe的head()方法…

python 類裝飾器

1 裝飾器無參數 class tracer: def __init__(self,func): self.calls 0 self.func func def __call__(self,*args): self.calls 1 print(call %s to %s %(self.calls, self.func.__name__)) self.func(*args) tracer def spam(a, b, c): print(a b c) …

【數據分析】使用pandas和numpy分析美國大選獻金項目

1. 數據載入與總覽 1.1 數據加載 #繪圖工具 import matplotlib.pyplot as plt %matplotlib inline #數據處理工具 import numpy as np import pandas as pd from pandas import Series,DataFrame#數據路徑自己指定&#xff0c;本案例數據路徑就在當前文件夾下面子文件夾usa_e…