Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
如何通过自定义逻辑精确选择文本至指定边界(空格或换行符)_创想鸟

如何通过自定义逻辑精确选择文本至指定边界(空格或换行符)

如何通过自定义逻辑精确选择文本至指定边界(空格或换行符)

本文详细介绍了如何利用javascript的`window.getselection` api,结合自定义逻辑和正则表达式,实现比原生`selection.modify`方法更精确的文本选择。针对需要将光标所在位置的文本(如url)扩展至最近的空格或换行符边界的需求,教程提供了一种迭代式扩展选择范围并利用正则表达式检测边界的解决方案,确保能够捕获完整的目标文本。

理解浏览器文本选择API

在Web开发中,window.getSelection() API是处理用户文本选择的核心工具。它返回一个Selection对象,代表用户当前选中的文本范围或光标位置。Selection对象提供了多种方法来操作这个选择,例如modify()用于移动或扩展选择,以及setBaseAndExtent()用于精确设置选择的起始和结束点。

然而,modify()方法在处理某些特定场景时可能不够灵活。例如,当我们需要将选择范围精确扩展到一个非标准“单词”的边界(如一个URL,其边界是空格或换行符)时,modify(‘extend’, ‘forward’, ‘word’)可能无法达到预期效果,因为它依赖于浏览器对“单词”的默认定义。此时,就需要一种自定义的解决方案。

自定义选择逻辑:扩展至空格或换行符边界

为了解决modify()方法的局限性,我们可以利用setBaseAndExtent()方法结合循环和正则表达式来手动控制选择的扩展过程。核心思想是从当前光标位置开始,向前后两个方向逐步扩展选择范围,并在每次扩展后检查新选择的文本是否包含了我们定义的边界(空格或换行符)。

关键概念

selection.anchorNode 和 selection.anchorOffset: 选择的起始点(锚点)的DOM节点和在该节点内的偏移量。selection.focusNode 和 selection.focusOffset: 选择的结束点(焦点)的DOM节点和在该节点内的偏移量。selection.setBaseAndExtent(anchorNode, anchorOffset, focusNode, focusOffset): 精确设置选择的起始和结束位置。selection.toString(): 获取当前选择的文本内容。String.prototype.search(/r?n| /): 使用正则表达式检测字符串中是否包含换行符(r?n)或空格(` `)。

实现步骤

获取当前选择对象: 通过window.getSelection()获取当前的Selection对象。初始化边界标志和选择点:bws (backward space/newline found) 和 aws (ahead space/newline found) 用于标记向后和向前是否已找到边界。将anchorNode/anchorOffset和focusNode/focusOffset排序,确保bn/bo是起始点,an/ao是结束点。这对于处理用户从右向左选择的情况很重要。向后扩展选择:在一个while循环中,每次将bo(起始偏移量)减1,从而将选择向后扩展一个字符。使用selection.setBaseAndExtent()更新选择范围。检查selection.toString()是否包含空格或换行符。如果包含,则表示找到了后边界,将bo加1以回退到边界前的最后一个字符,并设置bws = true以退出循环。向前扩展选择:在一个while循环中,每次将ao(结束偏移量)加1,从而将选择向前扩展一个字符。使用selection.setBaseAndExtent()更新选择范围。检查selection.toString()是否包含空格或换行符。如果包含,则表示找到了前边界,将ao减1以回退到边界前的最后一个字符,并设置aws = true以退出循环。最终设置选择: 再次使用selection.setBaseAndExtent(bn, bo, an, ao),根据最终确定的边界位置设置选择。输出结果: console.log(selection.toString())打印最终选中的文本。

示例代码

以下是实现上述逻辑的完整JavaScript代码:

