位置: 编程技术 - 正文

利用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 替换
  • 再次研究下cache_lite
  • kali渗透工具安装
  • 电脑网络提示ip地址错误怎么办
  • php bcmul
  • 代理出口退税款退到哪
  • 企业并购的基本方法有
  • 计划成本核算的账务处理
  • 黄金期货交易要怎么样
  • 辅助生产成本的分配
  • 差旅费的会计分录怎么做
  • 结霜的早晨
  • php代码报错
  • 项目版本管理是什么
  • thinkphp curl
  • vue3的unplugin-auto-import自动引入
  • Mybatis+Servlet+Mysql 整合的一个小项目:对初学者非常友好,有助于初学者很快的上手Java Web
  • 处置固定资产清理费用影响利润吗
  • 关税完税价格计算增值税
  • notepad+v
  • 浅谈建筑地基基础加固施工技术亲
  • 金融企业买入返还股票
  • 一般商品销售的会计分录
  • 专项资金支出流程
  • 建筑业周转材料
  • 累计折旧借贷方向表示什么意思
  • 工程分包如何开具发票
  • 代销产品如何做会计分录
  • 减值准备减少记哪方
  • 营改增之前
  • 进口关税,增值税是进口设备重置成本中的从属费用
  • 收到预付卡结算款怎么入账
  • 怎么辨别定额发票是什么项目啊
  • mysql中的where子句
  • mysql通过文档读取并执行命令之快速为mysql添加多用户和数据库技巧
  • mysql sql行转列
  • win10右键菜单自定义
  • CentOS操作系统
  • dgservice.exe是什么进程
  • 双硬盘需要设置主从盘吗
  • win1010586升级到最新
  • hpg是什么文件
  • window10路由
  • linux投屏快捷键
  • 制作网站页面
  • java中遍历数组的方法
  • javascript基础笔记
  • xcopy /s /e
  • 网站渗透违法吗
  • Unity Enemy behaviour
  • jQuery Easyui datagrid/treegrid 清空数据
  • 安卓系统手机图片文件夹在哪里
  • js无限极分类
  • 2020年职工探亲路费报销最新规定
  • 盐城合作医疗在手机上怎么交
  • 紧缩性财政政策有哪些
  • 北京买车如何摇号
  • 企业在开办过程中的具体流程
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设