在 contentEditable
上设置光标位置

2023-12-25

我正在寻找一个明确的跨浏览器解决方案,当 contentEditable='on'

重新获得焦点时,将光标/插入符号位置设置为最后一个已知位置。内容可编辑 div 的默认功能似乎是每次单击时将插入符号/光标移动到 div 中文本的开头,这是不可取的。

我相信当它们离开 div 的焦点时,我必须将当前光标位置存储在一个变量中,然后当它们再次获得焦点时重新设置它,但我无法将它们放在一起,或找到一个工作的代码示例尚未。

如果有人有任何想法、工作代码片段或示例,我很乐意看到它们。

我还没有任何代码,但这是我所拥有的:

<script type="text/javascript">
// jQuery
$(document).ready(function() {
   $('#area').focus(function() { .. }  // focus I would imagine I need.
}
</script>
<div id="area" contentEditable="true"></div>

附言。我已经尝试过此资源,但它似乎不适用于

。也许仅适用于文本区域(如何将光标移动到可内容编辑实体的末尾 https://stackoverflow.com/questions/1125292/how-to-move-cursor-to-end-of-contenteditable-entity)


该解决方案适用于所有主要浏览器:

saveSelection()附于onmouseup and onkeyupdiv 的事件并将选择保存到变量savedRange.

restoreSelection()附于onfocusdiv 的事件并重新选择保存在中的选择savedRange.

这非常有效,除非您希望在用户单击 div 时恢复选择(这有点不直观,因为通常您希望光标移动到您单击的位置,但为了完整性而包含了代码)

为了实现这一目标onclick and onmousedown事件被函数取消cancelEvent()这是取消事件的跨浏览器功能。这cancelEvent()函数还运行restoreSelection()函数,因为当单击事件被取消时,div 不会接收焦点,因此除非运行此函数,否则根本不会选择任何内容。

变量isInFocus存储是否处于焦点并更改为“false”onblur和“真实”onfocus。仅当 div 未处于焦点时,这才允许取消单击事件(否则您将根本无法更改选择)。

如果您希望当 div 通过单击获得焦点时更改选择,而不是恢复选择onclick(并且仅当使用编程方式将焦点赋予元素时document.getElementById("area").focus();或类似的,然后只需删除onclick and onmousedown事件。这onblur事件和onDivBlur() and cancelEvent()在这些情况下也可以安全地删除功能。

如果您想快速测试此代码,则直接放入 html 页面的正文中应该可以工作:

<div id="area" style="width:300px;height:300px;" onblur="onDivBlur();" onmousedown="return cancelEvent(event);" onclick="return cancelEvent(event);" contentEditable="true" onmouseup="saveSelection();" onkeyup="saveSelection();" onfocus="restoreSelection();"></div>
<script type="text/javascript">
var savedRange,isInFocus;
function saveSelection()
{
    if(window.getSelection)//non IE Browsers
    {
        savedRange = window.getSelection().getRangeAt(0);
    }
    else if(document.selection)//IE
    { 
        savedRange = document.selection.createRange();  
    } 
}

function restoreSelection()
{
    isInFocus = true;
    document.getElementById("area").focus();
    if (savedRange != null) {
        if (window.getSelection)//non IE and there is already a selection
        {
            var s = window.getSelection();
            if (s.rangeCount > 0) 
                s.removeAllRanges();
            s.addRange(savedRange);
        }
        else if (document.createRange)//non IE and no selection
        {
            window.getSelection().addRange(savedRange);
        }
        else if (document.selection)//IE
        {
            savedRange.select();
        }
    }
}
//this part onwards is only needed if you want to restore selection onclick
var isInFocus = false;
function onDivBlur()
{
    isInFocus = false;
}

function cancelEvent(e)
{
    if (isInFocus == false && savedRange != null) {
        if (e && e.preventDefault) {
            //alert("FF");
            e.stopPropagation(); // DOM style (return false doesn't always work in FF)
            e.preventDefault();
        }
        else {
            window.event.cancelBubble = true;//IE stopPropagation
        }
        restoreSelection();
        return false; // false = IE style
    }
}
</script>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 contentEditable
上设置光标位置 的相关文章

随机推荐

  • Git 传输协议规范

    我正在玩git 的传输协议 http git scm com book en Git Internals Transfer Protocols 我只是想知道在尝试阅读源代码之前是否有一些详细的规范 2018 年 5 月更新 从 2018 年
  • AWS Lambda 返回无法导入模块“main”:当模块存在时,没有名为“main”的模块

    因此 我尝试在 AWS Lambda 中设置一个函数来运行我从 zip 导入的一些 python 代码 I ve edited the handler to run the file then the function I want to
  • 正则表达式:仅匹配不重复出现的字符

    我需要查找并替换字符串中所有出现的撇号字符 但前提是该撇号后面没有另一个撇号 That is abc def 是一个匹配但是 abc def 不匹配 我已经编写了一个工作模式 但我相信它可能会更短 更简单 Thanks Valery 取决于
  • 如何在 Coding Ground 上安装 numpy 库?

    我尝试在Python的Coding Ground上安装neurolab termcolor库 使用进入工作文件夹 pip install target neurolab pip install target termcolor 他们都工作了
  • xpath获取整个xml树结构

    有没有办法使用xpath获取整个树结构 例如 假设这是 xml a b b a
  • Python:迷你字母表中所有可能的固定长度单词(排列)

    假设我有一个像这样的字符串 abcdefghijklmnopqrstuvwxyz1234567890 gt lt 这基本上是我键盘上所有字符的列表 比方说 我怎样才能获得由 8 个字符组成的 单词 的所有可能组合 我知道会有数百万种可能性
  • 在本地 xampp/apache 服务器上设置 SSL

    我正在尝试从本地网络服务器访问 Active Directory 为此 我使用最新版本的 xampp 和一个名为的 PHP 脚本adLDAP http adldap sourceforge net 如果我理解正确的话 我需要启用 SSL 来
  • beanWrapperImpl 仅与 websphere 相关

    我们开发中的 WAS 和我们本地的 WAS 之间存在差异 我们的应用程序使用 Spring Security 和 Spring 版本 3 1 0 release 它从 JSP 文件开始 我们试图显示连接的用户名 在 DEV 中的 WAS 上
  • Azure 服务总线队列 PeekBatch 锁定?

    我正在使用PeekBatch
  • ReactJS 中的非阻塞渲染

    我正在学习 ReactJS 并尝试在其上构建一些应用程序 当我尝试修改状态和渲染时 我的页面会冻结 并且在组件变得巨大时渲染完成之前无法执行任何操作 我发现我可以使用shouldComponentUpdate优化我的代码 但我的问题是 我可
  • 如何在 Chrome 中使用 Node 8 检查器?

    我熟悉使用 inspect从节点 7 或其他版本开始的选项 现在在节点 8 上 它不起作用 今天我像往常一样要求节点使用检查器 node inspect debug brk node modules mocha bin mocha o te
  • 有没有办法用Java代码获得一个只有数字(没有小数、空格)的Android软键盘?

    我有一个使用不同键盘布局的 iPhone 应用程序 有些是自定义的 有些是内置的 仅数字 小数点 ISBN 编号的自定义 X 按钮 我想在 Android 上做同样的事情 但即使是普通的InputType TYPE CLASS NUMBER
  • REST API 真的是 RESTful 吗?

    我是这个游戏的新手 所以我可能会误解一些事情 事实上 如果有人告诉我我误解了事情 那将是一种恩惠 也许这个人会足够体贴 为我指明正确的道路 但 中的一个 指导方针 or 最佳实践 REST 适用于 Web 服务 http en wikipe
  • 从静态工厂类访问 ASP.NET Core DI 容器

    我创建了一个 ASP NET Core MVC WebApi 站点 该站点具有基于 James Still 博客文章的 RabbitMQ 订阅者使用 RabbitMQ 进行真实世界的 PubSub 消息传递 http www squarew
  • ASP.NET Core 2.0 Razor 与 Angular/React/等

    我开始开发企业级 Web 应用程序 该应用程序将有许多单独的网页 但其中两个页面更集中且非常繁重 繁重 如大量用户交互 显示大量数据的模式 Websocket 连接 聊天等 我被任命为该项目的首席架构师 因此我正在对最新的 Web 框架进行
  • 使用 RabbitMQ 的工作池和多租户队列

    我开发的 Web 应用程序是一个基于多租户云的应用程序 很多客户端 每个客户端都有自己独立的 环境 但都在共享的硬件集上 我们正在引入用户批量处理的功能为后期处理工作 批处理工作的类型实际上并不重要 只是数量足够 没有工作队列就不太实际 我
  • Eclipse Neon - 禁用欢迎屏幕

    如何禁用 Eclipse Neon 中的欢迎屏幕 虽然有一个Eclipse Juno 的类似问题 https stackoverflow com questions 14637755 eclipse juno how to disable
  • Gridview 中的 DropDownList SelectedIndexChanged 未触发!

    虽然我一直在寻找解决方案 但看到很多帖子向我展示了如何做到这一点 但当 DropDownList 更改时 我无法触发我的 SelectedIndexChanged 事件 DropDownList AutoPostBack 设置为 True
  • 用户权限更改后强制重新验证

    在我的应用程序中 我可以更改后端的用户权限和角色 当用户登录并且我删除用户的角色时 该用户仍然可以访问他实际上不再被允许访问的内容 因为他缺少该角色 仅当用户通过注销 登录重新验证自己时 更改才会生效 所以我的问题是 我可以访问登录用户 不
  • 在 contentEditable

    我正在寻找一个明确的跨浏览器解决方案 当 contentEditable on 重新获得焦点时 将光标 插入符号位置设置为最后一个已知位置 内容可编辑 div 的默认功能似乎是每次单击时将插入符号 光标移动到 div 中文本的开头 这是不可