最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501
当前位置: 首页 - 科技 - 知识百科 - 正文

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

来源:懂视网 责编:小采 时间:2020-11-27 15:07:42
文档

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

H5编辑器核心思想的实例分析:代码和特性在chrome49下测试有效。文本渲染的本质是对文本节点的渲染,通过浏览器内置的对象Range可以获得选择的起始点、与终止点var range = getRangeObject();var start = range.startOffset, end = range.endOffset;var
推荐度:
导读H5编辑器核心思想的实例分析:代码和特性在chrome49下测试有效。文本渲染的本质是对文本节点的渲染,通过浏览器内置的对象Range可以获得选择的起始点、与终止点var range = getRangeObject();var start = range.startOffset, end = range.endOffset;var

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

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文档

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

H5编辑器核心思想的实例分析:代码和特性在chrome49下测试有效。文本渲染的本质是对文本节点的渲染,通过浏览器内置的对象Range可以获得选择的起始点、与终止点var range = getRangeObject();var start = range.startOffset, end = range.endOffset;var
推荐度:
标签: 编辑器 h5 分析
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top