在内容可编辑的 div 中设置光标位置

2023-12-19

Summary:

我试图达到当用户输入 a 时的效果( or [在内容可编辑的div, 第二) or ]是自动插入的,并且插入符号位于两者之间,即之间( and ).


FIDDLE http://jsfiddle.net/N6xFx/1/

在右侧键入--s 并看看它在第一行中如何工作,而在第二行中不起作用。


我的努力:

我正在使用这段代码(通过Tim Down https://stackoverflow.com/users/96100/tim-down)以突出显示文本的某些部分并设置光标位置。前者有效,但后者无效:(

function getTextNodesIn(node) { // helper
    var textNodes = [];
    if (node.nodeType == 3) {
        textNodes.push(node);
    } else {
        var children = node.childNodes;
        for (var i = 0, len = children.length; i < len; ++i) {
            textNodes.push.apply(textNodes, getTextNodesIn(children[i]));
        }
    }
    return textNodes;
}

function highlightText(el, start, end) { // main
    if (el.tagName === "DIV") { // content-editable div
        var range = document.createRange();
        range.selectNodeContents(el);
        var textNodes = getTextNodesIn(el);
        var foundStart = false;
        var charCount = 0,
            endCharCount;

        for (var i = 0, textNode; textNode = textNodes[i++];) {
            endCharCount = charCount + textNode.length;
            if (!foundStart && start >= charCount && (start < endCharCount || (start == endCharCount && i < textNodes.length))) {
                range.setStart(textNode, start - charCount);
                foundStart = true;
            }
            if (foundStart && end <= endCharCount) {
                range.setEnd(textNode, end - charCount);
                break;
            }
            charCount = endCharCount;
        }

        var sel = window.getSelection();
        sel.removeAllRanges();
        sel.addRange(range);
    } else { // textarea
        el.selectionStart = start;
        el.selectionEnd = end;
    }
}

Notes:

  1. <div>将有子元素(主要是<br>s).
  2. 使用 vanilla JS 仅需要 Chrome 支持

我的问题:

  1. 为什么上面的功能不起作用?
  2. 如何让它发挥作用?

我花了几个小时寻找这个并没有发现任何有用的东西。有些是关于孩子开始或结束时的设置div但对我来说,它可以是任何地点、任何地方。

UPDATE:

感谢大家终于开发完成 https://chrome.google.com/webstore/detail/prokeys/ekfnbpgmmeahnnlpjibofkobpdkifapn!


这是一个更简单的方法。有几点需要注意:

  • keypress是您可以可靠地检测到已键入哪个字符的唯一关键事件。keyup and keydown不会的。
  • 该代码通过防止默认操作来手动处理括号/大括号的插入keypress event.
  • 使用 DOM 方法时,选择/插入符的内容很简单。
  • 这在 IE Rangy图书馆。没有它也是可能的,但我真的不想编写额外的代码。

Demo:

http://jsfiddle.net/HPeb2/ http://jsfiddle.net/HPeb2/

Code:

var editableEl = document.getElementById("editable");
editableEl.addEventListener("keypress", function(e) {
    var charTyped = String.fromCharCode(e.which);
    if (charTyped == "{" || charTyped == "(") {
        // Handle this case ourselves
        e.preventDefault();

        var sel = window.getSelection();
        if (sel.rangeCount > 0) {
            // First, delete the existing selection
            var range = sel.getRangeAt(0);
            range.deleteContents();

            // Insert a text node at the caret containing the braces/parens
            var text = (charTyped == "{") ? "{}" : "()";
            var textNode = document.createTextNode(text);
            range.insertNode(textNode);

            // Move the selection to the middle of the inserted text node
            range.setStart(textNode, 1);
            range.setEnd(textNode, 1);
            sel.removeAllRanges();
            sel.addRange(range);
        }
    }
}, false);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在内容可编辑的 div 中设置光标位置 的相关文章

  • 如何更改 R Markdown HTML 文档中目录的颜色和属性?

    我花了很多时间谷歌搜索这个 但似乎无法弄清楚 我正在使用 R Markdown 制作 HTML 文档 文档在这里 http rmarkdown rstudio com html document format html http rmark
  • 替换后正确的子串位置

    我有一个由用户提供的这样的函数 function replace function string return string replace smile g replace foo bar baz g text 1 我有这样的输入字符串 v
  • 从请求响应创建 PDF 不适用于 axios,但适用于本机 xhr

    为了强制从服务器下载 PDF 我尝试使用 axios 和本机 xhr 对象 原因是我必须发送post请求 因为我向服务器传递了太多数据 所以带有简单链接的选项 例如site ru download pdf对我不起作用 尽管我最终设法用 Xh
  • 我可以在 .split() 之后直接访问数组的第二个值吗?

    我有这个代码 var tmp this attr id split 我想将分割后的第二个值存储在 tmp 上 因此 如果 this attr id hello marco 我想在 tmp 中存储值 marco 而不是数组 当然 我想直接用一
  • Set-Cookie 在 Chrome 中不起作用

    我有一个奇怪的问题 我开发的网站之一在请求登录页面时返回防伪 cookie 当我检查 chrome 网络选项卡中的响应时 它包含标头 Set Cookie AspNetCore Antiforgery w5W7x28NAIs xxx pat
  • 从 Flow 中的对象值定义联合类型

    我有一个这样的枚举 const Filter ALL ALL COMPLETED COMPLETED UNCOMPLETED UNCOMPLETED 我想做的是声明一个联合类型 如下所示 type FilterType Filter ALL
  • 在 MongoDB 中对 Null 值进行最后排序

    我使用以下查询根据名为 sortIndex 的字段按升序填充 MongoDB 中的项目 有时 数据库中的项目没有 sortIndex 字段 通过以下查询 具有 null sortIndex 的项目显示在顶部 我想知道如何让它们显示在底部 我
  • 一种用javascript创建随机噪声背景图像(png)的方法?

    YouTube的新布局添加了我非常喜欢的背景随机噪声 在其他网站上看到了几乎完全相同的效果 所以我计划在我的网页原型中使用相同的技术 或者至少在其中使用这个 技巧 我的工具箱以供将来使用 图片是这样的 取自http g raphaeljs
  • BS3 - img 响应类 - 为什么没有最大高度?

    引导程序 3 包括 img responsive班级 应用这些 css 设置 display block height auto max width 100 为什么没有max height 100 我发现添加这个使得图片的高度也适合 但我不
  • 如何调试使用 Testaulous (Karma) 运行的 Jasmine 规范?

    我有一个具有 Jasmine 规格的小项目 我使用 Testaulous 作为我的测试运行程序 我不明白如何调试应用程序代码或规范代码 当我尝试在 Chrome 开发工具中设置断点时 下次规范运行时不会命中它 因为它每次都会使用新的查询字符
  • 如果是数字,Chrome 会重新排序对象键,这是正常/预期的吗

    我注意到某些评估电子商务网站的某些鞋码并将其输出到屏幕上的代码会打乱 Chrome 中的顺序 给出的 JSON 可以是 7 9149 9139 10455 17208 7 5 9140 9150 10456 17209 8 2684 914
  • 对数组进行分组并获取计数[重复]

    这个问题在这里已经有答案了 假设我有这样的数组 foo bar foo bar bar bar zoom 我想将其分组 这样我就可以得到这样的计数 foo 2 bar 4 zoom 1 有没有一个实用程序可以做到这一点 只需使用该功能Arr
  • 如何在 Yii 框架中使用 jQuery?

    如何在 yii 中使用 jquery javascript 如何在 yii 中使用我的脚本 为什么这与以其他方式使用 jQuery 有什么不同 如何在yii中使用jquery 如上所述 您可以注册新的脚本块 也可以注册新的外部脚本文件 您还
  • 如何检查令牌过期和注销用户?

    当用户单击注销按钮时 他 她可以自己注销 但是如果令牌过期 他 她就无法注销 因为在我的应用程序中 令牌在服务器端和前端都使用 当用户单击注销按钮时 如果令牌有效 则服务器和浏览器中的令牌都会被清除 当用户未注销并且他 她的令牌过期但未在浏
  • Selenium 查看鼠标/指针

    有什么方法可以在运行测试时真正看到硒鼠标吗 要么是 Windows 光标图像 要么是某种点或十字线或任何东西 我正在尝试使用拖放功能selenium and java in an HTML5Web 应用程序 并且能够看到光标以了解它实际在做
  • 页脚没有停留在底部

    这似乎是有史以来最令人困惑的问题 至少对我来说是这样 知道这个页面 除了标题之外 都已损坏 我复制了 HTML 并尝试小心地删除 WordPress 相关的爵士乐 以便您获得该页面的 html JsBin直播页面 http jsbin co
  • 为什么 iframe 请求不发送 cookie?

    兄弟部门创建了一个 HTML 文件 该文件实际上是少数 iframe 的支架 每个 iframe 都会调用一个托管在 Web 服务器上的报告 其参数略有不同 调用的报告将向未经身份验证的用户显示登录表单 或向已经过身份验证的用户显示报告内容
  • JavaScript - 替换 html 字符串中的特定单词索引

    我在 JS 字符串操作方面面临着一项具有挑战性的任务 有一个 HTML 字符串 我需要在其中替换特定单词索引处的单词 单词索引是忽略 HTML 标签时单词的编号 例如 下面是 HTML 字符串 span style font family
  • 手动渲染 Twig 字符串时禁用 HTML 转义

    我有以下代码将字符串呈现为 HTML 输出 如何阻止它转义 HTML 文本 template who bar params array who gt Foo s twig new Twig Environment new Twig Load
  • 是否可以使用 fs.createWriteStream 在文件中间写入文本? (或者一般在 Node.js 中)

    我正在尝试写入文本文件 但不是像appendFile 那样在最后写入或通过替换整个内容 我看到可以选择从 fs createwritestream 的启动参数开始的位置 gt https nodejs org api fs html fs

随机推荐

  • iOS UrlSession.shared.dataTask 删除 utf-8“+”字符并替换为“”

    我正在使用 x www form endoded 数据创建对 API 的登录调用 我在 Postman 中创建了一个 POST 并收到了 200 回复 我使用Postman的导出功能生成Android的OKHTTP代码和iOS的NSURL代
  • 如何找到堆栈深度?

    我想用单元格替换以下函数调用 参考 从 C 中的任何线程获取调用堆栈 https stackoverflow com questions 1310669 get call stack from any thread within c int
  • 使用 Apache PDFBox 在 PDF 中查找 javascript 代码

    我的目标是提取和处理 PDF 文档可能包含的任何 JavasCript 代码 通过在编辑器中打开 PDF 我可以看到如下对象 402 0 obj lt JavaScript JS n r n Set day 25 r n FormRoute
  • RStudio 服务器上的 R Shiny 开发应用程序启动时 Shiny 崩溃

    我是Shiny的新手 但对R来说并不陌生 由于工作原因 我现在在RStudio服务器中进行R开发 它正在谷歌计算引擎上运行 如果这有什么不同的话 RStudio 服务器运行良好 但 Shiny 出现问题 安装闪亮后 我运行了示例命令 运行示
  • 如何使用内置的“排序”程序同时按两个字段(一个数字,一个字符串)排序?

    我有一个文件 可以说是 bigfile 其中包含以下形式的表格数据 a1 b2 a3 1b1 a2 c3 0 等等 我想在我的 Linux 机器上使用内置的 排序 程序 因此按第四个字段 数字 对该文件进行排序 然后同时按第一个字段排序 我
  • 有没有办法在 HTML 5 Web 音频 API 中检测音频频率?

    我想知道有没有一种方法可以检测 html 5 网络音频中麦克风的音频 我希望制作一个在线吉他调音器 并且我需要从声音输入获得以赫兹为单位的音频 我看到了一些均衡器和滤波器效果 但没有看到任何有关频率识别的内容 编辑 我找到了这个 http
  • 异步套接字连接如何报告错误?

    我正在异步连接套接字 O NONBLOCK connect POSIX 标准指定 在连接套接字后 应通过使套接字的文件描述符准备好写入来发出事件信号 它似乎没有说明异步连接期间的失败 在 Linux 上测试时 似乎有时会出现 POLLOUT
  • 有没有办法在忽略索引的情况下水平连接相同长度的数据帧?

    我有想要水平连接的数据帧 同时忽略索引 我知道对于算术运算 如果使用 numpy 数组 忽略索引可以带来显着的加速 values而不是熊猫系列 是否可以水平连接或合并 pandas 数据帧 同时忽略索引 令我沮丧的是 ignore inde
  • 解析 JSON 并将数据存储在 Python 类中

    这是我的 JSON 数据 id 1 name abc phone 12345 Charecteristics id 1 name Good Looking rating Average id 2 name Smart rating Exce
  • 获取公共 Twitter 个人资料的推文

    我在 Twitter 上有一个用户名列表 其个人资料是公开的 我希望获得他们从形成个人资料之日起发布的 所有推文 我检查了 Twitter4J 示例GitHub https github com yusuke twitter4j blob
  • python cx oracle 需要字符串、unicode 或缓冲区对象

    我试图在 python 中运行以下代码片段来连接到 oracle 但不断遇到以下错误 我尝试了很多组合 但似乎不起作用 我理解这个错误 但不明白这里有什么不兼容 有人遇到过这个问题吗 我如何解决它 文件 第 1 行 在文件 workplac
  • 如何使用 PHP 中的文件系统函数(使用 UTF-8 字符串)?

    我不能使用mkdir创建包含 UTF 8 字符的文件夹 当我在 Windows 资源管理器中浏览此文件夹时 文件夹名称如下所示 Dep sito 我应该怎么办 我用的是php5 Just urlencode http php net url
  • 验证 SOAP 消息

    我无法将任何 SOAP 消息验证为有效的 XML 例如 我从 Wikipedia 上获取了下面的 SOAP 消息 但它失败了Validome验证器 http www validome org xml validate 是验证器错误还是 SO
  • 使用正则表达式的 CakePHP 路由

    我有一个控制器设置来接受两个变量 clients view var1 var2 我想将其显示为 var1 var2 所以我尝试过 Router connect array admin gt false controller gt clien
  • TextureView getBitmap() 忽略 setTransform

    我正在为 CameraPreview 使用纹理视图 由于我使用的显示比例和预览比例之间存在差异textureView setTransform matrix in onSurfaceTextureAvailable 用于缩放预览 当我需要t
  • MySQL 表连接与 AVG()

    我有一个 评级 表 其中包含 作为外键 正在评级的事物的 ID 一个事物可能有多个评级 或者一个值没有评级 我想加入表格来查看所有不同 ID 的不同评级 但现在我在查看没有评级的内容时遇到问题 例如 mysql gt select avg
  • 在Retrofit中将表单数据发送到服务器

    尝试通过 Retrofit 向服务器发送表单数据 但无法向服务器请求 我想发布带有他们的数据的图像数组 val builder MultipartBody Builder MultipartBody Builder setType Mult
  • jQuery 1.6 浏览器检测

    随着 jquery 中所有这些 api 的变化 在 jQuery 中检测浏览器名称和版本的 最新 最佳实践是什么 另外 jquery 是检测浏览器的推荐语言还是应该使用服务器端 您希望避免浏览器检测 而是进行功能检测 浏览器检测很容易被伪造
  • 使用 window.open() 在特定时间间隔后打开新窗口

    我正在寻找 javascript 代码 它将在特定时间间隔后自动打开新选项卡 窗口 我这里有几个网站 在这段代码中 当我按下 html 页面上的按钮时 这些网站会自动打开 我希望这些网站在特定时间间隔后打开 例如 当用户按下 打开 Wind
  • 在内容可编辑的 div 中设置光标位置

    Summary 我试图达到当用户输入 a 时的效果 or 在内容可编辑的div 第二 or 是自动插入的 并且插入符号位于两者之间 即之间 and FIDDLE http jsfiddle net N6xFx 1 在右侧键入 s 并看看它在