无法让 document.execCommand('undo') 在浏览器中以相同的方式工作

2023-12-10

我有一些在文本框上实现上下文菜单的代码,上下文菜单有一个Undo and Redo通过使用调用浏览器本机方法的项目document.execCommand('undo').

这段代码在基于 Chromium 的浏览器上按照我的要求运行,但在 FireFox 和 Opera 上结果不符合预期。

我的期望是撤消和重做的功能类似于输入元素的本机浏览器上下文菜单。结果是 input 元素不会撤消和重做,但是带有contenteditable属性集,按预期运行。

所以我想知道这是否是 Chromium 或 FireFox/Opera 浏览器之一的错误,或者我是否没有正确实现代码?

以下代码给出了我面临的问题的示例。感谢所有帮助。

<input contenteditable id="input" type="text"></input>
<div contenteditable id="div" class="inputLike" type="text"></div>
<button id="button1" type="button">Undo</button>
<button id="button2" type="button">Redo</button>

var input = document.getElementById("input"),
    button1 = document.getElementById("button1"),
    button2 = document.getElementById("button2"),
    div = document.getElementById("div");

console.log("Undo", document.queryCommandSupported("undo"));
console.log("Redo", document.queryCommandSupported("redo"));

function doUndo() {
    document.execCommand('undo', false, null);
}

function doRedo() {
    document.execCommand('redo', false, null);
}

button1.addEventListener("click", doUndo, false);
button2.addEventListener("click", doRedo, false);

On jsfiddle

如果您想查看实际的上下文菜单代码,也可以在jsfiddle.


我认为这是不可能的document.execCommand(),至少在 Firefox 中是这样。您可以创建自己的撤消堆栈,或者将来使用新的撤消管理器 API (在 Firefox 20 中实现 but 默认禁用).

以下是使用您自己的撤消堆栈的示例,方法是使用以下命令拍摄值和选择的快照:input事件。例如,您可以通过将连续的键入事件合并到单个撤消项中来改进这一点。浏览器之间的插入符位置也存在一些不一致,但这只是概念证明。

http://jsfiddle.net/FMSsL/

使用新的 DOM UndoManager API 似乎很简单:如果我理解正确并且浏览器支持它,<input>元素将有一个undoManager属性,这是一个对象undo() and redo()方法,所以任务很简单

document.getElementById("input").undoManager.undo();

不幸的是只有 Firefox 20 及以上版本支持UndoManagerAPI,默认情况下是禁用的。即使启用后,下面的演示也无法工作,尽管我认为它应该工作,所以这个选项离可行还有一段路要走。

http://jsfiddle.net/DULV4/2/

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

无法让 document.execCommand('undo') 在浏览器中以相同的方式工作 的相关文章

