如何在可内容编辑的 DIV 中查找光标位置?

2024-03-13

我正在为内容可编辑 DIV 编写一个自动完成器(需要在文本框中呈现 html 内容。因此更喜欢使用 contenteditable DIV 而不是 TEXTAREA)。现在我需要在 DIV 中有 keyup/keydown/click 事件时找到光标位置。这样我就可以在该位置插入 html/文本。我不知道如何通过某些计算找到它,或者是否有本机浏览器功能可以帮助我在可内容编辑的 DIV 中找到光标位置。


如果您只想在光标处插入一些内容,则无需显式查找其位置。以下函数将在所有主流桌面浏览器中的光标位置插入一个 DOM 节点(元素或文本节点):

function insertNodeAtCursor(node) {
    var range, html;
    if (window.getSelection && window.getSelection().getRangeAt) {
        range = window.getSelection().getRangeAt(0);
        range.insertNode(node);
    } else if (document.selection && document.selection.createRange) {
        range = document.selection.createRange();
        html = (node.nodeType == 3) ? node.data : node.outerHTML;
        range.pasteHTML(html);
    }
}

如果您想插入 HTML 字符串:

function insertHtmlAtCursor(html) {
    var range, node;
    if (window.getSelection && window.getSelection().getRangeAt) {
        range = window.getSelection().getRangeAt(0);
        node = range.createContextualFragment(html);
        range.insertNode(node);
    } else if (document.selection && document.selection.createRange) {
        document.selection.createRange().pasteHTML(html);
    }
}

UPDATE

