探索 contenteditable= true 的DIV 表情的插入

針對(duì)chrome類瀏覽器

</br>

1. 有以下方法獲得被選擇的元素

window.getSelection()

</br>

2. 對(duì)DIV 綁定click方法 和 blur 方法(blur的方法的綁定無效則給div添加屬性tabIndex=-1)來保存光標(biāo)位置,方法內(nèi)容如下:

var lastEditRange;
getPosition() {
        // 獲取選定對(duì)象
        var lastEditSelection = getSelection()
        // 設(shè)置最后光標(biāo)對(duì)象
        lastEditRange = this.lastEditSelection.getRangeAt(0);
    }

3. 插入圖片

insertAfter(newElement, targetElement) {
        var parent = targetElement.parentNode;
        if (parent.lastChild == targetElement) {
            parent.appendChild(newElement);
        }
        else {
            parent.insertBefore(newElement, targetElement.nextSibling);
        }
    }

addEmoji(emoji: string) {
        // 設(shè)置圖片元素兼蕊,css已提前設(shè)置初厚,此例使用精靈圖作元素背景
        let emojiText = document.createElement('i');
        emojiText.setAttribute('class', `emoji icon-ng2_em_${emoji.replace(/\:/g, '')}`);
        emojiText.setAttribute('style', `display:inline-block;`);
        emojiText.setAttribute('contenteditable', 'false');
        var edit = document.get..... // 獲得你設(shè)置的div元素;
        // 編輯框設(shè)置焦點(diǎn)
        edit.focus()
        // 獲取選定對(duì)象
        var selection: any = getSelection()
        // 判斷是否有最后光標(biāo)對(duì)象存在
        if (lastEditRange) {
            // 存在最后光標(biāo)對(duì)象,選定對(duì)象清除所有光標(biāo)并添加最后光標(biāo)還原之前的狀態(tài)
            selection.removeAllRanges()
            selection.addRange(lastEditRange)
        }
        let parent1 = selection.anchorNode;
        // 判斷選定對(duì)象范圍是編輯框還是文本節(jié)點(diǎn)
        if (selection.anchorNode.nodeName != '#text') {
            // 如果是編輯框范圍。則創(chuàng)建表情文本節(jié)點(diǎn)進(jìn)行插入
            if (parent1.childNodes.length > 0) {
                // 如果文本框的子元素大于0产禾,則表示有其他元素排作,則按照位置插入表情節(jié)點(diǎn)
                for (var i = 0; i < parent1.childNodes.length; i++) {
                    if (i == selection.anchorOffset) {
                        parent1.insertBefore(emojiText, parent1.childNodes[i])
                    }
                }
            } else {
                // 否則直接插入一個(gè)表情元素
                parent1.appendChild(emojiText)
            }
        } else {
            // 如果是文本節(jié)點(diǎn)則先獲取光標(biāo)對(duì)象
            let range = getSelection().getRangeAt(0)
            // 獲取光標(biāo)對(duì)象的范圍界定對(duì)象,一般就是textNode對(duì)象
            let textNode: any = range.startContainer;
            console.log(textNode)
            // 獲取光標(biāo)位置
            let rangeStartOffset = range.startOffset;
            // 截取文本亚情,重新插入元素
            let textNode1 = document.createTextNode(textNode.data.substr(0, rangeStartOffset));
            let textNode2 = document.createTextNode(textNode.data.substr(rangeStartOffset));
            let parent = textNode.parentNode;
            let nextNode = textNode.nextSibling;
            textNode.remove();
            if (nextNode) {
                parent.insertBefore(textNode1, nextNode)
            } else {
                parent.appendChild(textNode1);
            }
            insertAfter(emojiText, textNode1);
            insertAfter(textNode2, emojiText);
        }
        // 創(chuàng)建新的光標(biāo)對(duì)象
        var range = document.createRange()
        let space = document.createTextNode('');
        // edit.appendChild(space);
        insertAfter(space, emojiText)
        // 光標(biāo)對(duì)象的范圍界定為表情節(jié)點(diǎn)后的空格
        range.selectNodeContents(space)
        space.deleteData(0, 1)
        // 把光標(biāo)位置定位表情節(jié)點(diǎn)后的空格里
        range.setStart(space, 0)
        range.setEnd(space, 0)
        // 使光標(biāo)開始和光標(biāo)結(jié)束重疊
        range.collapse(true)
        // 清除選定對(duì)象的所有光標(biāo)對(duì)象
        selection.removeAllRanges()
        // 插入新的光標(biāo)對(duì)象
        selection.addRange(range)
        // 無論如何都要記錄最后光標(biāo)對(duì)象
        if(selection.type !=='None') {
          lastEditRange = selection.getRangeAt(0)
        }
    }

