位置: 编程技术 - 正文

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

  • 累计扣除税额
  • 企业所得税季度预缴怎么计算
  • 新入职员工哪月交社保
  • 预缴增值税如何计提
  • 上一年的收入少做账了该怎么调
  • 房地产公司销售商品房属于增值税征收范围吗
  • 研发过程中材料费计入
  • 成本类科目期末借方余额表示
  • 库存现金盘点表是不是原始凭证
  • 关联企业借款利息税前扣除
  • 企业受托研发产品有哪些
  • 特殊销售方式的计税依据
  • 总公司委托分公司工程委托书模板
  • 会计人士必知建筑业主要成本会计分录一览
  • 抵税必须要有发票
  • 小微企业销售额含税吗
  • 小微企业的特点及经营模式举例
  • 出售专利权属于什么科目
  • 企业采购成本包括所有的仓储费用
  • 纳税人不得汇总开具发票
  • 反映留存收益的账户
  • 城建税是增值税的附加税吗
  • 财务原始凭证
  • 往来账乱如何处理
  • 预提利息的分录怎么做
  • 抵扣给供货商预缴税款
  • 在win7中怎么安转只兼容win10的软件
  • win10系统的电脑能装win7吗
  • php -m
  • php 替换
  • php如何导入数据库
  • 员工加班车费会计分录
  • Win10 KB5005033 给某些用户带来了新问题的解决方法
  • 企业因政策性原因发生的巨额经营亏损
  • 应收票据贴现的会计分录
  • 银行存款的明细科目怎么写
  • php的运算符主要包括哪些?
  • 什么是融资租赁型校园贷
  • 求源代码
  • 出口企业要缴纳印花税吗
  • parted命令详解
  • 与上级往来的会计科目的题目
  • 小规模超500万升一般纳税人规定
  • 新会计准则分录大全
  • spring boot dao
  • phpcms生成html
  • 盈余公积提取后需要结转吗
  • sql for in
  • 预付房租如何做分录
  • 自产产品用于职工福利
  • 企业营业执照的颁发部门是
  • 结转收入及成本费用
  • 电商平台 流量
  • 分公司注销库存车怎么办
  • 项目前期的研发费用
  • 现金日记账本月合计怎么划线
  • 其他债权投资减值准备是什么科目
  • 凭证填制的标准要求
  • 销售固定资产怎么做账务处理
  • 企业进行长期投资的意义
  • mysql中注释
  • 启用5g后流量有什么影响
  • mac如何查看隐藏的文件夹
  • win7切换输入法的快捷键怎么设置
  • win10系统锁屏后不弹出解锁界面
  • wmiex.exe是什么程序
  • win8怎么查看隐藏文件
  • win8手提电脑怎么关闭触摸板
  • input submit、button和回车键提交数据详解
  • dos命令行怎么打开
  • jquery easyui 教程
  • shell脚本判断字符串是否为空
  • 自动关机的
  • 使用css设置文字效果
  • 如何编写一个完整的教学目标
  • unity unity3d
  • python字典有什么用
  • 国税局地税局合并的必要性有哪些内容
  • 税收筹划六种方法
  • 上海社保卡原始密码是啥
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设