可编辑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);
            }
            
        };

总结

以上的方法能解决选择表情的时候,不会触发手机的键盘弹出。