ps: 此方法在手機(jī)端兼容問題比較嚴(yán)重妄痪,建議表情元素用img元素。但依然有些手機(jī)在刪除div文本時(shí)無法刪除表情楞件,或者光標(biāo)異常報(bào)錯(cuò)衫生。待完善。土浸。罪针。。

如果覺得文章對(duì)你有點(diǎn)用的話黄伊,麻煩拿出手機(jī)泪酱,這里有一個(gè)你我都有的小福利(每天一次): 打開支付寶首頁搜索“8601304”,即可領(lǐng)紅包还最。謝謝支持

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末墓阀,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子拓轻,更是在濱河造成了極大的恐慌斯撮,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,525評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件扶叉,死亡現(xiàn)場離奇詭異吮成,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)辜梳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來泳叠,“玉大人作瞄,你說我怎么就攤上這事∥H遥” “怎么了宗挥?”我有些...
    開封第一講書人閱讀 164,862評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長种蝶。 經(jīng)常有香客問我契耿,道長,這世上最難降的妖魔是什么螃征? 我笑而不...
    開封第一講書人閱讀 58,728評(píng)論 1 294
  • 正文 為了忘掉前任搪桂,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘踢械。我一直安慰自己酗电,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,743評(píng)論 6 392
  • 文/花漫 我一把揭開白布内列。 她就那樣靜靜地躺著撵术,像睡著了一般。 火紅的嫁衣襯著肌膚如雪话瞧。 梳的紋絲不亂的頭發(fā)上嫩与,一...
    開封第一講書人閱讀 51,590評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音交排,去河邊找鬼划滋。 笑死,一個(gè)胖子當(dāng)著我的面吹牛个粱,可吹牛的內(nèi)容都是我干的古毛。 我是一名探鬼主播,決...
    沈念sama閱讀 40,330評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼都许,長吁一口氣:“原來是場噩夢啊……” “哼稻薇!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起胶征,我...
    開封第一講書人閱讀 39,244評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤塞椎,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后睛低,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體案狠,經(jīng)...
    沈念sama閱讀 45,693評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,885評(píng)論 3 336
  • 正文 我和宋清朗相戀三年钱雷,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了骂铁。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,001評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡罩抗,死狀恐怖拉庵,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情套蒂,我是刑警寧澤钞支,帶...
    沈念sama閱讀 35,723評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站操刀,受9級(jí)特大地震影響烁挟,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜骨坑,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,343評(píng)論 3 330
  • 文/蒙蒙 一撼嗓、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦静稻、人聲如沸警没。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽杀迹。三九已至,卻和暖如春押搪,著一層夾襖步出監(jiān)牢的瞬間树酪,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評(píng)論 1 270
  • 我被黑心中介騙來泰國打工大州, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留续语,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,191評(píng)論 3 370
  • 正文 我出身青樓厦画,卻偏偏與公主長得像疮茄,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子根暑,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,955評(píng)論 2 355

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

  • //------------------------- 第一章 認(rèn)識(shí)JQuery ----------------...
    米塔塔閱讀 720評(píng)論 0 9
  • Attribute: $("p").addClass(css中定義的樣式類型); 給某個(gè)元素添加樣式 $("img...
    撲克臉_457e閱讀 570評(píng)論 0 1
  • 1.JQuery 基礎(chǔ) 改變web開發(fā)人員創(chuàng)造搞交互性界面的方式力试。設(shè)計(jì)者無需花費(fèi)時(shí)間糾纏JS復(fù)雜的高級(jí)特性。 1....
    LaBaby_閱讀 1,174評(píng)論 0 1
  • 一)jQuery九類選擇器【參見jQueryAPI.chm手冊】 目的:通過九類選擇器排嫌,能定位web頁面(HTML...
    奮斗的老王閱讀 1,039評(píng)論 0 51
  • Daring_dd閱讀 196評(píng)論 0 0