JavaScript實現(xiàn)自定義短信模板

自定義短信模板,要求:可以插入關鍵字,當然是可以在點擊到文本域中的任意位置畴嘶,關鍵字以中括號包裹的形式出現(xiàn)【關鍵字】,刪除關鍵字要整個關鍵都刪掉集晚,而不是自己全刪除窗悯。

效果圖

a.png

這里說下我的思路,要完成這樣一個功能,分為以下幾點:
1.在指定位置插入關鍵字
2.刪除關鍵字要整個刪除掉偷拔,并且關鍵字是不可編輯的,用戶也是不可以輸入中文中括號的

首先我們列一下難點

1.在任意位置插入蒋院,那肯定要拿到位置坐標,如果獲取這個位置莲绰?
2.關鍵字是用中文中括號包裹的欺旧,那么用戶就不可以去使用中文中括號,怎么阻止用戶輸入呢蛤签?
3.既然是關鍵字自然是不可以編輯的辞友,怎么讓它不可編輯?
4.中文中括號可英文中括號keyCode是一樣的震肮,怎么處理称龙?
5.當編輯區(qū)域失去焦點的時候,我們立即點關鍵字肯定就是要插入戳晌,但是點擊其他地方怎么處理鲫尊?
6.刪除關鍵字的時候,如何一次按鍵就整個都刪掉沦偎?

現(xiàn)在我們來把上面的難點一一解答

1.關于光標位置马昨,我上一篇文章中有寫到竞帽,這里就不多說了,http://www.reibang.com/p/19a507cd5fd7.
2.關于第2,3,4一起來說鸿捧。首先為了防止我們識別關鍵字出問題屹篓,那么就要阻止用戶自己輸入中括號,說道阻止輸入某個字符匙奴,大家很容想到堆巧,那就是在輸入的瞬間就把它刪除掉,這個沒錯泼菌。我們在判斷按鍵為左中括號時候去刪除的時候谍肤,會發(fā)現(xiàn)并不能完成整個中括號的刪除,因為落下一個右中括號哗伯。沒錯荒揣,第一個坑出現(xiàn)了,這是為什么焊刹,大家有沒有注意到系任,每次你輸入中文中括號的時候,其實只需要按左邊中括號就會左右都出現(xiàn)虐块,大括號小括號都是這樣俩滥。

【】按下左,左右一起出現(xiàn)

好贺奠,我們知道了問題所在霜旧,那就在右括號按下的時候刪掉兩個字符,可是儡率,你會發(fā)現(xiàn)挂据,如果只按右中括號的時候,他就真的只出現(xiàn)右中括號儿普,所以呢崎逃,分開處理。
這次沒問題了吧箕肃,可是你會發(fā)現(xiàn)依然是剩下右邊的括號沒刪除,而且還把前面的括號前的一個字符刪掉了今魔,坑吧勺像?這就是第二個坑,你在判斷keyCode的時候其實會有三次错森,第一次是左中括號keyCode吟宦,第二次是右中括號,第三次是左箭頭涩维。而第二次第三次并不是你按下的殃姓,是第一按下之后自動帶出的袁波。所以當你按下左中括號之后,其實最后光標是跑到了括號中蜗侈。

