可編輯DIV光標定位


可編輯DIV光標定位

為何需要光標定位

當一個DIV標簽添加contenteditable=“true” 的屬性值的時候,就會將該標簽變成一個可編輯的輸入框,如果僅是輸入文字,完全可以滿足需求,但是當我們要插入一張圖片的時候(如表情),那么這時候我們將無法知道我們將表情圖片插入到哪個位置中,這時候就需要記錄DIV中的光標的位置,方便下次插入。
下面介紹的主要是微信網頁中出現的問題:div可編輯框每次獲取焦點的時候都會觸發手機鍵盤的彈出,但是一般的網頁中無法隱藏手機鍵盤彈出,js的操作是做不到的。
如果我們使用的是<input type="text" readonly/> 其中readonly屬性可以不彈出鍵盤(常用的weui框架中常用這個屬性來阻止鍵盤彈出)但無法顯示表情並非我們所需,可是DIV沒有這個屬性所以我們就需要通過光標定位來保存光標的位置,同時還需要將焦點狀態失去才滿足需求。

手機網頁可編輯DIV光標定位流程

簡單說下流程: 獲取焦點---》保存光標位置----》失去焦點----》添加內容(光標位置確定)

代碼說明

本代碼主要是總結項目中用到代碼

   //判斷光標
   if (!window._range) {
     $(divElement).focus();//獲取焦點
        saveRange();//保存光標位置
     $(divElement).blur();//失去焦點
                }

       insertContent(insertHtml);//指定位置插入內容
        $(divElement).blur();//失去焦點
   //保存光標位置
    function saveRange() {
         var selection = window.getSelection ? window.getSelection() : document.selection;
         if (!selection.rangeCount) return;
         var range = selection.createRange ? selection.createRange() : selection.getRangeAt(0);
         window._range = range;
        }
        //插入內容
     function insertContent(str) {
         var selection, range = window._range;
         if (!window.getSelection) {
              range.pasteHTML(str);
              range.collapse(false);
              range.select();
         } else {
              selection = window.getSelection ? window.getSelection() : document.selection;
              range.collapse(false);
              var hasR = range.createContextualFragment(str);
              var hasR_lastChild = hasR.lastChild;
              while (hasR_lastChild && hasR_lastChild.nodeName.toLowerCase() == "br" && hasR_lastChild.previousSibling && hasR_lastChild.previousSibling.nodeName.toLowerCase() == "br") {
                    var e = hasR_lastChild;
                    hasR_lastChild = hasR_lastChild.previousSibling;
                    hasR.removeChild(e);
              }
                range.insertNode(hasR);
                if (hasR_lastChild) {
                    range.setEndAfter(hasR_lastChild);
                    range.setStartAfter(hasR_lastChild);
                }
                selection.removeAllRanges();
                selection.addRange(range);
            }
            
        };

總結

以上的方法能解決選擇表情的時候,不會觸發手機的鍵盤彈出。感謝工作中的同事指導!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM