摘要:而則在我們完成當(dāng)前中文的輸入觸發(fā)??匆韵麓a事件觸發(fā)我們通過,事件來設(shè)置,判斷是否正在進(jìn)行輸入中文以控制事件的響應(yīng),看上去沒有問題,但實(shí)際執(zhí)行時(shí)會(huì)發(fā)現(xiàn)在谷歌瀏覽器中執(zhí)行順序要先于,火狐執(zhí)行順序正常,但會(huì)響應(yīng)兩次。
我們在網(wǎng)頁中經(jīng)常會(huì)遇到實(shí)時(shí)搜索的情況,或者其他類似需要input實(shí)時(shí)響應(yīng)的問題,一般情況下,我們是利用input和propertychange事件來監(jiān)聽input內(nèi)容的變化來響應(yīng),但是有一個(gè)問題就是當(dāng)輸入漢字的時(shí)候,可能我們要輸入 ‘實(shí)時(shí)’ 的時(shí)候,我們的input框中會(huì)出現(xiàn) "shishi"直到我們的空格才會(huì)變成 "實(shí)時(shí)",這也就意味著我們依次響應(yīng)了 "s","sh","shi","shis","shish","shishi","實(shí)時(shí)",前面的結(jié)果明顯不是我們需要的 ,造成了我們很多次無用的提交,如果是接口請(qǐng)求,那更要命,多發(fā)了好多次請(qǐng)求。
最早之前有一個(gè)稍微能改善的解決方案就是配合一個(gè)定時(shí)器延時(shí)執(zhí)行,這樣能減少請(qǐng)求次數(shù),但是這個(gè)減少是不分情況的減少 ,還是治標(biāo)不治本。
今天偶然看到幾個(gè)事件,發(fā)現(xiàn)可以完美解決這種問題。我們來看一下這幾個(gè)事件
compositionstart , compositionupdate ,compositionend
compositionstart 官方解釋 : 觸發(fā)于一段文字的輸入之前(類似于 keydown 事件,但是該事件僅在若干可見字符的輸入之前,而這些可見字符的輸入可能需要一連串的鍵盤操作、語音識(shí)別或者點(diǎn)擊輸入法的備選詞),通俗點(diǎn),假如我們要輸入一段中文,當(dāng)我們按下第一個(gè)字母的時(shí)候觸發(fā) 。
相應(yīng)的compositionupdate在我們中文開始輸入到結(jié)束完成的每一次keyup觸發(fā)。
而compositionend則在我們完成當(dāng)前中文的輸入觸發(fā) 。
正題來了,通過上面的事件我們就可以完美的解決中文輸入的響應(yīng)問題了,從compositionstart觸發(fā)開始,意味著中文輸入的開始且還沒完成,所以此時(shí)我們不需要做出響應(yīng),在compositionend觸發(fā)時(shí),表示中文輸入完成,這時(shí)我們可以做相應(yīng)事件的處理。
所以我們可以設(shè)置一個(gè)變量,或者給input定義一個(gè)屬性,在compositionstart到compositionend之間對(duì)input事件不做出響應(yīng)??匆韵麓a
$("input").on({ input : function(e){ var flag = e.target.isNeedPrevent; if(flag) return; response() }, compositionstart : function(e){ e.target.isNeedPrevent = true ; }, compositionend : function(e){ e.target.isNeedPrevent = false; } }) function response(){ $("div").append("事 件觸發(fā)
") }
我們通過compositionstart,compositionend事件來設(shè)置flag,判斷是否正在進(jìn)行輸入中文以控制input事件的響應(yīng),看上去沒有問題,但實(shí)際執(zhí)行時(shí)會(huì)發(fā)現(xiàn)在谷歌瀏覽器中input執(zhí)行順序要先于compositionend,火狐執(zhí)行順序正常,但compositionend會(huì)響應(yīng)兩次。這就導(dǎo)致谷歌瀏覽器中輸入漢字不會(huì)響應(yīng)input事件。當(dāng)然也可以在compositionend事件中再執(zhí)行一次response事件,這樣的問題是在火狐瀏覽器中會(huì)多執(zhí)行一次response,顯然不是最優(yōu)方案。
經(jīng)過試驗(yàn),發(fā)現(xiàn)keyup和compositionend事件執(zhí)行順序在各大瀏覽器都保持一致,于是我們改成如下代碼:
$("input").on({ keyup : function(e){ var flag = e.target.isNeedPrevent; if(flag) return; response() }, compositionstart : function(e){ e.target.isNeedPrevent = true ; }, compositionend : function(e){ e.target.isNeedPrevent = false; } }) function response(){ $("div").append("事 件觸發(fā)
") }
這樣在各個(gè)瀏覽器基本保持一致了(兼容compositionstart的瀏覽器)。但是keyup有一個(gè)問題,比如通過鼠標(biāo)復(fù)制粘貼的時(shí)候并不相應(yīng)keyup事件,所以上面的事情我們還需要再優(yōu)化下,keyup相應(yīng)按鍵事件,input響應(yīng)除了keyup之外的變化事件。代碼如下
$("input").on({ keyup : function(e){ var flag = e.target.isNeedPrevent; if(flag) return; response() ; e.target.keyEvent = false ; }, keydown : function(e){ e.target.keyEvent = true ; }, input : function(e){ if(!e.target.keyEvent){ response() } }, compositionstart : function(e){ e.target.isNeedPrevent = true ; }, compositionend : function(e){ e.target.isNeedPrevent = false; } }) function response(){ $("div").append("事 件觸發(fā)
") }
最終效果實(shí)現(xiàn):
在線預(yù)覽:
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/51785.html
摘要:而則在我們完成當(dāng)前中文的輸入觸發(fā)??匆韵麓a事件觸發(fā)我們通過,事件來設(shè)置,判斷是否正在進(jìn)行輸入中文以控制事件的響應(yīng),看上去沒有問題,但實(shí)際執(zhí)行時(shí)會(huì)發(fā)現(xiàn)在谷歌瀏覽器中執(zhí)行順序要先于,火狐執(zhí)行順序正常,但會(huì)響應(yīng)兩次。 我們在網(wǎng)頁中經(jīng)常會(huì)遇到實(shí)時(shí)搜索的情況,或者其他類似需要input實(shí)時(shí)響應(yīng)的問題,一般情況下,我們是利用input和propertychange事件來監(jiān)聽input內(nèi)容的變化來...
摘要:在探尋的過程中發(fā)現(xiàn)自己對(duì)鍵盤輸入事件的理解還并不到位,以至于有一些代碼看得云里霧里,趕緊查閱資料寫寫總結(jié)一下下文所說只在與里做了探究。短按觸發(fā)順序長按觸發(fā)順序循環(huán)事件阻止冒泡這類事件都會(huì)冒泡,阻止按照常規(guī)調(diào)用接口就可以阻止冒泡了。 前言 最近因一個(gè)需求在element-ui的Select組件文檔內(nèi)找不到對(duì)應(yīng)的示例,也就是filter-method方法的具體使用樣例,嘗試幾次之后也使用了...
摘要:本文的目的是希望能針對(duì)這個(gè)問題提供一些說明現(xiàn)在暫時(shí)性的解決方案。完全不會(huì)有問題的只有一個(gè)瀏覽器,就是上面注釋中所說的已經(jīng)實(shí)作出的,上可能根本不需要任何解決方案,它的輸入法編輯器是獨(dú)立于瀏覽器上的文本輸入框之外的。 問題來源是來自這個(gè)React官方存儲(chǔ)庫的issue #3926,與這個(gè)議題關(guān)聯(lián)的有很多其他的issue,來自許多項(xiàng)目,有些是與React相關(guān),有些則是vue或其它JS套件。也...
摘要:經(jīng)過在網(wǎng)上的查找,找到了和兩個(gè)事件進(jìn)行一個(gè)開關(guān)判斷。關(guān)于事件是的標(biāo)準(zhǔn)事件,對(duì)于檢測和這幾個(gè)元素通過用戶界面發(fā)生的內(nèi)容變化非常有用,在內(nèi)容修改后立即被觸發(fā),不像事件需要失去焦點(diǎn)才觸發(fā)。補(bǔ)充最近測試了下發(fā)現(xiàn)在事件之后才觸發(fā)。。。 事件背景 工作過程中涉及到了移動(dòng)端輸入內(nèi)容長度的限定,這就要求需要對(duì)輸入過程中內(nèi)容的變化進(jìn)行監(jiān)控和判定,以決定是否可以繼續(xù)輸入,所以就想著是否可以在相關(guān)輸入處監(jiān)聽...
摘要:在掘金摸魚的時(shí)候看到了一個(gè)題第題搜索如何防抖,如何處理中文輸入,感覺挺有意思的。測試地址事件輸入法事件輸入法的第一個(gè)字母時(shí)觸發(fā)。輸入法狀態(tài)輸入內(nèi)容。輸入法選擇之后觸發(fā)。 前端最基礎(chǔ)的就是 HTML+CSS+Javascript。掌握了這三門技術(shù)就算入門,但也僅僅是入門,現(xiàn)在前端開發(fā)的定義已經(jīng)遠(yuǎn)遠(yuǎn)不止這些。前端小課堂(HTML/CSS/JS),本著提升技術(shù)水平,打牢基礎(chǔ)知識(shí)的中心思想,我...
閱讀 2129·2021-09-29 09:35
閱讀 2012·2019-08-30 14:15
閱讀 3029·2019-08-30 10:56
閱讀 1017·2019-08-29 16:59
閱讀 638·2019-08-29 14:04
閱讀 1369·2019-08-29 12:30
閱讀 1089·2019-08-28 18:19
閱讀 566·2019-08-26 11:51