實(shí)現(xiàn)動(dòng)態(tài)輸入關(guān)鍵字時(shí)關(guān)鍵字高亮

項(xiàng)目中要求實(shí)現(xiàn)一個(gè)功能箭券,在輸入框中輸入特定的搜索語(yǔ)句,當(dāng)輸入為關(guān)鍵字時(shí)圈浇,關(guān)鍵字高亮,且輸入滿一行進(jìn)行換行操作

首先分析如果想實(shí)現(xiàn)一部分關(guān)鍵字高亮靴寂,輸入框本身肯定是做不到的磷蜀,因?yàn)閷?shí)現(xiàn)高亮需要通過(guò)動(dòng)態(tài)的給關(guān)鍵字添加span標(biāo)簽,再給span標(biāo)簽中的內(nèi)容設(shè)置顏色

如果使用div,那必須給div添加contenteditable = "true"屬性百炬,使其div可輸入褐隆,其次監(jiān)聽按鍵是否抬起,對(duì)div中的內(nèi)容進(jìn)行檢測(cè)并替換關(guān)鍵字剖踊,我在嘗試這種方法時(shí)遇到了幾個(gè)問(wèn)題庶弃,第一個(gè)問(wèn)題是每次輸入內(nèi)容進(jìn)行替換后光標(biāo)自動(dòng)定位在開頭衫贬,此問(wèn)題在網(wǎng)上查找資料解決如下

function po_Last_Div(obj) {

? ? if (window.getSelection) {//ie11 10 9 ff safari

? ? ? ? obj.focus(); //解決ff不獲取焦點(diǎn)無(wú)法定位問(wèn)題

? ? ? ? var range = window.getSelection();//創(chuàng)建range

? ? ? ? range.selectAllChildren(obj);//range 選擇obj下所有子內(nèi)容

? ? ? ? range.collapseToEnd();//光標(biāo)移至最后

? ? }

else if (document.selection) {//ie10 9 8 7 6 5

? ? ? ? var range = document.selection.createRange();//創(chuàng)建選擇對(duì)象

? ? ? ? //var range = document.body.createTextRange();

? ? ? ? range.moveToElementText(obj);//range定位到obj

? ? ? ? range.collapse(false);//光標(biāo)移至最后

? ? ? ? range.select();

? ? }

}

第二個(gè)問(wèn)題為如果用戶將關(guān)鍵字改變,但程序進(jìn)行監(jiān)聽時(shí)獲取的還是加了span標(biāo)簽的內(nèi)容歇攻,所以當(dāng)關(guān)鍵字被修改成不是關(guān)鍵字時(shí)固惯,其高亮并沒(méi)有消失,此問(wèn)題的解決辦法就是每次監(jiān)聽到有鍵按下缴守,獲取div的文本值(div.text())葬毫,然后使用replace()方法將獲取到的文本值中的空格替換成&nbsp(這塊的替換因?yàn)樵诓檎谊P(guān)鍵字時(shí)要利用正則表達(dá)式,正則表達(dá)式中有&nbsp),再根據(jù)需求中對(duì)關(guān)鍵字的定義進(jìn)行各種匹配與替換屡穗。在顯示的時(shí)候用html()方法讓瀏覽器對(duì)一些標(biāo)簽進(jìn)行轉(zhuǎn)化

第三個(gè)問(wèn)題是當(dāng)輸入中文時(shí)在虛擬按鍵中贴捡,應(yīng)用程序同樣監(jiān)聽按鍵,所以中文輸入時(shí)會(huì)出現(xiàn)來(lái)回跳轉(zhuǎn)村砂,并把中文輸入未結(jié)束的拼音同樣顯示在頁(yè)面上烂斋,此問(wèn)題的原因主要是因?yàn)槲彝ㄟ^(guò)監(jiān)聽按鍵來(lái)判斷內(nèi)容修改,至此未找到能很好解決此問(wèn)題的方法箍镜,畢竟還是前端小白一枚源祈。

這條路走死后,我又回到原項(xiàng)目中色迂,研究其實(shí)現(xiàn)原理香缺,和該原理出現(xiàn)的bug

原項(xiàng)目中實(shí)現(xiàn)的原理,大邏輯是使用angularjs將一個(gè)輸入框和div綁定歇僧,輸入框使用ng-bind將值傳遞給應(yīng)用程序控制器图张,之后對(duì)輸入框的值進(jìn)行處理(關(guān)鍵字實(shí)現(xiàn)高亮),然后將div添加ng-bind-html屬性(用于顯示關(guān)鍵字高亮的內(nèi)容)诈悍,最后將改變后的內(nèi)容顯示在界面

在這過(guò)程中祸轮,讓輸入框中的內(nèi)容透明,在輸入框中的上層有div侥钳,用戶看到的是div顯示出來(lái)的帶有高亮的內(nèi)容适袜,但是實(shí)際操作的是下面被設(shè)置為透明顏色的輸入框

在此方法的實(shí)現(xiàn)過(guò)程中,會(huì)出現(xiàn)三個(gè)bug

第一舷夺、當(dāng)輸入中文時(shí)苦酱,虛擬輸入內(nèi)容不顯示,看不到輸入的拼英给猾,只有字疫萤,分析出現(xiàn)此問(wèn)題的原因是因?yàn)檩斎肟蚝蚫iv進(jìn)行綁定是值的綁定,所以當(dāng)輸入中文時(shí)敢伸,只有我們的值才會(huì)被傳遞扯饶,拼英不會(huì)顯示