【|】

 obj.addEventListener('keyup', function(e) {
//每次在文本域中輸入的時候都要獲取其光標位置篷牌,以便于其他操作
cursorIndex = getFocus(obj);

//由于我們是禁止輸入中文中括號的,而中文中括號輸入左右情況不同踏幻,需要分別處理
if (e.keyCode == 219) {
    e.preventDefault();
    //這里獲取到光標左側的內(nèi)容
    var leftChar = obj.value.slice(cursorIndex - 1, cursorIndex);

    //只有輸入結束的是右中括號枷颊,而且它的前一個字符是左中括號才把它刪除,防止把關鍵字刪除掉
    if (/\】/g.test(leftChar) && obj.value.charAt(cursorIndex - 2) === '【') {
        obj.value = obj.value.slice(0, cursorIndex - 2) + obj.value.slice(cursorIndex, obj.value.length);
    }

} else if (e.keyCode == 221) {
    e.preventDefault();
    //右中括號就好辦多了该面,因為它不會自動帶出左中括號
    var leftChar = obj.value.slice(cursorIndex - 1, cursorIndex);
    if (/\】/g.test(leftChar)) {
        obj.value = obj.value.slice(0, cursorIndex - 1) + obj.value.slice(cursorIndex, obj.value.length);
    }
}
//防止上下左右鍵移動光標進入關鍵字中
if ((e.keyCode == 37 || e.keyCode == 39 || e.keyCode == 38 || e.keyCode == 40) && lastKeyCode !== 219) {
    dealFocusMove(obj, cursorIndex);
} else if (e.keyCode == 8) {
    //backspace刪除的時候刪除整個關鍵字
    dealFocusL(obj, cursorIndex, allKeyWords);
} else if (e.keyCode == 46) {
    //delete刪除的時候也是刪除整個關鍵字
    dealFocusR(obj, cursorIndex, allKeyWords)
}
if (e.keyCode !== 37 && e.keyCode !== 39) {
    //這里防止手動按得左右鍵影響左中括號判斷
    lastKeyCode = e.keyCode;
}
}, false);

那這咋搞夭苗,還要分別刪除么?不用的隔缀,我們只要不讓他跑到中間就可以了题造,對就是preventDefault()。有疑問了吧猾瘸?沒錯界赔,這個無法阻止中文按鍵。
關鍵字不可編輯须妻,但是文本怎么能不編輯白序颉?編輯的關鍵是什么荒吏,就是有光標啊敛惊,那我們不讓光標進入關鍵字不就行了,這里還順帶解決了的防止鼠標點擊關鍵字中間绰更。我想的思路是瞧挤,關鍵字的中括號是成對出現(xiàn)的,那么光標進入了儡湾,光標前面的內(nèi)容中中括號自然不是成對的特恬,這就是判斷條件,把它挪出來就可以了徐钠。當然從按左右鍵要分別處理癌刽,因為是向不同方向越過整個關鍵字,上下鍵就簡單了尝丐,都放把光標設置在關鍵字左邊就可以了显拜。

if ((e.keyCode == 37 || e.keyCode == 39) && lastKeyCode === 219) {
    //這里是防止按下中文中括號左鍵的時候帶動左右鍵的按下,這樣保證光標一直在最后
    e.preventDefault();
}
b.jpg

3.怎么處理點擊文本域爹袁,立即點擊關鍵字是插入远荠,點擊其他地方之后再點擊關鍵字不可插入?這里我定義了一個參數(shù)存儲光標位置失息,當點擊其他位置的時候就讓光標置空譬淳,而點擊關鍵字的時候判斷一下光標位置是否存在就可以了

if (cursorIndex !== null) {
    //這里判斷是否是我們要點擊的是不是關鍵字
    if (e.target.tagName !== "TEXTAREA" && e.target.getAttribute('isFocus')) {
        //插入關鍵字

    } else if (e.target.tagName == "TEXTAREA" && e.target.getAttribute('isFocus')) {
        //點擊文本區(qū)域操作
    } else {
        //點擊其他地方要將光標位置置空档址,防止點擊關鍵字添加
        cursorIndex = null;
    }
}

4.刪除整個關鍵字,這里還是用關于如何防止光標進入關鍵字的方式邻梆。只要發(fā)現(xiàn)不成對守伸,就把最近的另一半到光標之間的刪除

【關鍵字| 或者 |關鍵字】

就是backspace和delete兩種,當然在處理的時候用了一些小技巧确虱,就是正則表達式的RegExp.lastIndex,最后一次匹配到的位置含友,還有其他,看代碼吧校辩。

