jQuery - 中文輸入法與KeyDown/KeyPress事件

最近專案中引用了Telerik ASP.NET擴充元件AutoComplete輸入欄位,測試時發現偶爾會不聽始喚,輸入文字時無法觸發資料查詢,在Javascript Source Code裡反覆追蹤測試,燃燒了可觀的寶貴春青,終於理出頭緒: 問題在中文輸入法!

過去模糊地知道中文輸入在瀏覽器的鍵盤事件行為上有些特殊,但從未深究,這回算是比較清楚研究其中的差別。其實最明顯的差異是: 切到中文輸入法後,輸入文字將不會觸發KeyPress事件,只會有KeyDown,而且傳回的e.keyCode會一律是229。

寫了一段程式來做實驗:


 

jQuery - 中文輸入法與KeyDown/KeyPress事件

最近專案中引用了Telerik ASP.NET擴充元件AutoComplete輸入欄位,測試時發現偶爾會不聽始喚,輸入文字時無法觸發資料查詢,在Javascript Source Code裡反覆追蹤測試,燃燒了可觀的寶貴春青,終於理出頭緒: 問題在中文輸入法!

過去模糊地知道中文輸入在瀏覽器的鍵盤事件行為上有些特殊,但從未深究,這回算是比較清楚研究其中的差別。其實最明顯的差異是: 切到中文輸入法後,輸入文字將不會觸發KeyPress事件,只會有KeyDown,而且傳回的e.keyCode會一律是229。

寫了一段程式來做實驗:

排版顯示純文字複製文字

我使用倉頡輸入法(New ChangJie 2010),以IE9測試,操作過程及結果如下:

    1. 切換到新倉頡輸入法,點txtTest取得焦點準備輸入文字
    2. 按【一】(M鍵),出現KeyDown: 229
    3. 按Enter鍵確定選字,此時出現Input!
    4. 按數字1,出現KeyDown: 229跟Input!
    5. 使用滑鼠將輸入法切回英文(不用按鍵切換避免觸發多餘事件)
    6. 按數字2,出現KeyDown: 50、KeyPress: 50以及Input!

FireFox4測試的結果與IE9相同。若將IE9切成IE7相容模式,結果不太相同,看來並不支援Input事件

    1. 切換到新倉頡輸入法,點txtTest取得焦點準備輸入文字
    2. 按【一】(M鍵),出現KeyDown: 229
    3. 按空白鍵選字,再出現KeyDown: 229
    4. 按數字1,出現KeyDown: 229
    5. 使用滑鼠將輸入法切回英文(不用按鍵切換避免觸發多餘事件)
    6. 按數字2,出現KeyDown: 50、KeyPress: 50

Chrome10的測試結果為:

    1. 切換到新倉頡輸入法,點txtTest取得焦點準備輸入文字
    2. 按【一】(M鍵),出現KeyDown: 229跟Input!
    3. 按空白鍵選字,出現KeyDown: 229跟Input!
    4. 按數字1,出現KeyDown: 229跟Input!
    5. 使用滑鼠將輸入法切回英文(不用按鍵切換避免觸發多餘事件)
    6. 按數字2,出現KeyDown: 50、KeyPress: 50以及Input!

胡亂做個結論:

輸入欄位啟用中文輸入法時,將不會觸發KeyPress事件,而KeyDown事件中的 KeyCode則固定傳回229。IE9, Firefox 4, Chrome支援按鍵Input事件,在IE9/Firefox4上可輔助判別中文輸入的細節,但IE7不支援,Chrome的行為不同。

綜合以上觀察,要自己搞出跨瀏覽器可以精準在使用者輸入每個字(不管有輸入法、不管中英文)時觸發的事件,看來是很艱鉅的任務。所幸網路上善心神人很多,找到一個不錯的解法, Cross browser input event for jQuery, 這個Plugin重新包裝了input事件,所以我們只需寫成:

$("#txtText").bind("input", function() {
    this.value; //可取得目前的文字內容
});

就能在每次輸入中文字或英文字時觸發input事件,雖然無法精確掌握每次的按鍵內容,但已可滿足掌握中文輸入模式下每次文字變動的需求。[2011-04-26補充]要精確抓取每一個按鍵的keyCode,可考慮使用KeyUp事件(但連選字時的上下鍵,送字的Space都包含在內),感謝drem補充!

為網路開發者社群按一個讚!

时间: 2024-09-30 11:56:32

jQuery - 中文輸入法與KeyDown/KeyPress事件的相关文章

Ubuntu 安裝 嘸蝦米 輸入法

