位置: 编程技术 - 正文

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

  • 退税怎么做账务处理,需要交什么税
  • 电子设备租赁费专票税率
  • 增值税专用发票使用规定 最新
  • 以前年度损益调整结转到未分配利润
  • 银行会计核算方法的特点
  • 会计做账写错了怎么办
  • 税率3%的增值税专用发票
  • 请客户旅游算不算贿赂
  • 税金及附加期初余额在哪一方
  • 预缴增值税城建怎么算
  • 人力费可以计入劳务费吗
  • 无收入证明需要哪些手续
  • 新公司做财务
  • 公司账上的应付账款是指
  • 电力安装工程合同范本
  • 无形资产摊销金额计入什么科目
  • 个人提前退休取得的一次性补贴收入免征
  • 员工生日福利申请
  • 生产企业出口发票数量开错有什么影响
  • 办税人员的职责和义务
  • 进的货没有入库怎么处理
  • 企业微信收款怎么提现
  • 个人如何开专票
  • 培训机构收一年费用合法吗
  • 销售收入净额与销售收入的区别
  • 购买原材料无法确认收入
  • wifi密码怎么改手机里面
  • 年折旧率怎么计算折旧几年
  • 销售费用营业费用的区别
  • 炫龙dd3笔记本怎么样
  • 把d盘的空间分配到e盘
  • kjournald是什么进程
  • 给文件夹设置密码的软件
  • 金融企业贷款损失准备金税务管理
  • alibabapritect
  • 如何发放年终奖 一个蒸蒸日上的公司,当
  • 承包租赁
  • php删除语句
  • 跨地区经营增值税预缴
  • 印花税的相关问题
  • sklearn报错
  • vue $函数
  • 转出多交增值税账务处理
  • 百旺开票软件状态查询在哪里
  • 贷款 减值
  • 投资收益主要来源于
  • 发给客户的服装文案
  • access2010宏操作大全
  • 餐饮行业经营模式有哪些
  • 长期股权投资其他资本公积
  • 合伙制律师事务所和个人律师事务所
  • 出口货物用途
  • 月末应交增值税借方余额期末该怎么处理
  • 可供出售金融资产的会计处理
  • 补缴增值税的会计处理
  • 销售折扣含义
  • 营业外支出明细账应该采用的格式是
  • 交通补贴属于工资薪金所得吗
  • 小规模纳税人增值税计算公式
  • 会计去企业还是国企好
  • 商业企业注销应检查哪方面的问题
  • 商品流通企业流程
  • mysql存储引擎的作用
  • windosxp无法启动
  • cmd命令怎么进入d盘文件夹
  • PSof1.exe - PSof1是什么进程 有什么作用
  • windows7日文版改中文
  • 支持css的浏览器
  • 使用jquery实现的项目
  • python 解析js
  • python模块导入的几种方法
  • node.js怎么用
  • jquery 表格插件
  • Android调整按钮位置
  • 财政票据和税务票据的法律效力一样吗
  • 增值税申报表如何导出
  • 一般纳税人做账收费标准
  • 固定资产折旧的影响因素
  • 从哪里可以免费听歌
  • 税收负担与税负转嫁
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设