HTML5技术

H5编辑器核心算法和思想-遁地龙卷风 - 遁地龙卷风

字号+ 作者:H5之家 来源:H5之家 2017-07-09 16:00 我要评论( )

代码和特性在chrome49下测试有效。 文本渲染的本质是对文本节点的渲染,通过浏览器内置的对象Range可以获得选择的起始点、与终止点 var range = getRangeObject(); var start = range.startOffset,end = range.endOffset; var startContainer = range.startC

代码和特性在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; };

View Code

 

  起始点始终在左面,终止点始终在右面,不受选择方向的影响。
  只有当起始点的开头或终止点的末尾是<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){ Error("程序会陷入死循环"); break; } /* startNode所在的父元素所有选中节点遍历完毕,将sartNode指向父元素的兄弟节点 */ let parent = unchangeNode.parentElement; unchangeNode = parent; startNode = parent[dir]; } else if(startNode.nodeType == 3){ ; } 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 { Error("错误的遍历方向:"+dir); } } else { 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; }

 赞赏支持

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • H5富文本编辑器之初始化用于编辑的DOM-遁地龙卷风 - 遁地龙卷风

    H5富文本编辑器之初始化用于编辑的DOM-遁地龙卷风 - 遁地龙卷风

    2017-07-07 10:00

  • 基于Babylonjs自制WebGL3D模型编辑器 - ljzc002

    基于Babylonjs自制WebGL3D模型编辑器 - ljzc002

    2017-05-21 15:01

  • 业务订单号生成算法,每秒50W左右,不同机器保证不重复,包含日期可读性好 - 洛城秋色

    业务订单号生成算法,每秒50W左右,不同机器保证不重复,包含日期可

    2017-04-23 12:02

  • CSS gradient渐变之webkit核心浏览器下的使用以及实例 - 孟然

    CSS gradient渐变之webkit核心浏览器下的使用以及实例 - 孟然

    2017-02-04 15:00

网友点评
a