根据OP的评论,我建议使用我自己的Rangy http://code.google.com/p/rangy/库,它向 IE 添加了一个包装器TextRange行为类似于 DOM Range 的对象。 ADOM 范围 http://www.w3.org/TR/DOM-Level-2-Traversal-Range/ranges.html由开始和结束边界组成,每个边界都以节点和该节点内的偏移量表示,以及一系列操作 Range 的方法。这MDC 文章 https://developer.mozilla.org/En/DOM/Range应该提供一些介绍。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在可内容编辑的 DIV 中查找光标位置? 的相关文章

  • jQuery mobile 中的文本区域高度和宽度?

    我修复了 jQuery mobile 中文本区域元素的高度 并且在纵向中得到了完美的高度和宽度 但在横向中宽度没有放大 谁能帮我 提前致谢 HTML
  • 如何删除除任何特定 id 之外的元素

    假设有一个父 id 其中包含许多元素 我想删除除一个元素之外的所有元素 ex parent id children not id n remove
  • JavaScript 添加布尔值

    console log true true 2 console log typeof true true number console log isNaN true true false 为什么两个布尔类型相加会产生一个数字 我有点理解 如
  • 如何正确清理来自 AngularJS 控制器的无效输入的表单?

    我有一个 AngularJS 表单 其中包含 除其他字段之外 类型之一url 后者很重要 因为这会强制相应的输入成为有效的 URL 在某些条件下 例如 要关闭具有此类表单的模式对话框 我想以编程方式清除该表单 为此 我实现了方法reset基
  • jQuery .push 到 .get 调用中的数组给出空结果

    谁能告诉我为什么下面给我一个空字符串 当我console log contentArray in the get 回调函数它显示数据 但是当我尝试在下面的代码中执行它时 结果为空 sectionArray contentArray func
  • .push() 将多个对象放入 JavaScript 数组中返回“未定义”

    当我将项目添加到beats数组然后console log用户时 我得到了数组中正确的项目数 但是当我检查 length 时 我总是得到 1 尝试调用索引总是会给我 未定义 如下所示 Tom beats 1 我想我错过了一些明显的东西 但这让
  • 为什么 setTimeout 在 Chrome 中触发两次,而在 IE 或 Firefox 中则不然?

    有人能告诉我为什么 javascript 函数 生成新号码 在 Chrome 中触发两次 但在 IE 或 Firefox 中则不会 使用 Chrome 20 0 1132 57 IE9 和 Firefox 13
  • ReactTransitionGroup 不适用于 React-redux 连接组件

    我正在开发一个更大的项目 但我创建了这个简短的示例来说明问题 如果我使用Box组件 它的工作原理 它在控制台中输出componentWillEnter and componentWillLeave当我们点击按钮时 如果我使用BoxConta
  • React autoFocus 将光标设置为输入值的开头

    我有一个受控输入 最初显示一个值 我已将该输入设置为自动聚焦 但当我希望它出现在末尾时 光标出现在输入的开头 我知道这可能是因为自动对焦是在值之前添加的 但我不能 100 确定 在输入字段末尾完成光标初始化的最佳方法是什么 var Test
  • JavaScript推送函数中的动态变量

    我在 JavaScript 中使用推送功能 var chartData for var i 0 i lt 3 i chartData push date new Date year s mon s date s hr s min s sec
  • onclick 事件中未调用函数

    我想在每个 YouTube 链接的末尾添加一些 HTML 以在 litebox 中打开播放器 到目前为止 这是我的代码 document ready function var valid url new RegExp youtube com
  • mongodb 聚合 - 累积字段的不同组值

    如果我有Player表格文件 name String score Int 我有Group文档 其中组代表玩家列表 groupName String players ObjectID 玩家可以属于多个组 我想做一个聚合Player文档 按以下
  • 使用 JavaScript 移动页面上的按钮

    我的按钮可以移动 但奇怪的是 我无法弄清楚偏移是否有问题 我希望我的按钮随着鼠标光标移动 但现在它的移动方式不是我想要的 有时它会消失 另外 创建的新按钮是重叠的 我不知道如何解决这个问题并拥有更好的外观 var coorA var coo
  • 改变 JavaScript 中的顶部填充

    以下是我在 css 中设置顶部填充的方法 body font size font size px margin 0 padding 100px 0 20px 0 width 100 important 如何使用最简单的 javascript
  • 用于选择特定 div 中具有特定类的锚元素的 jQuery 选择器是什么

    我有一些这样的代码 我想选择每个 a 带有类的标签status在 div 中foo div a class status a div 你可以这样做 foo find status a
  • Rails 3.1+ 的 Jasmine 与 Mocha JavaScript 测试 [已关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我对茉莉花有经验并且非常喜欢它 有谁有 Jasmine 和 Mocha 的经验 特别是 Rails 的经验吗 我想知道是否值得转用 我已经在 J
  • react-native - 图像需要来自 JSON 的本地路径

    你好社区 我正在react native中开发一个测试应用程序 并尝试从本地存储位置获取图像 我实际在做什么 我将图像直接链接源提供给 var 并在渲染函数中调用此方法 react 0 14 8 react native 0 23 1 np
  • 滚动顶部不符合预期

    Note 由于上次忘记奖励而重新开放赏金 A Woff 大师已经给出答案 我想在用户展开某一行时到达该行 这样当最后一个可见行展开时 用户不必向下滚动即可查看内容 I used example tbody on click td green
  • 如何通过索引访问 JSON 对象中的字段

    我知道这不是最好的方法 但我别无选择 我必须通过索引访问 JSONObject 中的项目 访问对象的标准方法是只写this objectName or this objectName 我还找到了一种获取 json 对象内所有字段的方法 fo
  • 使用velocity.js制作可拖动元素的动画

    我正在使用velocity js 为用户拖动的可拖动 SVG 元素设置动画 然而 velocity js 将先前的 mousemove 坐标排队并通过所有后续的 mousemove 坐标进行动画处理 我想要的是velocity js 不要对

随机推荐

  • 如何在R中提取具有相同名称但不同标识符的列

    抱歉 如果它太基础了 但我对 R 不熟悉 我有一个数据框 其中多个列具有相同的列名 因此在导入到 R 后 已添加标识符 像这样的事情 A c 2 3 5 A 1 c aa bb cc A 2 c TRUE FALSE TRUE B c 1
  • 在 python 中提取和解码字符串化字节字符串?

    我有这样的字符串 其中有一个字符串化的字节子字符串 如下所示 some string b Hurricane Mitch n 提取嵌套 b 字符串以便我可以用 utf8 正确解码它的最佳方法是什么 最直接的方法 仍然比您需要的更强大 但可能
  • 我的 .htaccess 文件无法正常工作

    我已将我的项目添加到免费托管 000webhost 上 我的所有文件都列在 public html 目录中 项目是在codeigniter中构建的 我在 public html htaccess 添加了 htaccess 文件 其中包含 O
  • C for 循环遍历带指针的数组

    我是 C 新手 但我有 Java 和 Android 经验 我的 for 循环有问题 它永远不会结束 只会继续下去 char entered string 50 char p string NULL gets entered string
  • Api-Platform:在 SF 4 中使用 Yaml 配置代替注释

    我想在 Api Platform 中使用 YAML 而不是注释 我没有使用 Api Platform 发行版 而是将 api pack 添加到了现有的 Symfony Flex 项目中 composer req api 文档说 YAML 文
  • “在我的机器上运行” - 如何修复不可重现的错误?

    偶尔 尽管进行了所有测试 我还是收到了客户的错误报告 而我根本无法在办公室重现该错误报告 Apologies to Jeff http www codinghorror com blog archives 000818 html for t
  • PHP 中如何处理并发请求(使用线程、线程池或子进程)

    据我所知 PHP 支持处理多个并发连接 并且根据服务器的不同 可以按照本中提到的方式进行配置answer https stackoverflow com a 1430890 2159867 服务器如何管理多个连接 是为每个请求分叉一个子进程
  • 从 jquery ajax GET 将多个参数传递给 .asmx

    html a fill in names and check it out a br p Enter First Name p
  • JPA 日期文字

    如何在不使用 类型化 参数的情况下表示 JPA 查询中的日期 如果日期确实是固定的 例如 1980 年 3 月 1 日 则代码 TypedQuery
  • 带编译时检查的 l18n 框架

    我目前正在开发一个更大的 Java 桌面应用程序 现在我想添加翻译 l18n 系统让我困扰的是 它不提供任何类型的编译时检查 在java的系统中 你有类似的东西HashMap 其中每个本地化字符串都有一个 Key 翻译后的字符串就是 Val
  • 快速调整每个故事板问题的大小

    我想知道是否有人可以告诉我如何编写此代码 以便它自动调整大小以适应不同的屏幕尺寸 我有 4 个屏幕尺寸不同的故事板 只是想要一种显示代码的方法 如果这个故事板那么 数字改变 遵循这个代码 否则 数字根据故事板大小而变化 这个代码 我已经尝试
  • Git 克隆错误“CONNECT 后来自代理的 HTTP 代码 504”

    我在公司防火墙后面的办公室工作 我的系统是Windows 7 使用consola组件 通常我需要设置代理连接才能让 GIT 与 github 一起工作 但是当我尝试克隆存储在私有 Stash Atlassian 中的存储库时 我收到此错误
  • 甲骨文移动平均线

    我有一个表 日期 有效负载 其中包含大约 10 年的数据 我想计算移动平均值 MA 以基于 14 天 2 周 和 90 天 12 周 间隔显示有效负载的趋势 我已经编写了这个查询 但它给了我错误的值 SELECT x ABS LTMA ST
  • 解析 phantomjs 中的 post 数据

    I am working with the POSTMAN extension to chrome and am trying to send a post request to phantomjs I have managed to se
  • Visual Studio 2008 中 BizTalk 架构项目的引用问题

    在大型 VS 2008 解决方案中 我们有不同的架构项目和映射项目 映射项目引用了适当的模式项目 总体来说效果很好 但是 最近我添加了一个新的架构项目 它始终如一地给出了同样的问题 当我向其中添加新架构 并且想要在已引用该架构项目的映射项目
  • 在Puppeteer中进行网页抓取时如何处理验证码?

    我正在使用 Puppeteer 进行网页抓取 我刚刚注意到 有时 由于我通过计算机进行的访问量很大 我尝试抓取的网站会要求输入验证码 验证码形式如下所示 因此 我需要有关如何处理此问题的帮助 自从我使用 Express 和 EJS 将值发送
  • 使用 iframe 时,Angular 2 应用程序组件 ngOnInit 被调用两次

    我正在开发一个 Angular 2 应用程序 该应用程序将通过其他网站上的 iframe 进行交付 在测试时我注意到当我加载应用程序时应用程序组件ngOnInit 函数被调用两次 我觉得这很奇怪 因为当我 自己 测试应用程序时 即不是通过
  • 如何使用 javascript 提取并更改 url 路径?

    我正在尝试提取部分 url 并使用 javascript 将其替换为自定义文本 例如 我想获取当前的 url 例如 mydomain com url part to change some other stuff 然后更改要插入的 url
  • 如何将对象文字作为聚合物属性传递

    为了单独测试我的一些聚合物自定义元素 我希望能够传入 js 对象文字来获取通常来自父元素的一些属性 我很难弄清楚如何做到这一点 请参阅此示例代码 如果它按照我希望的方式工作 它会显示一个 1 和一个 2 彼此相邻 但它不起作用
  • 如何在可内容编辑的 DIV 中查找光标位置?

    我正在为内容可编辑 DIV 编写一个自动完成器 需要在文本框中呈现 html 内容 因此更喜欢使用 contenteditable DIV 而不是 TEXTAREA 现在我需要在 DIV 中有 keyup keydown click 事件时