contenteditable 选择文本不起作用

2024-03-04

我面临以下问题:当我尝试在 a 中选择文本时contenteditable元素并且选择的结束是元素内容的开始,那么不会触发 select 事件,并且没有Selection and Range对象。

有人可以就为什么会发生这种情况或如何防止这种情况给我任何建议吗?

负责获取选择范围的代码:

$('div[contenteditable="true"]').bind("mouseup keyup touchend", function() {
  lastCaretIndex = getSelectionRange();
});

function getSelectionRange() {
  var sel;
  if (window.getSelection) {
    sel = window.getSelection();

    console.log(sel); // this doesn't print anything event empty string

    if (sel.rangeCount) {
      return sel.getRangeAt(0);
    }
  } else if (document.selection) {
    return document.createRange();
  }

  return null;
}
<div id="main-input" contenteditable="true">Hello world!</div>
<script type="text/javascript" src="https://code.jquery.com/jquery-2.2.4.min.js"></script>

JSFiddle https://jsfiddle.net/rL9z0bvu/(打开浏览器控制台以确保不会记录该选择)。


问题是您仅在特定事件发生时记录选择更改contenteditable元素。更具体地说,你有

$('div[contenteditable="true"]').bind("mouseup keyup touchend", // ...

特别是mouseup当选择更改时,通常会触发事件。除非没有。当您在可编辑区域之外释放鼠标时div(您在示例中就是这样做的!),然后div永远不会收到mouseup事件,因此从不记录选择。

有两种方法可以解决这个问题:

  1. 监听整个事件body。缺点是您会收到更多不影响选择的事件,并且仍然有可能获得mouseup页面之外的事件。
  2. 听听selectionchange https://developer.mozilla.org/en-US/docs/Web/Events/selectionchange event.
document.addEventListener('selectionchange', function(event) {
  console.log(event.type);
});
<div contenteditable="true">Hello world!</div>

当然,您仍然可以像当前在此事件处理程序中所做的那样访问选择。每次选择更改时都会触发此事件,因此您可能需要throttle https://remysharp.com/2010/07/21/throttling-function-calls it.

下面可以找到其完整实现。

function handler() {
  // do whatever you want here
  // this shows the selection and all ranges it consists of
  var sel = window.getSelection(),
      ranges = Array(sel.rangeCount).fill(0).map((_, i) => sel.getRangeAt(i));
  ranges = ranges.map((r) => `${r.startOffset}-${r.endOffset}`).join(';');
  console.log(`Selection [${ranges}:"${sel.toString()}"]`);
}

function throttle(func) {
  var timeoutId = false,
      called = false,
      wrap = function() {
        if (!called) {
          clearInterval(timeoutId);
          timeoutId = false;
        } else {
          func();
        }
        called = false;
      };
  return function() {
    if (timeoutId === false) {
      func();
      timeoutId = setInterval(wrap, 500);
    } else {
      called = true;
    }
  };
}

document.addEventListener('selectionchange', throttle(handler));
<div contenteditable="true">Hello world!</div>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

contenteditable 选择文本不起作用 的相关文章

  • 突出显示 Html 文档中不同标签的文本

    我是新来的角js 现在我正在突出显示 HTML 文档中的文本 So 我的代码是这样的 var InstantSearch highlight function container highlightText var internalHigh
  • 无法实现模块模式

    我正在尝试重现 Douglas Crockford 所著的 Javascript The Good Parts 一书中的一些代码 这个想法是使用闭包进行对象封装并避免Javascript固有的全局变量 var serial maker fu
  • 为什么可以从 console.log 访问 JavaScript 私有方法

    我写了一个简单的代码 const secure new class privateProperty 4 privateMethod console log The property this privateProperty should n
  • 在网页上写乐谱[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我希望能够在网页中编写乐谱和和弦 有没有可用的库 例如用于数学的 Mathjax 如果没有 那么还有其
  • contenteditable,在文本末尾设置插入符号(跨浏览器)

    输出在Chrome div style border 1px solid 000 width 500px height 40px hey div what s up div div div div
  • 如何在 Javascript 中获取时区名称(PDT、EST 等)? [复制]

    这个问题在这里已经有答案了 使用 Javascript 有没有办法根据用户的设备获取用户的时区名称 PDT EST 等 我尝试过的代码 const timezone jstz determine const userTimezone tim
  • JavaScript 对象镜像/单向属性同步

    出于安全目的 我需要一个 镜像 对象 也就是说 如果我创建对象 A 并浅克隆 A 的副本并将其称为 B 则每当 A 的属性发生更改时 我希望 B 自动更新自身以反映更改 但反之则不然 换句话说 单向属性同步 我的问题 是否已经存在我不知道的
  • 为什么 foo.hasOwnProperty('__proto__') 等于 false?

    var foo bar 5 Why is foo hasOwnProperty proto 等于false 它不能来自原型链中更高层的任何对象 因为它是特定于这个对象的 EDIT 有些答案说它已开启Object prototype 但我不明
  • 在气球内显示带有照片的多个地标的最佳做法是什么?

    我有一个项目如下 从手机上拍摄几张照片 将照片保存在网络系统中 然后将照片显示在其中的谷歌地球上 我读过很多文章 但它们都使用 fetchKml 我读过的一篇好文章是使用 php 但使用 fetchKml 我不知道是否可以使用 parseK
  • Firefox(仅限)动态表单操作不起作用

    控制台为操作属性返回空白 我已经移动了 file upload attr action io cfm action updateitemfile item id agenda modal attr data defaultitemid 周围
  • 使用javascript向url添加哈希而不滚动页面?

    在不滚动页面的情况下向 url 添加哈希 使用 JavaScript 我打开页面 我向下滚动 我单击添加哈希的链接 可能带有值 test 示例 http www example com test http www example com t
  • 使用 Jquery 更改 css 属性时的事件检测

    有没有办法检测元素的 显示 css 属性是否更改 是否更改为无 块或内联块 如果没有的话有什么插件吗 谢谢 Note 突变事件 https developer mozilla org en US docs Web Guide Events
  • 开始使用 Three.js 中的行进立方体

    我是 Three js 的新手 正在寻找教程来帮助我开始了解如何在 Three js 中使用 Marching Cubes 到目前为止 我在 Three js 中看到的一些使用它的项目对我来说有点复杂 所以一个简单的教程会很好 谢谢 像您一
  • 在 JavaScript 中引用 C# 变量

    我已经阅读了很多线程 但我不明白为什么这不起作用 我正在创建一个将用作导航栏的 SharePoint Web 部件 一切都很顺利 直到我尝试在 JS 代码中引用 C 变量 这是来自 VisualWebPart1UserControl asc
  • 是否可以向 JavaScript 函数发送可变数量的参数?

    是否可以从数组向 JavaScript 函数发送可变数量的参数 var arr a b c var func function debug alert arguments length for arg in arguments alert
  • 如何使表格单元格的最小宽度为 3 位数字?

    如何使表格中的每个单元格的最小宽度为 3 位数字且不会更大 现在我正在硬编码min width 但我不喜欢硬编码一个值 因为我将来可能想更改字体 如果需要Javascript也没关系 table border 1 tr td 1 td td
  • Google 折线图添加对象数组

    我有一个通过解析 JSON 字符串创建的对象数组 var measurementData Html Raw JsonConvert SerializeObject this Model Item1 var stringifiedData J
  • Apollo 客户端“未找到命名导出‘删除’”

    我正在尝试创建一个apollo client插件Nuxt 3应用 它当前抛出有关名为的包的错误ts invariant file Users my name Repositories project node modules apollo
  • 如何在javascript中设置从数据库输入的最大数量?

    我希望根据数据库中的数量设置 输入类型 数字 中输入的最大数量 目前 我正在尝试让它在数据最大的基础上工作 然后再尝试从数据库中获取最大值 但它似乎无法工作 之前已经在这里问过 但我仍然无法理解 在 php javascript 中设置数据
  • 有没有用 Javascript 编写的开源 JSDoc 解析器?

    我正在寻找一个可以在我的项目中使用的 JSDoc 解析器 我正在寻找可以传递 JSDoc 注释并接收该注释含义的结构化描述的东西 我见过的大多数工具似乎都能够将 JSDoc 注释转换为 HTML 或其他格式 我正在寻找能够提供可用于输入其他

随机推荐

  • C++ Linux (Ubuntu) 正确写入串行(对于 Arduino)

    我想知道是否有一种标准方法可以与高效的串行设备进行通信 我应该使用标准库吗 如果有 是哪一个 现在我正在摆弄让 LED 根据输入的数字以给定的量亮起 Arduino 代码如下 只是练习一些东西 看我过于简单且低效的测试 include
  • 如何处理R中的浮点错误

    考虑以下 R 函数 is sqrt lt function x y if x 2 y TRUE else FALSE 它回答 x 是否是 y 的平方根 如果 y 是完全平方数 则函数的行为符合预期 is sqrt 2 4 返回 TRUE i
  • 比较和替换 SQL Server 中字符串中的字符

    我有一个字符串说 Hel 1 oO Input string Hel 1 oO 我想创建一个函数来解析字符串 Hel 1 oO 并将字母数字以外的所有字符替换为 基本上我想使用正则表达式作为 A Za z0 9 这样除了这些字符之外的所有字
  • 从 iOS 照片库中删除图像[重复]

    这个问题在这里已经有答案了 我创建了一个应用程序 它从手机的照片库中获取图像并将其显示在集合视图上 现在 我希望每当用户选择图像并单击删除按钮时 该特定图像就会从集合视图和图像库中删除 我正在使用 ALAssetLibrary 来获取图像
  • 为什么启动流式查询会导致“ExitCodeException exitCode=-1073741515”?

    一直在尝试适应新的结构化流媒体 但一旦我开始 它就会一直给我以下错误 writeStream query 知道是什么原因造成的吗 如果您在本地和 HDFS 之间拆分检查点和元数据文件夹 我能找到的最接近的是一个正在进行的 Spark 错误
  • 调用方法时出现参数数量错误

    我有课AClass和一个方法someMethod得到一个Object数组作为参数 public class AClass public void someMethod Object parameters 主要是 当我尝试在我创建的对象上调用
  • Pubnub 推送通知不适用于跨平台移动应用程序

    我们正在开发一个基于 cordova 的 Android 应用程序 它具有聊天功能 我们正在从服务器发送测试聊天消息 当应用程序位于前台时 我们收到的消息很好 我们希望当应用程序在后台时收到有关聊天消息的通知 但是我们没有收到任何有关聊天消
  • 找不到模块:无法解析“/vercel/path0/node_modules/cross-fetch/node_modules/node-fetch/lib”中的“编码”

    有没有人遇到过 npm 包带来的不间断警告问题 supabase supabase js The warning message warn node modules cross fetch node modules node fetch l
  • 使用 Timer 在 C# 中更新 UI

    我正在努力使我的应用程序从串行端口读取数据并更新 UI 上的仪表更加高效 我想就处理 UI 更改的代码寻求一些建议 我设置了一个计时器来检查发送到 COM 端口的数据 另一个计时器则使用从 COM 端口接收到的变量更新 UI 基本上发生的事
  • 使用 lucene 改进多线程索引

    我正在尝试使用多个线程在 Lucene 中构建索引 因此 我开始编码并编写了以下代码 首先 我找到文件 并为每个文件创建一个线程来索引它 之后 我加入线程并优化索引 它有效 但我不确定 我可以大规模信任它吗 有什么办法可以改善吗 impor
  • 为什么JAXB说“xxx是一个接口,而JAXB无法处理接口”。即使生成的类不是接口

    我使用 JAXB 绑定我的 xsd 然后尝试创建 JAXBContext JAXBContext jaxbContext JAXBContext newInstance my package name 但是 JAXB 给出了 180 Ill
  • React Native 应用程序在启动时在 Android 11 上崩溃,但没有给出错误

    this is my build gradle setting and this is my system info 我正在尝试在 android 11 上运行 React Native 应用程序 但它在启动时不断崩溃而没有给出任何错误我尝
  • GCC 的代码覆盖率选项如何工作?

    考虑以下命令 gcc fprofile arcs ftest coverage main c 它生成文件 main gcda gcov 将使用该文件来生成覆盖率分析 那么main gcda是如何生成的呢 仪器仪表是如何完成的 我可以看到检测
  • 如何利用foreman向暴发户导出?

    我正在尝试将我的应用程序导出到另一种流程管理格式 系统 具体来说 upstart http upstart ubuntu com 在这样做的过程中 我遇到了许多障碍 主要是由于缺乏文档 作为非 root 用户 我运行了以下命令 如图所示he
  • System.Json.DLL 在哪里?

    我试图遵循一些在 Http 客户端中使用 JSON 的示例 但它们引用了我找不到的 System Json DLL 看这个参考 http msdn microsoft com en us library system json jsonob
  • django - 一个模板中有 2 个视图

    我有两个不同的视图 它们从数据库获取过滤数据 我必须在一个模板文件 admin html 中使用这些视图 但我不能同时在一页上使用多个视图 这是我的观点1 draft list Post objects filter isdraft Tru
  • 调整字体大小以填充 UITextView?

    如何设置 UITextView 中文本的字体大小 使其填充整个 UITextView 我希望用户输入文本 然后让文本填充整个 UITextView 任何帮助表示赞赏 我已经转换了痴呆症的答案 https stackoverflow com
  • 在 Android 中创建手势

    你好 我正在关注这个教程 http www vogella de articles AndroidGestures article html http www vogella de articles AndroidGestures arti
  • 为什么 Codeception 为每个 test* 方法创建新的 \Test 实例?

    作为基础 我使用 Codeception TestCase Test 类 我注意到 对于类中定义的每个 test 方法 codeception 都会重新创建 TestCase Test 类 But Why 结果我不能使用类字段 public
  • contenteditable 选择文本不起作用

    我面临以下问题 当我尝试在 a 中选择文本时contenteditable元素并且选择的结束是元素内容的开始 那么不会触发 select 事件 并且没有Selection and Range对象 有人可以就为什么会发生这种情况或如何防止这种