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;};

登录后复制

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

  只有当起始点的开头或终止点的末尾是
时,返回的不是文本节点,可以通过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编辑器核心思想的实例分析的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2910359.html

(0)
上一篇 2025年3月11日 04:32:03
下一篇 2025年3月7日 11:19:58

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • H5本地存储实例详解

    他们可以存储:  数组  json数据  图片  脚本  样式文件  ;   客户端的存储的两个:   1.localStorage  没时间限制的数据存储()     方法有:.localStrage.getItem();localStr…

    编程技术 2025年3月11日
    200
  • html5全新的网络格局

    自从html5诞生之后,就是开始建立了一个标准的原则,那就是所有的技术它必须是面向开放,并不能有专利的一个存在,在整个期间opera捐献了css技术,而google的话则是给开发者提供了视频的webm,本文将带大家来看看html5它是如何带…

    2025年3月11日
    200
  • 带你了解什么是HTML5?

            html5 是对 html 标准的第五次修订。其主要的目标是将互联网语义化,以便更好地被人类和机器阅读,并同时提供更好地支持各种媒体的嵌入。html5 的语法是向后兼容的。      html5草案的前身名为 web app…

    2025年3月11日
    200
  • HTML5新知识

    一、h5新增的主要语义化标签如下: 1、header 页面头部、页眉 2、nav 页面导航 3、atricle 一篇文章 4、section 文章中的章节 5、aside 侧边栏 立即学习“前端免费学习笔记(深入)”; 6、footer 页…

    编程技术 2025年3月11日
    200
  • h5新特性及网页布局实例

    什么是html5:html5 是下一代的html,将成为 html、xhtml 以及 html dom 的新标准。 为 HTML5 建立的一些规则: 新特性应该基于 HTML、CSS、DOM 以及 JavaScript。 减少对外部插件的需…

    2025年3月11日
    200
  • h5表单介绍和表单验证失败问题实例

    这篇文章主要介绍了html5 表单验证失败的提示语问题的相关资料,需要的朋友可以参考下 前言 前端的童鞋在写页面时, 都不可避免的总会踩到 表单验证 这个坑. 这时候, 我们就要跪了, 因为要写一堆 js 来检查. 但是自从 H5 出现后,…

    2025年3月11日
    200
  • html5视频播放教程实例

    pc端主要是利用用flash播放,移动端则通过html5方式实现,这篇文章主要介绍了html5视频播放的相关资料,具有一定的参考价值。 我记得就是前几个月吧,有条消息说YouTube支持了HTML5视频嵌入标签video,好吧,我听说而已,…

    编程技术 2025年3月11日
    200
  • 详解HTML5拖放功能实例

    html5提供专门的拖拽与拖放的api,以后实现这类效果就不必乱折腾了。但是,考虑到opera浏览器似乎对此不感冒,在通用性上有待商榷,所以这里也就简单说一说。拖放(drag 和 drop)是 html5 标准的组成部分。 浏览器支持 In…

    编程技术 2025年3月11日
    200
  • html5的头部head的详解

    移动端的工作已经越来越成为前端工作的重要内容,除了平常的项目开发,html 头部标签功能,特别是meta标签显得非常重要。 HTML文档的head部分,通常包括指定页面标题,为搜索引擎提供关于页面本身的信息,加载样式表,以及加载JavaSc…

    编程技术 2025年3月11日
    200
  • 什么是应用程序缓存(Application Cache)?

    起源 html5之前的网页,都是无连接,必须联网才能访问,这其实也是web的特色,这其实对于PC是时代问题并不大,但到了移动互联网时代,设备终端位置不再固定,依赖无线信号,网络的可靠性变得降低,比如坐在火车上,过了一个隧道(15分钟),便无…

    2025年3月11日 编程技术
    200

发表回复

登录后才能评论