首页前端开发HTMLH5编辑器核心思想的实例分析

H5编辑器核心思想的实例分析

时间2024-01-23 00:27:02发布访客分类HTML浏览273
导读:收集整理的这篇文章主要介绍了H5编辑器核心思想的实例分析,觉得挺不错的,现在分享给大家,也给大家做个参考。代码和特性在chrome49下测试有效。文本渲染的本质是对文本节点的渲染,通过浏览器内置的对象Range可以获得选择的起始点、与终止点...
收集整理的这篇文章主要介绍了H5编辑器核心思想的实例分析,觉得挺不错的,现在分享给大家,也给大家做个参考。代码和特性在chrome49下测试有效。

文本渲染的本质是对文本节点的渲染,通过浏览器内置的对象Range可以获得选择的起始点、与终止点

VAR range = getRangeObject();
    var start = range.startOffset,end = range.endOffset;
    var startContainer = range.startContainer;
    var endContainer = range.endContainer;
    

getRangeObjec代码如下

function getRangeObject(){
if(window.getSelection){
    var selection = window.getSelection();
    if(selection.rangeCount >
 0){
    return selection.getRangeAt(0);
}
}
else if(document.selection){
    return document.selection.createRange();
 }
    return null;
}
    ;
    

 起始点始终在左面,终止点始终在右面,不受选择方向的影响。

  只有当起始点的开头或终止点的末尾是br/> 时,返回的不是文本节点,可以通过start,end确定br元素的位置分别是startContainer.childNodes[start],endContainer.childNodes[end-1]。返回的是文本节点start表示光标相对于起始文本节点所在的起始位置,end表示光标相对于终止文本节点所在的终止位置。

获得下一个文本节点的算法为

function getNextTextNode(startNode,dir = "nextSibling"){
    //记录startNode变化之前的状态,startNode变化后无效时便于状态的回滚let unchangeNode = startNode;
if(startNode.nodeTyPE == 3){
            startNode = startNode[dir];
    }
while (true){
if(startNode == undefined){
if(unchangeNode == undefined){
    //保护机制throw new Error("程序会陷入死循环");
    break;
            }
    /*startNode所在的父元素所有选中节点遍历完毕,将sartNode指向父元素的兄弟节点*/let parent = unchangeNode.parentElement;
                unchangeNode = parent;
                startNode = parent[dir];
        }
else if(startNode.nodeType == 3){
    //文本节点则退出循环break;
        }
else if(startNode.tagName == "BR"){
    //处理单标签,避免不必要的迭代unchangeNode = startNode;
                startNode = startNode[dir];
        }
else if(startNode.nodeType == 1){
    /*如果是双标签元素则进入*/unchangeNode = startNode;
if(dir == "previousSibling"){
                    startNode = $(startNode).contents().last().get(0);
            }
else if(dir == "nextSibling"){
                    startNode = $(startNode).contents().First().get(0);
            }
else {
    //便于错误的定位throw new Error("错误的遍历方向:"+dir);
            }
        }
else {
    //便于错误的定位throw new Error("不期待的元素类型=》"+startNode);
        }
    }
        return startNode;
    }
    

  //上述函数用外部变量+while循环的方式取代递归,加入的保护机制减少误用、潜在bug导致极差的体验。
获得起始节点和结束节点之间的所有文本节点

function getTextNodes(startTextNode,endTextNode){
        let textNodeArray = [];
        let node = startTextNode;
while (true) {
            node = getNextTextNode(node);
if(node == endTextNode){
    break;
        }
            textNodeArray.push(node);
    }
        return textNodeArray;
}
    

以上就是H5编辑器核心思想的实例分析的详细内容,更多请关注其它相关文章!

声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!

html5编辑器

若转载请注明出处: H5编辑器核心思想的实例分析
本文地址: https://pptw.com/jishu/583564.html
h5新特性及网页布局实例 html5动画中关于等待加载动画的实例分享

游客 回复需填写必要信息