// 确保页面加载jQuery,这里只是为了演示方便,实际不强制依赖// $('button').on('click', function() {  const selection = window.getSelection();  // 如果没有选择或光标,则不执行  if (!selection || selection.rangeCount === 0) {    console.log("没有文本选择。");    return;  }  let [bws, aws] = [false, false]; // 标记是否找到向后和向前的边界  // 获取并排序当前选择的起始和结束点,确保bn/bo是实际的起始点  let [    [bn, bo], // baseNode, baseOffset    [an, ao]  // anchorNode, anchorOffset  ] = [    [selection.anchorNode, selection.anchorOffset],    [selection.focusNode, selection.focusOffset]  ].sort(function(a, b) {    // 比较偏移量来确定哪个是实际的起始点    if (a[0] === b[0]) { // 如果在同一个节点内      return a[1] - b[1];    }    // 如果在不同节点,更复杂的逻辑可能需要遍历DOM树    // 但对于单行文本,通常anchorNode和focusNode是相同的文本节点    return 0; // 简化处理,假设在同一个文本节点或相邻节点  });  // 处理如果光标在URL中间的情况,需要先将bn/bo和an/ao设置为光标的单一位置  // 确保从一个点开始扩展,而不是从一个已有的选择范围开始  if (selection.isCollapsed) { // 如果是光标,不是选择范围      bn = selection.anchorNode;      bo = selection.anchorOffset;      an = selection.focusNode;      ao = selection.focusOffset;  } else {      // 如果已经有选择,我们需要从其边界开始扩展,而不是从内部      // 这里为了简化,我们假设用户点击时只有一个光标,或者我们想扩展当前选择      // 如果需要从现有选择的外部边界扩展,需要调整bn/bo和an/ao的初始值      // 对于本教程的场景(扩展光标所在URL),我们通常从光标位置开始      // 所以上面的bn/bo和an/ao排序已经足够  }  // 向后扩展选择,直到遇到空格或换行符  while (!bws && 0 = ao + 1) {    selection.setBaseAndExtent(bn, bo, an, ++ao); // 增加结束偏移量    if ((aws = (-1 !== selection.toString().search(/r?n| /)))) {      --ao; // 如果找到边界,回退一个字符    }  }  // 最终设置选择范围  selection.setBaseAndExtent(bn, bo, an, ao);  console.log(selection.toString());});

HTML结构

