JavaScript實現自定義短信模板

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

效果圖

a.png

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

首先我們列一下難點

1.在任意位置插入,那肯定要拿到位置坐標,如果獲取這個位置?
2.關鍵字是用中文中括號包裹的,那么用戶就不可以去使用中文中括號,怎么阻止用戶輸入呢?
3.既然是關鍵字自然是不可以編輯的,怎么讓它不可編輯?
4.中文中括號可英文中括號keyCode是一樣的,怎么處理?
5.當編輯區域失去焦點的時候,我們立即點關鍵字肯定就是要插入,但是點擊其他地方怎么處理?
6.刪除關鍵字的時候,如何一次按鍵就整個都刪掉?

現在我們來把上面的難點一一解答

1.關于光標位置,我上一篇文章中有寫到,這里就不多說了,http://www.lxweimin.com/p/19a507cd5fd7.
2.關于第2,3,4一起來說。首先為了防止我們識別關鍵字出問題,那么就要阻止用戶自己輸入中括號,說道阻止輸入某個字符,大家很容想到,那就是在輸入的瞬間就把它刪除掉,這個沒錯。我們在判斷按鍵為左中括號時候去刪除的時候,會發現并不能完成整個中括號的刪除,因為落下一個右中括號。沒錯,第一個坑出現了,這是為什么,大家有沒有注意到,每次你輸入中文中括號的時候,其實只需要按左邊中括號就會左右都出現,大括號小括號都是這樣。

【】按下左,左右一起出現

好,我們知道了問題所在,那就在右括號按下的時候刪掉兩個字符,可是,你會發現,如果只按右中括號的時候,他就真的只出現右中括號,所以呢,分開處理。
這次沒問題了吧,可是你會發現依然是剩下右邊的括號沒刪除,而且還把前面的括號前的一個字符刪掉了,坑吧?這就是第二個坑,你在判斷keyCode的時候其實會有三次,第一次是左中括號keyCode,第二次是右中括號,第三次是左箭頭。而第二次第三次并不是你按下的,是第一按下之后自動帶出的。所以當你按下左中括號之后,其實最后光標是跑到了括號中。

【|】

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

//由于我們是禁止輸入中文中括號的,而中文中括號輸入左右情況不同,需要分別處理
if (e.keyCode == 219) {
    e.preventDefault();
    //這里獲取到光標左側的內容
    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()。有疑問了吧?沒錯,這個無法阻止中文按鍵。
關鍵字不可編輯,但是文本怎么能不編輯?。烤庉嫷年P鍵是什么,就是有光標啊,那我們不讓光標進入關鍵字不就行了,這里還順帶解決了的防止鼠標點擊關鍵字中間。我想的思路是,關鍵字的中括號是成對出現的,那么光標進入了,光標前面的內容中中括號自然不是成對的,這就是判斷條件,把它挪出來就可以了。當然從按左右鍵要分別處理,因為是向不同方向越過整個關鍵字,上下鍵就簡單了,都放把光標設置在關鍵字左邊就可以了。

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

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

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

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

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

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

就是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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,517評論 6 539
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,087評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,521評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,493評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,207評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,603評論 1 325
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,624評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,813評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,364評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,110評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,305評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,874評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,532評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,953評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,209評論 1 291
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,033評論 3 396
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,268評論 2 375

推薦閱讀更多精彩內容

  • Ubuntu的發音 Ubuntu,源于非洲祖魯人和科薩人的語言,發作 oo-boon-too 的音。了解發音是有意...
    螢火蟲de夢閱讀 99,444評論 9 467
  • dpkg 學習 安裝mysql apt-get install mysql-server-5.6 apt-get ...
    sharonji閱讀 448評論 0 0
  • Vim幾句話介紹Vim是Unix系統上的文本編輯軟件(你該不會不知道什么是文本編輯軟件吧?。趙indows上也...
    何必遠方閱讀 3,183評論 0 3
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,693評論 25 708
  • 秋風漸起,落葉蕭瑟,碩果累累,這個季節,是成熟與別離的季節。 葉子開始慢慢變黃,變紅,并逐漸枯萎。也許是從一場秋風...
    別山舉水閱讀 2,175評論 73 106