代碼地址地址https://github.com/Stevenzwzhai/plugs/tree/master/%E8%87%AA%E5%AE%9A%E4%B9%89%E6%A8%A1%E6%9D%BF-template

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末窘问,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子宜咒,更是在濱河造成了極大的恐慌惠赫,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,324評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件故黑,死亡現(xiàn)場離奇詭異儿咱,居然都是意外死亡,警方通過查閱死者的電腦和手機场晶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評論 3 392
  • 文/潘曉璐 我一進店門混埠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人诗轻,你說我怎么就攤上這事钳宪。” “怎么了扳炬?”我有些...
    開封第一講書人閱讀 162,328評論 0 353
  • 文/不壞的土叔 我叫張陵吏颖,是天一觀的道長。 經(jīng)常有香客問我恨樟,道長半醉,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,147評論 1 292
  • 正文 為了忘掉前任劝术,我火速辦了婚禮缩多,結果婚禮上,老公的妹妹穿的比我還像新娘养晋。我一直安慰自己衬吆,他們只是感情好,可當我...
    茶點故事閱讀 67,160評論 6 388
  • 文/花漫 我一把揭開白布匙握。 她就那樣靜靜地躺著咆槽,像睡著了一般陈轿。 火紅的嫁衣襯著肌膚如雪圈纺。 梳的紋絲不亂的頭發(fā)上秦忿,一...
    開封第一講書人閱讀 51,115評論 1 296
  • 那天,我揣著相機與錄音蛾娶,去河邊找鬼灯谣。 笑死,一個胖子當著我的面吹牛蛔琅,可吹牛的內(nèi)容都是我干的胎许。 我是一名探鬼主播,決...
    沈念sama閱讀 40,025評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼罗售,長吁一口氣:“原來是場噩夢啊……” “哼辜窑!你這毒婦竟也來了?” 一聲冷哼從身側響起寨躁,我...
    開封第一講書人閱讀 38,867評論 0 274
  • 序言:老撾萬榮一對情侶失蹤穆碎,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后职恳,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體所禀,經(jīng)...
    沈念sama閱讀 45,307評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,528評論 2 332
  • 正文 我和宋清朗相戀三年放钦,在試婚紗的時候發(fā)現(xiàn)自己被綠了色徘。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,688評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡操禀,死狀恐怖褂策,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情床蜘,我是刑警寧澤辙培,帶...
    沈念sama閱讀 35,409評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站邢锯,受9級特大地震影響扬蕊,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜丹擎,卻給世界環(huán)境...
    茶點故事閱讀 41,001評論 3 325
  • 文/蒙蒙 一尾抑、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蒂培,春花似錦再愈、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至媳荒,卻和暖如春抗悍,著一層夾襖步出監(jiān)牢的瞬間驹饺,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評論 1 268
  • 我被黑心中介騙來泰國打工缴渊, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留赏壹,地道東北人。 一個月前我還...
    沈念sama閱讀 47,685評論 2 368
  • 正文 我出身青樓衔沼,卻偏偏與公主長得像蝌借,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子指蚁,可洞房花燭夜當晚...
    茶點故事閱讀 44,573評論 2 353

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

  • Ubuntu的發(fā)音 Ubuntu,源于非洲祖魯人和科薩人的語言缘圈,發(fā)作 oo-boon-too 的音劣光。了解發(fā)音是有意...
    螢火蟲de夢閱讀 99,256評論 9 467
  • dpkg 學習 安裝mysql apt-get install mysql-server-5.6 apt-get ...
    sharonji閱讀 437評論 0 0
  • Vim幾句話介紹Vim是Unix系統(tǒng)上的文本編輯軟件(你該不會不知道什么是文本編輯軟件吧!)糟把,在windows上也...
    何必遠方閱讀 3,139評論 0 3
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,070評論 25 707
  • 秋風漸起绢涡,落葉蕭瑟,碩果累累遣疯,這個季節(jié)雄可,是成熟與別離的季節(jié)。 葉子開始慢慢變黃缠犀,變紅数苫,并逐漸枯萎。也許是從一場秋風...
    別山舉水閱讀 2,158評論 73 106