O S : 14.04.1-Ubuntu 加入fcitx開發團隊的repository: sudo add-apt-repository ppa:fcitx-team/nightly sudo apt-get update 安裝fcitx與嘸蝦米table: sudo apt-get install fcitx fcitx-m17n sudo apt-get install fcitx-table-boshiamy 在英文環境下,fcitx找不到嘸蝦米輸入法的解決方法,ctrl + alt +

centOS 6.5(64位)安裝fcitx輸入法

參考文章:http://blog.csdn.net/yang1982_0907/article/details/17100409 0. 用root账户登录系统 1. 卸载iBus yum remove ibus 2. 将RHEL 6.4的软件源更换为CentOS 6.4的软件源 参考博文:http://blog.csdn.net/yang1982_0907/article/details/17022983 3. 添加fcitx软件源 wget http://download.opensuse.o

Windows 小技巧: 變更輸入法順序

Windows XP 中還是有辦法變更輸入法順序的!!只不過,要動用到 Regedit.exe 這個程式. 執行 Regedit.exe至 HKEY_CURRENT_USER\Keyboard Layout\Preload 調整輸入法順序 右邊欄中名稱為 1 的鍵值就是內定的輸入法,其值一般為 00000404,也就是美式鍵盤,不要更動它.名稱為 2 的鍵值就是按了 Ctrl + Space 後會出現的輸入法,可依個人習慣調整.之後名稱為 3.4.5…… 的鍵值就是按 Ctrl-Shift 會逐

ubuntu sogou 輸入法無法輸入文字,解決辦法【转载】

之前一段时间正常使用的搜狗输入法突然无法输出中文(具体现象是,可以呼出搜狗输入法界面,但是候选词列表无显示),解决之后记录下来,希望能为同样遇到这个问题的人提供参考.同时附linux下常见软件崩溃问题解决方案. 我的系统是:ubuntu 16.04 LTS 搜狗版本:sogoupinyin_2.1.0.0082_amd64 fcitx版本:1:4.2.9.1-1ubuntu1.16.04.1 方法一:重启搜狗输入法 通过下面的两个命令重启搜狗输入法,看重启后是否可以正常使用: ~$ killal

CentOS7.6安装rime輸入法

# solve dependencyyum install -y gcc gcc-c++ boost boost-devel cmake make cmake3yum install glog glog-devel kyotocabinet kyotocabinet-devel marisa-devel yaml-cpp yaml-cpp-devel gtest gtest-devel libnotify zlib zlib-devel gflags gflags-devel leveldb l

debian,ubuntu搜狗輸入法候选栏乱码

1.删除根目录下的 SogouPY.SogouPY.users.sogou-qimpanel文件夹 1. cd 2.rm -rf Sogou* 2.kill掉所有的输入法相关进程 killall fcitx 原文地址:https://www.cnblogs.com/light-zhang/p/9916288.html

透過手機 App 在 OpenELEC(XBMC)中輸入中文

這裡介紹如何使用手機 App 在沒有中文輸入法的 OpenELEC(XBMC)中輸入中文字. OpenELEC(XBMC)雖然有內建中文語系,但是卻沒有中文的輸入法,沒辦法直接輸入中文字,這對於一般家庭用的影音播放需求來說,是一個很大的問題. 如果想要輸入中文,有一個變通的方式就是使用 XBMC 官方的手機 App,透過手機的中文輸入法來輸入中文,以下是設定的步驟教學. STEP 1首先在手機上安裝 Official XBMC Remote 這個手機 App. STEP 2然後開啟 XBMC 的

[ElasticSearch] 如何使用中文分詞ik與繁簡轉換stconvert插件

一. 環境安裝 ElasticSearch(以下簡稱ES)安裝已經算相對簡單了, 但要使用需要配置的插件, 對剛入門的新手還是有點麻煩, 所幸medcl大神提供一個配置好的ES-rtf版本, 新手們在參數配置上浪費無謂的時間. Github上的elasticsearch-rtf , 裡面都有詳盡的使用說明, 這裡就不多說了.(P.S. ansj,string2int這兩個插件需使用Redis, 若不需要使用可以將這兩個插件移除) 二. 使用ik中文分詞插件 以ik中文分詞插件例子在ES-Sens

keydown,keypress,keyup三者之间的区别

最近看了Javascript高级教程中对过滤输入的介绍,想实现比如电话号码中不能包好非数值的字符,而相应文本中插入字符的操作是keypress事件,所以就想通过阻止这个事件的默认事件行为来阻止这个事件的默认行为来屏蔽此类字符,但是屏蔽之后所有的安检操作都会被屏蔽,文本框会变成可读的.如果只想屏蔽特定的字符,需要检测keypress事件对应的字符编码,然后决定如何响应. 但是我在利用keypree事件的时候,完全搞蒙了.因为前面看了keydown.keypress.keyup事件,它们到底怎么用呢