位置: 编程技术 - 正文

利用Javascript获取选择文本所在的句子详解(js 获取ua)

编辑:rootadmin

推荐整理分享利用Javascript获取选择文本所在的句子详解(js 获取ua),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:js 获取ua,js获取值的几种方法,js获取,javascript获取id的方法,利用JavaScript获得验证码,利用JavaScript获得验证码,js获取,利用JavaScript获取浏览器的传值,内容如对您有帮助,希望把文章链接给更多的朋友!

前言

最近收到一个 issue 期望能在划词的时候同时保存单词的上下文和来源网址。这个功能其实很久之前就想过,但感觉不好实现一直拖延没做。真做完发现其实并不复杂,完整代码在这里,或者继续往下阅读分析。话不多说了,来一起看看详细的介绍吧。

原理分析

获取选择文本

通过 window.getSelection() 即可获得一个 Selection 对象,再利用 .toString() 即可获得选择的文本。

锚节点与焦节点

在 Selection 对象中还保存了两个重要信息,anchorNode 和 focusNode,分别代表选择产生那一刻的节点和选择结束时的节点,而 anchorOffset 和 focusOffset 则保存了选择在这两个节点里的偏移值。

这时你可能马上就想到第一个方案:这不就好办了么,有了首尾节点和偏移,就可以获取句子的头部和尾部,再把选择文本作为中间,整个句子不就出来了么。

当然不会这么简单哈stuck_out_tongue。

强调一下

一般情况下,anchorNode 和 focusNode 都是 Text 节点(而且因为这里处理的是文本,所以其它情况也会直接忽略),可以考虑这种情况:

如果选择的是“awesome”,那么 anchorNode 和 focusNode 都是 is awesome!,所以取不到前面的 “Saladict”。

另外还有嵌套的情况,也是同样的问题。

所以我们还需要遍历兄弟和父节点来获取完整的句子。

利用Javascript获取选择文本所在的句子详解(js 获取ua)

遍历到哪?

于是接下就是解决遍历边界的问题了。遍历到什么地方为止呢?我的判断标准是:跳过 inline-level 元素,遇到 block-level 元素为止。而判断一个元素是 inline-level 还是 block-level 最准确的方式应该是用 window.getComputedStyle() 。但我认为这么做太重了,也不需要严格的准确性,所以用了常见的 inline 标签来判断。

原理总结

句子由三块组成,选择文本作为中间,然后遍历兄弟和父节点获取首尾补上。

实现

选择文本

先获取文本,如果没有则退出

获取首部

对于 anchorNode 只考虑 Text 节点,通过 anchorOffset 获取选择在 anchorNode 的前半段内容。

然后开始补全在 anchorNode 之前的兄弟节点,最后补全在 anchorNode 父元素之前的兄弟元素。注意后面是元素,这样可以减少遍历的次数,而且考虑到一些被隐藏的内容不需要获取,用 innerText 而不是 textContent 属性。

最后从提取句子首部用的正则是这个

前面的 ((.(&#;![ .])) 主要是为了跳过 a.b 这样的特别是在技术文章中常见的写法。

获取尾部

跟首部同理,换成往后遍历。最后的正则保留了标点符号

压缩换行

拼凑完句子之后压缩多个换行为一个空白行,以及删除每行开头结尾的空白符

完整代码

总结

标签: js 获取ua

本文链接地址:https://www.jiuchutong.com/biancheng/373322.html 转载请保留说明!

上一篇:微信小程序图片选择区域裁剪实现方法(微信小程序图片加载不出来)

下一篇:基于JSONP原理解析(推荐)(jsoncpp rapidjson)

  • 增值税纳税申报时间
  • 纳税信用等级评定在哪里查询
  • 水泥建材公司
  • 收据大写十万元整怎么写标准
  • 零星物流运费无法支付
  • 研究开发费用资本化和费用化
  • 销售亏损原因分析范文
  • 不达起征点收到销售额如何作分录?
  • 电商刷单的成本如何处理?
  • 什么企业没有销售费用
  • 物业收停车费要交房产税吗
  • 非公司私营企业属于什么类型
  • 收藏!广告制作税收分类编码总结
  • 土地一次开发和二次开发
  • 保险车辆折旧的计算方法有哪些
  • 增值税加计扣除政策
  • 个人如何开专票
  • 企业土地出让金怎么做账
  • 办理企业土地证要多少钱
  • 大额保险缴费
  • 已抵扣的增值税专票如何冲红
  • 生产企业先出库后入库
  • 虎杖的养殖方法和用量
  • 购入的车辆入账包括哪些费用
  • 个体户流水太大工商局会查吗
  • php 语法
  • mac补丁安装步骤
  • 权益法投资收益在年末确认
  • 软件集成电路企业所得税优惠政策
  • 设备维修的会计分录怎么做
  • 小程序开发公司十大排名
  • php、java、android、ios通用的3des方法(推荐)
  • 产成品和库存商品两个一级科目怎么填
  • 分公司可以开基本账户吗
  • 开发项目完工后多久开工
  • 小规模纳税人通行费电子普票能抵扣吗
  • okhttp3源码分析
  • 短期借款属于经营活动还是筹资活动
  • 其他应收款专项审计报告
  • 残疾人就业保障金是什么意思啊
  • 出口运费怎么入账
  • 同花顺电脑版怎么看财务报表
  • sqlserver数据库安装步骤
  • 总结一周内学习的Sql经验(一)
  • 纳税人办理普通发票流程
  • 工业企业成本一般占收入的比例
  • 另一种收到企业信息英文
  • 项目清算后未售房产怎么纳税
  • 员工预支钱要写什么单据
  • 现代服务业营改增
  • 车间杂工工资如何结算
  • 事业单位的股东是谁
  • 社保补贴生育津贴
  • 跨月凭证出错如何调整
  • 车间不生产折旧计提放哪里
  • 余额调节表的模板
  • 工程不交税
  • 金税盘离线是什么意思
  • 金蝶如何删除结转损益的凭证
  • 建筑行业预收账款预缴税
  • 保洁阿姨工资怎么扣税
  • 两套账的会计被判刑吗
  • 私营企业会计退休年龄50还是55
  • win10 记笔记
  • svcinit.exe - svcinit是什么进程
  • win7打开tftp服务器
  • windows7 usb
  • errorlnk2019怎么解决
  • three.js dispose
  • bat批处理删除文件
  • unity开发用macbook怎么样
  • scrollcontroller
  • 生成0-100的随机数,直到生成88为止,停止循环
  • javascript判断题
  • android插件化原理面试
  • 超详细的卡拉赞攻略
  • 下列关于javascript的叙述正确的有
  • 2024年深圳房价
  • 美国各州房产税税率
  • 记账凭证编制的依据可以用
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设