zoukankan      html  css  js  c++  java
  • js 实现自定义编辑器在光标位置实现粘贴 ctr+v

    原文:https://blog.csdn.net/smartsmile2012/article/details/53642082

    createDocumentFragment()用法: https://blog.csdn.net/qiao13633426513/article/details/80243058

    html

    <iframe id="editor"  width="600px" height="400px" style="border:solid 1px;"></iframe>
    <input type="txt" onclick="alert(getPosition(event.target))"/>

    js

        //初始化编辑器
        function init() {
            var ifr = document.getElementById("editor");
            var doc = ifr.contentDocument || ifr.contentWindow.document; // W3C || IE
            doc.open();
            doc.designMode="on";
            doc.contentEditable = true;
            doc.write('<html><head><style>body{margin:3px; word-wrap:break-word; word-break: break-all; }</style></head><body>GoodNessEditor</body></html>');
            doc.close();
            doc.addEventListener('paste',function(e){
                e.preventDefault();
                posInsertTxt(e,'插入的内容!');
            });
        }
        init();
        //在光标位置插入内容
        var  posInsertTxt = (event, txt) => {
            var element = event.target ?  event.target : event;
            var doc = element.ownerDocument || element.document;
            var win = doc.defaultView || doc.parentWindow;
            var sel;
            if (typeof win.getSelection != "undefined") {//谷歌、火狐
                sel = win.getSelection();
                if (sel.rangeCount > 0) {//选中的区域
                    var range = win.getSelection().getRangeAt(0);
                    range.deleteContents();
                    var el = document.createElement("div");
                    el.innerHTML = txt;
                    //createDocumentFragment 创建虚拟的节点对象,在创建之初是空的,在把一个DocumentFragment节点插入文档树时,插入的不是DocumentFragment自身,而是它的所有子孙节点
                    var frag = document.createDocumentFragment(), lastNode;
                    if (el.firstChild) {
                            //这里在虚拟节点位置加入的是 文本节点,不是元素节点
                            lastNode = frag.appendChild(el.firstChild);
                    }
                    //在范围初插入节点
                    range.insertNode(frag);
                    if (lastNode) {
                        range = range.cloneRange();
                        range.setStartAfter(lastNode);
                        range.collapse(true);
                        sel.removeAllRanges();
                        sel.addRange(range);
                    }
                }
            } else if ((sel = doc.selection) && sel.type != "Control") {//IE < 9
                var textRange = sel.createRange();
                textRange.pasteHTML(txt);
            }
        }
  • 相关阅读:
    css 中关于border-color 继承了color的说明
    关于飞书的相关开发案例
    好看的点赞设计
    较好的设计网站参考
    较好的B端设计体验 说明
    基于vue的流程图插件
    较好看的中后台模板(ui)
    前端笔记-201807
    前端笔记(201905-201906)
    前端笔记(201902-201904)
  • 原文地址:https://www.cnblogs.com/bruce-gou/p/9883383.html
Copyright © 2011-2022 走看看