为了测试上述代码,您需要一个包含可选择文本的HTML页面和一个触发选择操作的按钮。

        自定义文本选择教程                body { font-family: sans-serif; line-height: 1.6; margin: 20px; }        pre { background-color: #f4f4f4; padding: 10px; border-radius: 5px; }        button { padding: 10px 15px; background-color: #007bff; color: white; border: none; border-radius: 5px; cursor: pointer; margin-top: 20px; }        button:hover { background-color: #0056b3; }        

自定义文本选择示例

请将光标放置在以下任意一个YouTube URL内部,然后点击按钮查看效果。

https://www.youtube.com/watch?v=vEQ8CXFWLZU https://www.youtube.com/watch?v=vEQ8CXFWLZUlorem ipsum https://www.youtube.com/watch?v=vEQ8CXFWLZUhttps://www.youtube.com/watch?v=vEQ8CXFWLZU lorem ipsum https://www.youtube.com/watch?v=vEQ8CXFWLZU lorem ipsum    

// 将上面的JavaScript代码粘贴到这里 $('button').on('click', function() { const selection = window.getSelection(); if (!selection || selection.rangeCount === 0) { console.log("没有文本选择。"); return; } let [bws, aws] = [false, false]; let [ [bn, bo], [an, ao] ] = [ [selection.anchorNode, selection.anchorOffset], [selection.focusNode, selection.focusOffset] ].sort(function(a, b) { if (a[0] === b[0]) { return a[1] - b[1]; } // 对于不同节点,简单的偏移量比较不适用,需要更复杂的DOM遍历 // 这里我们假设光标或选择通常在一个文本节点内 return 0; }); // 如果当前是光标(没有选择任何文本),则将bn/bo和an/ao都设置为光标位置 if (selection.isCollapsed) { bn = selection.anchorNode; bo = selection.anchorOffset; an = selection.focusNode; ao = selection.focusOffset; } // 向后扩展 while (!bws && 0 = ao + 1) { selection.setBaseAndExtent(bn, bo, an, ++ao); if ((aws = (-1 !== selection.toString().search(/r?n| /)))) { --ao; } } } selection.setBaseAndExtent(bn, bo, an, ao); console.log(selection.toString()); });

以上就是如何通过自定义逻辑精确选择文本至指定边界(空格或换行符)的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1538801.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
js中如何使用toSource()方法
上一篇 2025年12月21日 05:19:14
在React中处理异步数据渲染:理解与实践useState和useEffect
下一篇 2025年12月21日 05:19:25

相关推荐

  • 如何更改软件默认安装c盘_修改软件默认安装路径至其他盘方法

    更改软件默认安装路径可有效缓解C盘空间压力。一、安装时选择自定义选项,手动将路径改为D盘或E盘;二、修改系统环境变量中的ProgramFiles指向非C盘目录,影响后续所有依赖该变量的软件;三、对已安装软件使用mklink命令创建符号链接,实现数据迁移而不影响运行;四、借助Ninite Pro等工具…

    2026年10月3日
    000
  • 谷歌浏览器被恶意软件劫持了怎么办_谷歌浏览器遭恶意劫持修复指南

    谷歌浏览器被恶意软件劫持了怎么办_谷歌浏览器遭恶意劫持修复指南谷歌浏览器被恶意软件劫持了怎么办_谷歌浏览器遭恶意劫持修复指南谷歌浏览器被恶意软件劫持了怎么办_谷歌浏览器遭恶意劫持修复指南谷歌浏览器被恶意软件劫持了怎么办_谷歌浏览器遭恶意劫持修复指南

    首先终止可疑进程,清除恶意浏览器扩展,重置Chrome设置,使用反恶意软件扫描系统,并检查HOSTS文件是否被篡改,以彻底解决浏览器劫持问题。 如果您发现谷歌浏览器的主页、默认搜索引擎或新标签页被强制更改,并且出现了无法解释的广告弹窗或重定向,这通常表明浏览器已被恶意软件劫持。此类问题会严重影响浏览…

    2026年10月3日 • 用户投稿
    100
  • java怎样定义和调用方法实现代码复用 java方法定义与调用的基础操作技巧​

    java怎样定义和调用方法实现代码复用 java方法定义与调用的基础操作技巧​java怎样定义和调用方法实现代码复用 java方法定义与调用的基础操作技巧​java怎样定义和调用方法实现代码复用 java方法定义与调用的基础操作技巧​java怎样定义和调用方法实现代码复用 java方法定义与调用的基础操作技巧​

    一个java方法由访问修饰符、静态修饰符、返回类型、方法名、参数列表和方法体六部分组成;1. 访问修饰符决定方法的访问权限,如public、private等;2. 静态修饰符static表示方法属于类本身而非实例;3. 返回类型指定方法执行后返回的数据类型,无返回值用void;4. 方法名为调用方法…

    2026年10月3日 • 用户投稿
    100
  • JavaFX应用使用GluonFX打包为原生镜像时全屏功能异常的解决方案

    本文探讨了JavaFX应用在使用GluonFX打包为原生镜像(.exe)后,调用stage.setFullScreen(true)时抛出ClassNotFoundException的问题。该异常通常是由于GraalVM原生编译过程中未能正确包含反射调用的内部JavaFX类所致。文章提供了两种解决方案…

    2026年10月3日
    200
  • win11 PIN码不可用怎么办 win11 PIN码无法使用重置方法

    win11 PIN码不可用怎么办 win11 PIN码无法使用重置方法win11 PIN码不可用怎么办 win11 PIN码无法使用重置方法win11 PIN码不可用怎么办 win11 PIN码无法使用重置方法win11 PIN码不可用怎么办 win11 PIN码无法使用重置方法

    首先检查账户是否为Microsoft账户,若为本地账户需切换;接着确保凭据管理器和Windows生物特征服务已启动;运行sfc /scannow修复系统文件;删除NGC文件夹重置PIN环境;最后通过注册表启用域PIN登录,重启后即可恢复PIN功能。 如果您在登录Windows 11时遇到PIN码不可…

    2026年10月3日 • 用户投稿
    600
  • 怎么用豆包AI帮我解释这段代码 一键解析代码功能的豆包AI操作技巧

    怎么用豆包AI帮我解释这段代码 一键解析代码功能的豆包AI操作技巧怎么用豆包AI帮我解释这段代码 一键解析代码功能的豆包AI操作技巧怎么用豆包AI帮我解释这段代码 一键解析代码功能的豆包AI操作技巧怎么用豆包AI帮我解释这段代码 一键解析代码功能的豆包AI操作技巧

    豆包ai的“一键解析代码”功能确实能帮助用户快速理解陌生代码,尤其适合初学者或调试他人代码时使用。一、先准备好要解析的代码,包括完整函数、类定义或逻辑片段,并确保包含变量定义和依赖库导入,如 python 中的 pandas 或 numpy 导入语句。二、在豆包ai聊天界面粘贴代码后,点击“解析代码…

    2026年10月3日 • 用户投稿
    100
  • es文件浏览器空间分析功能在哪 es文件浏览器存储空间分析功能入口与使用

    es文件浏览器空间分析功能在哪 es文件浏览器存储空间分析功能入口与使用es文件浏览器空间分析功能在哪 es文件浏览器存储空间分析功能入口与使用es文件浏览器空间分析功能在哪 es文件浏览器存储空间分析功能入口与使用es文件浏览器空间分析功能在哪 es文件浏览器存储空间分析功能入口与使用

    通过ES文件浏览器的存储空间分析功能可查看各文件夹占用情况。首先打开应用,进入工具箱中的空间分析功能,授权后选择存储区域并开始扫描。扫描完成后以图形化方式展示各目录占用比例,颜色越深占用越大。用户可据此定位大文件或冗余数据,长按文件选择删除或移动以释放空间,并重新扫描验证清理效果。 如果您想了解设备…

    2026年10月3日 • 用户投稿
    000
  • 苹果用户如何快速安装DeepSeek实用攻略

    苹果用户如何快速安装DeepSeek实用攻略苹果用户如何快速安装DeepSeek实用攻略苹果用户如何快速安装DeepSeek实用攻略苹果用户如何快速安装DeepSeek实用攻略

    苹果用户可在iphone上通过两种方法快速安装deepseek。①使用safari浏览器访问网页版:打开safari搜索官网,点击“立即体验”进入界面,可选择添加到主屏幕以便快速启动;②在app store下载官方app:搜索“deepseek”,确认开发者后下载安装并登录账号使用。此外建议设置si…

    2026年10月3日 • 用户投稿
    600
  • UC浏览器如何导入其他浏览器书签_UC浏览器书签数据导入步骤

    UC浏览器如何导入其他浏览器书签_UC浏览器书签数据导入步骤UC浏览器如何导入其他浏览器书签_UC浏览器书签数据导入步骤UC浏览器如何导入其他浏览器书签_UC浏览器书签数据导入步骤UC浏览器如何导入其他浏览器书签_UC浏览器书签数据导入步骤

    首先通过源浏览器导出书签为HTML文件,再将其传输至手机存储,接着在UC浏览器中选择导入该文件,最后检查书签是否完整迁移。 如果您希望将其他浏览器的书签迁移到UC浏览器中,以便在新设备或应用中继续使用常用网站链接,则可以通过导出和导入HTML文件的方式实现数据迁移。以下是具体操作步骤: 本文运行环境…

    2026年10月3日 • 用户投稿
    100
  • IE删除浏览记录方法

    IE删除浏览记录方法IE删除浏览记录方法IE删除浏览记录方法IE删除浏览记录方法

    打开IE浏览器。 点击浏览器右上角的三个点图标,进入历史记录页面。 选择“清除历史记录”选项。 话袋AI笔记 话袋AI笔记, 像聊天一样随时随地记录每一个想法,打造属于你的个人知识库,成为你的外挂大脑 47 查看详情 点击确认清除按钮。 系统正在处理清除操作,请耐心等待片刻。 清除完成,历史记录已清…

    2026年10月3日 • 用户投稿
    200
  • 红果漫剧VIP会员如何开通_红果漫剧VIP会员开通步骤

    红果漫剧VIP会员如何开通_红果漫剧VIP会员开通步骤红果漫剧VIP会员如何开通_红果漫剧VIP会员开通步骤红果漫剧VIP会员如何开通_红果漫剧VIP会员开通步骤红果漫剧VIP会员如何开通_红果漫剧VIP会员开通步骤

    开通红果漫剧VIP会员可通过三种方式:一、App内购,登录后进入个人中心选择会员时长并支付;二、官网开通,登录官网选择套餐完成支付;三、兑换码激活,获取有效码后在兑换页面输入并确认,权益即时生效。 如果您在使用红果漫剧时希望解锁更多专属内容和特权,可能需要开通VIP会员服务。以下是开通红果漫剧VIP…

    2026年10月3日 • 用户投稿
    900
  • 极速漫画官网入口地址_极速漫画官方平台登录

    极速漫画官网入口地址_极速漫画官方平台登录极速漫画官网入口地址_极速漫画官方平台登录极速漫画官网入口地址_极速漫画官方平台登录极速漫画官网入口地址_极速漫画官方平台登录

    极速漫画官网入口地址是m.jsmanhua.com/,该平台资源丰富,涵盖日韩热门及小众漫画,更新快且分类清晰;界面简洁,支持多种阅读模式与精准搜索,操作便捷;加载流畅,支持离线缓存,画质高清,阅读体验佳。 小编推荐一、☞☞☞☞点击极速漫画官网入口地址☜☜☜☜☜ 小编推荐二、☞☞☞☞点击极速漫画官方…

    2026年10月3日 • 用户投稿
    1500
  • Java中默认访问修饰符的作用

    默认访问修饰符允许同一包内的类访问成员,提供包级私有保护。适用于类、接口、字段、方法和构造器,增强封装性与模块化,建议在无需跨包访问时优先使用,默认访问提升代码安全与结构清晰度。 在Java中,如果没有显式指定访问修饰符(如public、private或protected),那么类、方法、变量等成员…

    2026年10月3日
    100
  • 当书网最新访问域名_当书downbook官网入口链接

    当书网最新访问域名_当书downbook官网入口链接当书网最新访问域名_当书downbook官网入口链接当书网最新访问域名_当书downbook官网入口链接当书网最新访问域名_当书downbook官网入口链接

    当书网最新域名是downbook.org,其手机端网址为m.downbook.org,用户可通过该入口访问海量小说资源并享受个性化阅读设置。 当书网最新访问域名在哪里?这是不少网友都关注的,接下来由PHP小编为大家带来当书网downbook官网入口链接,感兴趣的网友一起随小编来瞧瞧吧! http:/…

    2026年10月3日 • 用户投稿
    200
  • PEP8 Python 编码规范整理

    决定开始Python之路了,利用业余时间,争取更深入学习Python。编程语言不是艺术,而是工作或者说是工具,所以整理并遵循一套编码规范是十分必要的。所以今天根据PEP8整理了一份,以后都照此编码了,还会持续更新。 一 代码编排 1 缩进。4个空格的缩进(编辑器都可以完成此功能),不使用Tap,更不…

    用户投稿 2026年10月3日
    100
  • laravel怎么对上传的文件进行MIME类型验证_laravel文件上传MIME类型验证方法

    可通过Laravel的mimetypes和mime规则校验文件MIME类型以限制上传,如’image/jpeg,image/png’;结合Fileinfo扩展手动检测真实类型,并创建自定义验证规则ValidImageMimeType提升复用性。 如果您在使用 Laravel …

    2026年10月3日
    200
  • mysql中and必须大写吗 mysql关键字大小写规则

    在mysql中,关键字不需要大写,因为mysql对关键字大小写不敏感。1)你可以使用and、and、and等形式,mysql都能正确识别和执行。2)但在实际开发中,统一的编码风格很重要,很多团队选择使用大写关键字以区分关键字和标识符,提高代码可读性。3)mysql对标识符的处理可以通过lower_c…

    2026年10月3日
    1300
  • Craft CMS 元素预加载:自定义参数与 PHP 数组语法陷阱解析

    本文深入探讨了在 Craft CMS 中为预加载(Eager-Loaded)元素定义自定义参数的方法,重点解决了一个常见的 PHP 语法错误:在 with() 方法中为关联元素传递参数时,误用 JavaScript 风格的对象字面量 {} 而非正确的 PHP 数组语法 []。通过具体示例,文章演示了…

    2026年10月3日
    100
  • 2025 年 Python 现状:83% 仍在运行旧版,Python Web 开发复兴

    2025 年 Python 现状:83% 仍在运行旧版,Python Web 开发复兴2025 年 Python 现状:83% 仍在运行旧版,Python Web 开发复兴2025 年 Python 现状:83% 仍在运行旧版,Python Web 开发复兴2025 年 Python 现状:83% 仍在运行旧版,Python Web 开发复兴

    第八届年度 python 开发者调查现已正式发布,基于来自全球超过 30,000 名 python 开发者的反馈。本次调研由 python software foundation 联合 jetbrains 的 pycharm 团队共同完成。 2025 年 Python 现状(精简速览)半数 Pyth…

    2026年10月3日 • 用户投稿
    200
  • 火狐浏览器怎么恢复上次关闭的标签页_火狐浏览器撤销关闭标签页与恢复会话技巧

    火狐浏览器怎么恢复上次关闭的标签页_火狐浏览器撤销关闭标签页与恢复会话技巧火狐浏览器怎么恢复上次关闭的标签页_火狐浏览器撤销关闭标签页与恢复会话技巧火狐浏览器怎么恢复上次关闭的标签页_火狐浏览器撤销关闭标签页与恢复会话技巧火狐浏览器怎么恢复上次关闭的标签页_火狐浏览器撤销关闭标签页与恢复会话技巧

    火狐浏览器可通过多种方式恢复已关闭标签页或整个会话。1、点击工具栏的“撤销”图标可逐个恢复最近关闭的标签页;2、在标签页上右键选择“重新打开关闭的标签页”实现相同操作;3、使用Ctrl+Shift+T快捷键快速恢复多个标签页;4、通过菜单进入历史记录并选择“恢复上一次会话”以还原全部页面;5、若功能…

    2026年10月3日 • 用户投稿
    100

发表回复

登录后才能评论
关注微信