位置: 编程技术 - 正文

利用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)

  • 个人劳务报酬怎么申报个税
  • 单位外币账户领取流程
  • 非经营性资产包括哪些科目
  • 预付账款收不回发票怎么核销
  • 自产的产品
  • 企业如何加强存货管理工作
  • 差旅费报销会计科目
  • 企业比赛奖品买什么好
  • 代发工资的手续费是多少
  • 收到建设方工程款怎么办
  • 开发商按揭贷款担保责任有哪些
  • 工资薪金支出税收金额怎么算
  • 实收资本印花税申报期限
  • 为什么非征期不允许汇总上传
  • 应交税费增加记借方还是贷方
  • 将自产产品无偿赠送 会计处理
  • 购进电费管理费会计分录
  • 员工工资漏申报怎么办
  • 非企业性单位包括哪些单位
  • 收到银行存款利息记账凭证怎么写
  • 苹果手机怎么看国行还是美版
  • 公司流水账是会计做吗
  • 上市公司发行债券股价会涨吗
  • 软件入无形资产金额
  • win10telnet不是内部或外部命令教程
  • 进项发票认证后多久可以申报
  • 小程序在线反编译网页版
  • 企业会计核算利润表
  • 二手车 交易税费
  • php pathinfo
  • 增值税税负指标怎么算
  • “Ninja is required to load C++ extensions”解决方案
  • thinkphp框架入门
  • vue3引入图片
  • css面试题及答案
  • 在发生以下的情况下,可判定货物
  • Huggingface之transformers零基础使用指南
  • 其他应收款的核算范围包括
  • 关于录制初三毕业班家长寄语通知
  • 给中间人回扣犯罪吗
  • 如何在税控盘上变更一般纳税人
  • 加计扣除所得税处理
  • 退股东股本账务处理
  • 营业外收入的账户有哪些
  • 社会保险差额缴纳
  • 防暑降温费计入工资还是福利费
  • 公司给员工发福利图片
  • 转出未交增值税和未交增值税区别
  • 利得和损失计入所有者权益的情况
  • 进货时的运费计入什么
  • 增值税不超过30万,普通发票可以开0税率吗
  • 企业设备可以贷款吗?
  • 跨年度冲红字发票怎么冲
  • 暂估的应付账款需要调整报表吗
  • 成本分配表是实际成本吗
  • 企业红包是什么骗局吗
  • 普通发票的开具办法是?
  • 搭赠商品如何开票
  • sql数据库检查
  • sql Set IDENTITY_INSERT的用法
  • windows字体不显示
  • centos7 tcp6
  • cygwin下载教程
  • windows升级10
  • win7 media center
  • dw导入excel
  • javascript数据结构与算法
  • jquery网站开发
  • java多线程最佳实践
  • javascript类的继承
  • nodejs获取当前时间
  • Android: AudioFlinger中AudioPolicy的简单介绍
  • shell脚本 \r
  • 在浏览器中打开是什么意思
  • 用javascript
  • python3模拟登录
  • 北京车辆过户办理
  • 纳税人被列入非正常户超过三个月的情况
  • 湖北省税务申报流程 个体户
  • 漳州市医保缴费标准
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设