位置: 编程技术 - 正文

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

  • 个税里的本期收入扣不扣个人社保
  • 开具增值税发票哪些情形不用交税?
  • 企业所得税计算例题
  • 分公司可以参股其他公司吗
  • 小规模自开专票怎么交税
  • 减免50%的城建税分录怎么做?
  • 分期付款没有发票吗
  • 转账显示未认证
  • 客户预付货款会计分录
  • 租赁的设备伤人了谁的责任
  • 政府会计基本准则的附则有
  • 计税收入金额是什么意思
  • 股票期权个人所得税税率表
  • 没有道路许可证的车子怎么处罚
  • 餐饮装修费用计入什么科目
  • 委托销售的增值税税率
  • 广告制作费怎么入账
  • 交强险 收费
  • 资产负债一并转让增值税
  • 委托加工物资合并报表
  • 年度报告包括哪些内容
  • 帮别的公司代销产品,对方公司不开具发票怎么做帐
  • 固定资产作为投资入股为何体现在资本公积
  • 资产预测怎么写
  • 华硕笔记本电脑售后维修服务网点
  • win11任务管理器怎样调出
  • win10兼容性在哪里调整
  • 商业成本结转会计分录
  • PHP:curl_close()的用法_cURL函数
  • PHP:stream_get_filters()的用法_Stream函数
  • win7系统无法启动怎么处理
  • php怎么执行sql语句
  • 差旅费津贴为什么不交个人所得税
  • vue 父组件调子组件方法
  • php的curl实例
  • 口腔门诊提供免费服务有哪些?
  • php递归实现1到100的和
  • 企业所得税利息费用的扣除标准
  • 评价类模型topsis
  • 认缴制对实务操作的可能影响有哪些?
  • 机动车组织机构代码证更改
  • 其他应收款账户管理应遵循
  • 发票已抵扣但对方要红冲账务处理
  • 工程的直接成本包括哪些内容
  • 差旅费科目设置
  • 如何调整以前年度库存
  • 旅行社差额征收税率多少
  • 营改增之前广告位出租
  • 发票怎么保管不会坏
  • 首先要知道什么英语
  • 机械租赁带司机和不带司机的税率
  • 资本增值率计算公式是什么?
  • 公司成本包含什么
  • 删除mysql数据库命令
  • windows2000server安装过程
  • ubuntu help
  • solaris的多线程实现方式
  • win7无法运行
  • win10开始菜单怎么居中
  • ubuntu命令行打开火狐浏览器
  • win8 防火墙
  • win10登陆界面怎么关闭
  • win7系统如何创建新用户
  • windows8联网
  • linux开发经验指的什么
  • win7系统桌面右键没有个性化
  • win10更新已经下载好了能删除吗
  • win7不激活怎么换壁纸
  • es6数组函数
  • 局域网如何打开共享文件夹
  • layui jquery事件失效
  • python中文分词库
  • 重庆国税12366电子税务局官网入口
  • 京东发票税号是几位数
  • 南京国税局长是谁
  • 公寓土地增值税30%-60%阶梯税
  • 公司买水果怎么开票
  • 黑龙江省税务培训网官网
  • 税控盘打不开
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设