在js中使用中文輸入法時(shí)keyCode出現(xiàn)229

在最近開發(fā)的IM中师郑,QA測(cè)出了一個(gè)BUG环葵,使用中文輸入法輸入@時(shí),不會(huì)彈出待選列表宝冕,但是英文輸入法就可以张遭,很奇怪,打開調(diào)試工具一看才知道原來(lái)在jquery的keydown事件中猬仁,獲取到的keyCode的值為229帝璧,并非所期待的值先誉。
PS: IM使用Electron框架開發(fā),在輸入框中輸入@時(shí)的烁,會(huì)彈出可以@的人的列表

代碼是這樣的:

// 監(jiān)聽(tīng)輸入框的鍵盤事件
$('#chat-input-area').keydown(function (e) {
    if (e.key == '@') {
        // 邏輯處理...
    }
});

網(wǎng)上搜索了好多方案褐耳,結(jié)果都不行,這個(gè)問(wèn)題貌似無(wú)解啊渴庆,原因呢铃芦,好像是因?yàn)橹形妮斎敕ㄟ€在處理,會(huì)給調(diào)用者先返回一個(gè)值襟雷,但是js中接收了值就不會(huì)再處理了刃滓,所以中文輸入法下拿到的keyCode全部都是229,既然網(wǎng)上沒(méi)有好的方案耸弄,那只能采用最笨的方法了咧虎。
每次輸入記錄下輸入框中的值,再次輸入時(shí)拿當(dāng)前的值和上次記錄的值做diff计呈,然后拿到差異砰诵,也就是最后輸入的數(shù)據(jù)了,但是這個(gè)diff算法的效率成了關(guān)鍵了捌显,一個(gè)字符一個(gè)字符的比對(duì)茁彭,那效率肯定不高了,拿到當(dāng)前焦點(diǎn)的索引扶歪,然后減1理肺,就可以得到最后的輸入字符,但是獲取當(dāng)前的索引還是比較復(fù)雜的善镰,尤其是輸入框里可能會(huì)有表情等特殊字符妹萨,所以一向比較懶的我選擇了diff方案:
用到了這個(gè)開源庫(kù),diff速度很快:
https://github.com/jhchen/fast-diff
下面是部分代碼:

const diff = require('fast-diff');
let inputContent = '';

// 監(jiān)聽(tīng)輸入框的鍵盤事件
$('#chat-input-area').on('input', function (e) {
    let innerText = $('#chat-input-area')[0].innerText;
    let d = diff(inputContent, innerText);
    // console.log('diff result = ', d);
    inputContent = innerText;
    
    let isAt = false;
    if (!empty(d)) {
        for (let i = 0; i < d.length; i++) {
            if (d[i][0] == diff.INSERT && d[i][1].trimLeft(' ') == '@') {
                isAt = true;
                break;
            }
        }
    }

    if (!isAt) {
        return;
    }
    
    // 處理@
    // ...
});

經(jīng)測(cè)試媳禁,3k+的一篇文章copy進(jìn)去眠副,然后按下Shift + 2,@彈窗基本上是秒開竣稽,根本感覺(jué)不到慢囱怕,效率還可以。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末毫别,一起剝皮案震驚了整個(gè)濱河市娃弓,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌岛宦,老刑警劉巖台丛,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡挽霉,警方通過(guò)查閱死者的電腦和手機(jī)防嗡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)侠坎,“玉大人蚁趁,你說(shuō)我怎么就攤上這事∈敌兀” “怎么了他嫡?”我有些...
    開封第一講書人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)庐完。 經(jīng)常有香客問(wèn)我钢属,道長(zhǎng),這世上最難降的妖魔是什么门躯? 我笑而不...
    開封第一講書人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任淆党,我火速辦了婚禮,結(jié)果婚禮上讶凉,老公的妹妹穿的比我還像新娘宁否。我一直安慰自己,他們只是感情好缀遍,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著饱须,像睡著了一般域醇。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蓉媳,一...
    開封第一講書人閱讀 49,166評(píng)論 1 284
  • 那天譬挚,我揣著相機(jī)與錄音,去河邊找鬼酪呻。 笑死减宣,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的玩荠。 我是一名探鬼主播漆腌,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼阶冈!你這毒婦竟也來(lái)了闷尿?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤女坑,失蹤者是張志新(化名)和其女友劉穎填具,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體匆骗,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡劳景,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年誉简,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片盟广。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡闷串,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出衡蚂,到底是詐尸還是另有隱情窿克,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布毛甲,位于F島的核電站年叮,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏玻募。R本人自食惡果不足惜只损,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望七咧。 院中可真熱鬧跃惫,春花似錦、人聲如沸艾栋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)蝗砾。三九已至先较,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間悼粮,已是汗流浹背闲勺。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留扣猫,地道東北人菜循。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像申尤,于是被迫代替她去往敵國(guó)和親癌幕。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容

  • ¥開啟¥ 【iAPP實(shí)現(xiàn)進(jìn)入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個(gè)線程昧穿,因...
    小菜c閱讀 6,358評(píng)論 0 17
  • ??JavaScript 與 HTML 之間的交互是通過(guò)事件實(shí)現(xiàn)的粤咪。 ??事件谚中,就是文檔或?yàn)g覽器窗口中發(fā)生的一些特...
    霜天曉閱讀 3,473評(píng)論 1 11
  • 森林公園的補(bǔ)習(xí)班開了,小貓被媽媽抓去上課,今天上外語(yǔ)課宪塔,小貓要學(xué)鳥叫… “鳥叫很重要磁奖,學(xué)會(huì)了,就可以到別的森林去了...
    一盒車?yán)遄?/span>閱讀 273評(píng)論 0 3
  • 又是一年期末季某筐。
    燈火夜微明_閱讀 200評(píng)論 0 0
  • 今年以來(lái)比搭,我們聽(tīng)到了無(wú)數(shù)關(guān)于踐行的例子。比如南誊,有人說(shuō):“踐行是學(xué)習(xí)任何一門新知識(shí)的最佳方法身诺。”再比如說(shuō)抄囚,很多人都相...
    joysera閱讀 388評(píng)論 0 1