第二、因?yàn)檩斎肟虻淖煮w間隔和div中顯示的字體間隔不一樣,當(dāng)輸入過(guò)多內(nèi)容的時(shí)候尾序,輸入框的光標(biāo)會(huì)和div輸入的值重疊(雖然輸入框的內(nèi)容設(shè)置為透明钓丰,但光標(biāo)還可以看見,所以div是沒(méi)有光標(biāo)的每币,是用input光標(biāo)斑粱,div的內(nèi)容)

第三、當(dāng)用戶在輸入一段值后又想在中間插入值時(shí)脯爪,這時(shí)又出現(xiàn)了問(wèn)題,input輸入框的光標(biāo)會(huì)動(dòng)來(lái)動(dòng)去矿微,這時(shí)input框中光標(biāo)位置的字符和div給用戶肉眼看到的光標(biāo)前的字符是不一樣的痕慢,這樣就會(huì)出現(xiàn)偏差,刪除的和用戶認(rèn)為刪除的不是同一個(gè)

那么本著先修改掉此類問(wèn)題的想法涌矢,開始了又一次探索

首先因?yàn)樾枨笥衷黾恿藫Q行要求掖举,所以我將輸入框(input)換成了textarea,其次我沒(méi)有使用angular進(jìn)行兩個(gè)數(shù)據(jù)的綁定和監(jiān)聽,我使用了綁定input事件對(duì)輸入框進(jìn)行監(jiān)聽娜庇,每次獲得輸入框中的值塔次,這樣當(dāng)輸入中文時(shí)同樣會(huì)獲得值顯示在div上,其他設(shè)置都是為了讓textarea和div盡量保持一致名秀。

對(duì)于關(guān)鍵字的高亮励负,實(shí)現(xiàn)原理就是通過(guò)正則表達(dá)式把所有的匹配原則先通過(guò)正則表示出來(lái),之后利用replace()方法進(jìn)行替換

replace()方法傳遞的兩個(gè)參數(shù)匕得,第一個(gè)參數(shù)是正則继榆,第二個(gè)參數(shù)同樣可以是個(gè)函數(shù),函數(shù)內(nèi)的參數(shù)同樣可以幫助我們?nèi)ミM(jìn)行一些比較復(fù)雜的替換機(jī)制

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末汁掠,一起剝皮案震驚了整個(gè)濱河市略吨,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌考阱,老刑警劉巖翠忠,帶你破解...
    沈念sama閱讀 211,348評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異乞榨,居然都是意外死亡秽之,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,122評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門姜凄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)政溃,“玉大人,你說(shuō)我怎么就攤上這事态秧《” “怎么了?”我有些...
    開封第一講書人閱讀 156,936評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)愤诱。 經(jīng)常有香客問(wèn)我云头,道長(zhǎng),這世上最難降的妖魔是什么淫半? 我笑而不...
    開封第一講書人閱讀 56,427評(píng)論 1 283
  • 正文 為了忘掉前任溃槐,我火速辦了婚禮,結(jié)果婚禮上科吭,老公的妹妹穿的比我還像新娘昏滴。我一直安慰自己,他們只是感情好对人,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,467評(píng)論 6 385
  • 文/花漫 我一把揭開白布谣殊。 她就那樣靜靜地躺著,像睡著了一般牺弄。 火紅的嫁衣襯著肌膚如雪姻几。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,785評(píng)論 1 290
  • 那天势告,我揣著相機(jī)與錄音蛇捌,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的饵骨。 我是一名探鬼主播,決...
    沈念sama閱讀 38,931評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼盒音,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了馅而?” 一聲冷哼從身側(cè)響起祥诽,我...
    開封第一講書人閱讀 37,696評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎瓮恭,沒(méi)想到半個(gè)月后雄坪,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,141評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡屯蹦,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,483評(píng)論 2 327
  • 正文 我和宋清朗相戀三年维哈,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片登澜。...
    茶點(diǎn)故事閱讀 38,625評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡阔挠,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出脑蠕,到底是詐尸還是另有隱情购撼,我是刑警寧澤跪削,帶...
    沈念sama閱讀 34,291評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站迂求,受9級(jí)特大地震影響碾盐,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜揩局,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,892評(píng)論 3 312
  • 文/蒙蒙 一毫玖、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧凌盯,春花似錦付枫、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至砸西,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間址儒,已是汗流浹背芹枷。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留莲趣,地道東北人鸳慈。 一個(gè)月前我還...
    沈念sama閱讀 46,324評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像喧伞,于是被迫代替她去往敵國(guó)和親走芋。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,492評(píng)論 2 348

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

  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5潘鲫? 答:HTML5是最新的HTML標(biāo)準(zhǔn)翁逞。 注意:講述HT...
    kismetajun閱讀 27,449評(píng)論 1 45
  • 很神奇接觸到簡(jiǎn)書挖函,之前應(yīng)該下載過(guò)這個(gè)應(yīng)用,但是感覺(jué)應(yīng)該沒(méi)有現(xiàn)在這樣的心態(tài)浊竟,覺(jué)得無(wú)聊就卸載了呢怨喘,現(xiàn)在的自己希望自己...
    Sherry你好閱讀 120評(píng)論 0 0
  • “來(lái)追我啊” “別跑,哥哥振定,等等我必怜!” 城外的樹林里,一對(duì)小兄妹偷偷地跑到這里后频,在開心的做著游戲梳庆。...
    勁雨波閱讀 295評(píng)論 0 0