html5中编辑器核心思想的示例分析
发表于:2025-01-19 作者:千家信息网编辑
千家信息网最后更新 2025年01月19日,这篇文章给大家分享的是有关html5中编辑器核心思想的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。代码和特性在chrome49下测试有效。文本渲染的本质是对文本节
千家信息网最后更新 2025年01月19日html5中编辑器核心思想的示例分析
这篇文章给大家分享的是有关html5中编辑器核心思想的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。
代码和特性在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;};
起始点始终在左面,终止点始终在右面,不受选择方向的影响。
只有当起始点的开头或终止点的末尾是
时,返回的不是文本节点,可以通过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;}
感谢各位的阅读!关于"html5中编辑器核心思想的示例分析"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!
节点
文本
起始
元素
位置
所在
错误
循环
思想
核心
示例
编辑器
分析
代码
光标
内容
方向
更多
机制
标签
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
软件开发好难啊
数据库必须以升级模式打开
钦州市公安局网络安全
易纲关于网络安全
网络技术学院录取分数线
什么是行业软件开发
创意画网络安全
计算机网络技术学的课程
软件开发前景知乎
北京中易网络技术有限公司
服务器360安全扫描卡死
春考计算机网络技术前四单元
telnet 服务器下载
i无法验证服务器身份
网络安全师培训
网络安全配合
南京通用软件开发方法
和平精英专属服务器
数据库怎么找出表中重复的数据
PDB数据库异常
车载网络技术的概述
三洋服务器a系列参数拷贝
胜利测井网络安全认证
湖南激光套料软件开发商
主持人串词网络安全
上海app软件开发哪家实惠
tcga药物数据库
企朋网络技术有限公司 招聘
网络安全行业如何创业
平谷旧服务器回收报价