位置: 编程技术 - 正文

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

  • 公司房产税怎么做分录
  • 企业土地使用税征收标准
  • 公司筹建期间可以多久
  • 一般纳税人销项税和进项税如何抵扣
  • 外商投资企业的组织形式,组织机构
  • 生产型增值税转变为消费型增值税
  • 非正常户发票管理
  • 损益表上的数据怎么看
  • 支票撕碎了怎么办
  • 事业单位缴纳税款比例
  • 固定资产认证进项在勾选平台勾吗
  • 待摊费用的金额
  • 个人独资企业法人承担什么责任
  • 福利费不交个人所得税会怎么样
  • 发票抬头是个人,能在单位报销吗
  • 客户把发票弄丢了,红冲重新开了会有什么风险
  • 当月不抵扣的增值税发票怎么做账
  • 小规模纳税人附加税减半征收
  • 案例分析关于团员青年的思想困惑疏导和成长问题释疑
  • 年数总和折旧计算方法
  • 水电开发潜力
  • 折扣折让的账务处理
  • 报增值税怎么取消校验
  • 往年的年报填错了怎么办
  • 1697510021
  • mac系统怎么玩游戏
  • 期间费用率的意义
  • 发票专用章正规位置盖在哪里
  • php数组函数,选班长
  • php odbc
  • 工业厂房修缮工程需要报建吗
  • vite vuex
  • 0.96寸OLED显示汉字
  • Pytorch深度学习实战3-5:详解计算图与自动微分机(附实例)
  • 房租的计算方式
  • java集合详解以及底层实现
  • 会务费什么企业可以开
  • 预收款销售商品如何与业务员对账
  • 职工薪酬属于收益性支出
  • 最新版税控盘怎么设置打印机
  • 本期盈余转入累计盈余
  • 垃圾清运费属于什么服务
  • 应交税费主要有什么税
  • 关联公司代缴社保劳动者怎么处理
  • 收到工会经费如何处理
  • 房屋租赁违约金比例
  • 出口退税进项发票有什么要求
  • 开发票系统税号0和o怎么区别?
  • oracle忘记用户名密码怎么办
  • SSB(SQLservice Service Broker) 入门实例介绍
  • sql安装不上去
  • Mysql主从同步Last_IO_Errno:1236错误解决方法
  • execve函数
  • sql判断字符串是否为日期
  • PHP startup: Unable to load dynamic library错误的错误
  • 新款apple macbook air
  • linux下history命令显示历史指令记录的使用方法
  • fedora系统安装软件
  • win7旗舰版如何升级到win10
  • win8账户锁定无法登录
  • win7旗舰版系统激活密钥
  • 极限竞速中心应用程序
  • opengl sharder
  • es6 文档
  • 微信小程序实现轮播图
  • jquery的用处
  • opengl gpu编程
  • 学习计划表模板
  • 音频焦点图广告
  • jquery自动完成插件
  • mkdirs linux
  • jquery接收后端数据
  • 同源策略详解
  • 福建国税电子税务局app
  • 长春国税局科员工资是多少
  • 进项名称和销项同一产品不同称呼
  • 广东省电子税务局电话
  • 江苏国税电子国税局
  • 国税局官网查询平台
  • 辽宁税务局代码是多少
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设