随机推荐

  • PHP读取受保护的文件

    我在子域 a 上有一个 xml 文件 在子域 b 上有一个 php 脚本 我想通过 PHP 读取并使用 XML 文件中的数据 这就是问题所在 该文件使用 HTTP 身份验证进行保护 如何让PHP登录并读取文件内容 The 网址包装器支持表单
  • 配置 ruamel.yaml 以允许重复键

    我正在尝试使用ruamel yaml用于处理包含重复键的 Yaml 文档的库 在这种情况下 重复的键恰好是合并键 lt lt 这是 yaml 文件 dupe yml foo ref1 a 1 bar ref2 b 2 baz lt lt r
  • 未捕获的引用错误:jQuery 未定义[重复]

    这个问题在这里已经有答案了 我在我的网站上实现了一些 JavaScript 但我不断收到以下错误消息 未捕获的 ReferenceError jQuery 未定义 and 未捕获的语法错误 意外的标记 这是我在 header php 中使用
  • 在 Linux 上的 Eclipse RCP 应用程序中加载本机库

    我有一个 Eclipse RCP 应用程序 它通过 JNI 使用一些本机库 这些是动态链接到彼此的共享库 在 Windows 上我把这些库 如 dll文件 旁边的 RCP 启动器可执行文件 exe 文件并通过加载它们System load
  • 如何使用打字稿在第三方类上定义方法?

    我正在尝试扩展第 3 方课程 但无法让打字稿发挥良好作用 基本上 我不能在新方法中使用类中已定义的任何现有方法 解决方法是重新定义现有方法extensions ts 见下文 但必须有更好的方法 第三方index d ts export as
  • 为什么转置日期格式为 dd/mm/yy 的数组会将某些日期更改为 mm/dd/yy 格式?

    行为 当我转置包含日期的一维数组以便将它们完整地打印到一张纸上时 某些日期会从dd mm yy to mm dd yyyy 特别是当该月的某一天 小于或等于12 例如January 2 2016 02 01 16 or May 11 201
  • 如何在服务器无法访问存储库的情况下从 git 存储库进行部署?

    我在 BitBucket git 存储库中有一个 PHP 项目 我在一个名为 开发 的分支中工作以进行小修复 或者在临时功能分支中工作 当我准备好部署时 我将这些分支合并到 master 中 我想让部署到我的实时站点变得如此简单 合并到 m
  • 为什么 javac“-source”标志不起作用?

    我正在测试javac source标志 我对它应该如何工作有点困惑 请参阅此代码作为示例 这是一个不兼容Java5代码的方法isEmpty 在该版本的 JDK 中没有为 String 定义 public class TestJavac pu
  • 在 beforeunload 事件处理程序中停止页面卸载

    在用户导航页面之前 代码会检查他是否编辑了某些表单字段 如果他这样做了 我会显示一个模式窗口Yes and No纽扣 如果他单击 否 模式应关闭并且用户仍保留在该窗口上 如果是 保存更改并卸载 window bind beforeunloa
  • 在我的 Mac 上的 gdb 7.6 上运行 make 时出错

    我在运行 make for gdb 时遇到以下错误 这是在我的 Mac 上运行配置后的结果 该 Mac 运行 OS X 10 8 5 和 i7 内部处理器 海湾合作委员会版本是 gcc v Configured with prefix Ap
  • 如何在MySQL 5 .7中实现CTE功能?

    我有一个 USERSEARCH 表 应该用于快速搜索用户的子字符串 此功能用于在有人输入用户名或姓名时进行自动完成搜索 但是 我感兴趣的查询只会显示搜索者关注的用户子集的匹配项 这可以在 USERRELATIONSHIP 表中找到 USER
  • Spring @Autowired(required = true) 为 null [重复]

    这个问题在这里已经有答案了 我有一个带有 JSF 2 结束 Spring 4 3 的网络模块 在我使用的支持豆中 Autowired用于 JAR 服务的 DI 在 EAR 模块中有 WAR JAR 和 ServiceSpring 和带有 S
  • 使用的目的是什么? [复制]

    这个问题在这里已经有答案了 DUPE C 中 using 的用法 我看到人们使用以下内容 我想知道它的目的是什么 是不是对象在被垃圾回收使用后就被销毁了 例子 using Something mySomething new Somethin
  • Laravel 4 嵌套资源控制器 Route::resource('admin/photo', 'PhotoController');不工作

    在 Laravel 4 中 我尝试设置嵌套资源控制器 in 路线 php Route resource admin photo Controllers Admin PhotoController in 应用程序 控制器 管理 PhotoCo
  • 访问 iframe 功能

    这个问题似乎只发生在chrome中 这是 iframe 代码 p lalalalallalala p 这就是我创建 iframe 的方式
  • Google Appengine 上的 Google Guice:使用工作 _ah 进行映射

    我有一个 Google Appengine Guice Wicket 应用程序 我的问题是 由于映射 我无法再访问 ah admin 页面 我的 Servlet 模块说 serve with WicketServlet class getW
  • Flutter 蓝牙外部条码扫描器

    我需要使用通过蓝牙连接到我的设备的外部条形码扫描仪 它被识别为键盘 它运行良好 我可以获取文本字段内条形码的内容 问题是我需要将焦点设置到 TextField 才能获取条形码的内容 有没有办法让当前屏幕监听键盘事件 这样我就可以获取数据而无
  • 如何缩放整个div?

    我现在正在玩一个函数这一页 如果您单击 who 部分 div 就会旋转 我希望它能够缩放并使用页面 这可能吗 如何才能做到这一点 旋转后 将其宽度和高度设置为页面的宽度和高度 who rotate angle 90 bind click f
  • 列表中的前 n 项(包括重复项)

    尝试找到一种有效的方法来获取一个非常大的列表中的前 N 个项目 可能包含重复项 我首先尝试了排序和切片 这很有效 但这似乎没有必要 如果您只想要前 20 名成员 则不需要对非常大的列表进行排序 所以我写了一个递归例程来构建 top n 列表
  • 无法让 document.execCommand('undo') 在浏览器中以相同的方式工作

    我有一些在文本框上实现上下文菜单的代码 上下文菜单有一个Undo and Redo通过使用调用浏览器本机方法的项目document execCommand undo 这段代码在基于 Chromium 的浏览器上按照我的要求运行 但在 Fir