如何在兼容浏览器的 JavaScript 中撤消和重做事件?

2023-12-30

我有一个 T 恤定制设计软件工具,必须为可拖动的文本添加重做和撤消事件

http://wordpress.tshirtecommerce.com/design-online/?product_id=17 http://wordpress.tshirtecommerce.com/design-online/?product_id=17

我尝试过使用撤消管理器插件http://mattjmattj.github.io/simple-undo/ http://mattjmattj.github.io/simple-undo/


我们到了..

这是一个执行撤消和重做缓冲区并使用函数闭包来处理重做的简单示例。

这当然是一个非常简单的示例,因此希望它也很容易遵循,但没有理由该技术不能用于撤消/重做任何操作。传递给函数闭包的任何内容都可以被捕获,然后进行播放。

var e = {}; //lets store references to the dom elemements
Array.prototype.slice.call(document.querySelectorAll("[id]")).
  forEach(function (el) { e[el.id] = el; });

var stack = [],
    stackPos = 0,
    names = [];

function showNames() {
  e.lbNames.textContent = names.join(', ');
  e.btUndo.disabled =  stackPos <= 0;
  e.btRedo.disabled = stackPos >= stack.length;
  e.lbBuffer.textContent = stack.length;
}

btAdd.onclick = function () {
  if (!ipName.value) return alert("Please enter some text");
  //a function closure to capture the name
  function add(name) {
    return function () {
      e.ipName.value = '';
      e.ipName.focus();
      names.push(name);
      stackPos ++;
      showNames();
    }
  }
  //no need for closure here, as were just going to pop the
  //last one of the names, and shift the undo-pos back
  function undo() {
    stackPos --;
    names.pop(); 
    showNames();
  }
  //now lets add our do & undo proc
  var doadd = add(ipName.value);
  stack.splice(stackPos);
  stack.push({
    do: doadd,
    undo: undo
  });
  //lets now do our inital do
  doadd();
};

btUndo.onclick = function () {
  var p = stack[stackPos - 1];
  p.undo();
};

btRedo.onclick = function () {
  var p = stack[stackPos];
  p.do();
};

showNames();
<form onsubmit="return false">
  name: <input id="ipName">
  <br><br>
  <button type="submit" id="btAdd" >Add</button>
  <button id="btUndo">Undo</button>
  <button id="btRedo">Redo</button>
  Buffer = <span id="lbBuffer"></span>
  <pre id="lbNames"></pre>
</form>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在兼容浏览器的 JavaScript 中撤消和重做事件? 的相关文章

  • 如何格式化 Highcharts 的 (x,y) 对数据的日期时间

    我的序列化方法会产生如下所示的日期时间字符串 2014 07 09T12 30 41Z 为什么下面的代码不起作用 function container highcharts xAxis type datetime series data x
  • 图像无法在带有 DOM 的 IE 中加载:控制台中的 7009 错误(无法解码)

    当在 IE 中的单个页面上加载许多图像时 在 IE11 中重现 其中一些图像开始加载失败 并在控制台中出现类似以下警告的内容 DOM7009 无法解码 URL 处的图像 某些唯一的 url 当我查看网络流量时 似乎确实从服务器收到了每个图像
  • 隐藏 Div 的父级

    我只是想隐藏父divcomments section div class content content green div div div 我试过这个 document getElementById comments section pa
  • Draggable JS Bootstrap 模式 - 性能问题

    对于工作中的项目 我们在 JavaScript 中使用 Bootstrap Modal 窗口 我们想让一些窗口可移动 但我们遇到了 JQuery 的性能问题 myModal draggable handle modal header Exa
  • 防止 iOS 键盘在 cordova 3.5 中滚动页面

    我正在使用 Cordova 3 5 和 jQuery mobile 构建 iOS 应用程序 我在大部分应用程序中禁用了滚动功能 但是 当我选择输入字段时 iOS 键盘会打开并向上滚动页面 我不想要这个功能 由于输入足够高 键盘不会覆盖它 我
  • Angular - CSS - 自定义类型=文件输入,如何使用按钮而不是标签?

    我制作了一个类型为 file 的自定义输入字段 因为我不喜欢默认的输入字段 为了实现这一目标 我做了
  • 调整图像大小并将画布旋转 90 度

    这里有很多关于在 js 上使用画布旋转图像的主题 我阅读了其中的大部分内容 但无法找到解决我的问题的方法 我正在接收任何分辨率的图像 来自上传组件 我将其大小调整为 1024x768 如下所示 var canvas document cre
  • 尝试将数据存储在点击器网站中

    我正在尝试存储一个名为的变量score无论何时刷新 您都会一次又一次地使用它 我不明白的是它的代码是什么 我尝试了一些方法 但似乎都不起作用 这是我的答题器网站 但是当我尝试使用 JavaScript 来存储它时 它不起作用window o
  • Firefox 不会在使用 jQuery AJAX 加载的内容上呈现 CSS 样式

    我有一个网站 允许用户对书籍和文章发表评论 主表单有一个搜索输入 用于查找相关书籍或文章 来源 我使用 jQuery 根据输入的搜索词从外部站点动态加载新源 然后还使用 AJAX 返回列表中的源 我有两个问题 现在 在用户输入四个字符后 j
  • 使用 Jquery 清除 5 个空 TD

    我有一个正在填充的动态表 我知道我不应该这样做 但是你会如何连续找到 5 个空 TD 并隐藏它们呢 因此 如果行包含 5 个空 TD 则不显示 TD 我想删除每个实例 td td td td td td td td td td 在 DOM
  • 使用 CSS 或 Javascript 填充动画

    我只是想知道是否可以使用 CSS 或 javascript 创建填充动画 基本上我想创建一个填充动画 如下图所示 http i40 tinypic com eit6ia png http i40 tinypic com eit6ia png
  • window.location 和 location.href 之间的区别

    我对之间的区别感到困惑window location and location href 两者似乎都以相同的方式行事 有什么不同 window location是一个对象 它保存有关当前文档位置的所有信息 主机 href 端口 协议等 lo
  • 刷新页面时保存用户的选择

    我目前有一个页面显示不同团队的数据 我有一些数据 用户可以单击使其处于 打开 或 关闭 状态 并为每个数据显示不同的图标 它基本上就像一个清单 只是没有物理复选框 我想记住哪些 复选框 已被选中 即使在用户刷新页面或关闭浏览器并稍后返回之后
  • 将 UMD Javascript 模块导入浏览器

    你好 我正在对 RxJS 进行一些研究 我可以通过在浏览器中引用它来使用该库 如下所示 它使用全局对象命名空间变量 Rx 导入 我可以制作可观察的东西并做所有有趣的事情 当我将 src 更改为指向最新的 UMD 文件时 一切都会崩溃 如下所
  • 正则表达式 - 从 markdown 字符串中提取所有标题

    我在用灰质 https www npmjs com package gray matter 以便将文件系统中的 MD 文件解析为字符串 解析器产生的结果是这样的字符串 n Clean er ReactJS Code Conditional
  • 代码镜像错误:未捕获错误:扩展集中无法识别扩展值([对象对象])

    全部 我目前正在从事一个React Electron项目 该项目的目标是完成一个Markdown编辑器 当我配置codemirror 该程序报告错误说 Uncaught Error Unrecognized extension value
  • 如何使用 crypto-js 解密 AES ECB

    我正在尝试将加密数据从 flash 客户端 发送到服务器端的 javascript 在 asp 中作为 jscript 运行 有几个 javascript Aes 库 但它们实际上没有文档记录 我正在尝试使用 crypto js 但无法让代
  • 在 JavaScript 循环之外声明变量可以提高速度和内存?

    C 也有类似的问题 但我们没有看到 JavaScript 的任何问题 在循环内声明变量是否可以接受 假设循环有 200 次迭代 使用样本 2 相对于样本 1 是否有性能要求 内存和速度 我们使用 jQuery 来循环 它提高了我们将 var
  • Jquery - 选择选项后如何获取选项的特定数据类型?

    我将直接跳到标记 然后解释我想要做什么 HTML 选择选项
  • 如何使用asm.js进行测试和开发?

    最近我读到asm js规范 看起来很酷 但是是否有任何环境 工具来开发和测试这个工具 这还只是处于规范阶段吗 您可以尝试使用 emscripten 和 ASM JS 1 并从侧分支在 firefox 构建中运行它 有关 asm js 的链接

随机推荐

  • 如何在现有项目中激活 GitLab Pages?

    我想发布我的 Java 项目的代码覆盖率报告already在 GitLab 上 我使用 JaCoCo 在位于以下位置的文件夹中生成代码覆盖率报告app target site jacoco 我发现我必须激活 GitLab Pages 但是这
  • 获取整个索引中的总词频 (Elasticsearch)

    我试图计算特定术语在整个索引中出现的总次数 术语收集频率 我尝试通过使用术语向量来做到这一点 但这仅限于单个文档 即使在指定文档中存在术语的情况下 响应似乎在某个 doc count 在 field statistics 内 处达到最大值
  • Android 3.0及以上版本无法从res中获取xml数据

    类似问题 https code google com p android issues detail id 38929 很少有预定义的xml我把它放在下面res gt raw gt first xml现在我在运行时获取并显示如下数据 Nod
  • 哪些语言特性不能用 lambda 来定义?

    看起来 lambda 几乎可以用于任何事情 即使它看起来更复杂 但它确实有其局限性 lambda 未涵盖哪些用例 lambda 即函数 本身并不是很有趣 这是 JavaScript 中的一个函数 function id x return x
  • 如何在magento中获取特定页面的URL

    我想在 Magento 中获取页面的 URL 键 例如 我有一个名为 What s New 的 CMS 页面 其标识符 或 URL 键 为 whats new 因此它的正确 URL 是http mysite com whats new 目前
  • Gem 未安装,显示连接错误

    当我在创建新的 gemset 后尝试安装像捆绑器或 rake 这样的 gem 时 它没有安装 但如果我安装旧版本 它对我来说工作正常 这是安装gem时的错误日志 gem install rake Fetching rake 0 9 2 2
  • 如何使用 Nexus One 运行层次结构视图

    我正在尝试使用层次结构查看器在 Nexus One 上调试 Android 应用程序 我在桌面上启动层次结构视图 在 设备 下 我看到我的手机 但是当我单击 启动服务器 时 我看到 版本 2 协议 2 当我启动层次结构查看器时 终端上的 v
  • webpack 创建 CSS 组件范围

    我目前正在学习如何使用 webpack 并且在 CSS 文件方面遇到了一些困难 基本上 我使用 AngularJs 1 5 和 TypeScript 创建两个组件 它们每个都有一个模板 其中包含带有 button 类的 div 元素 每个组
  • onClick 使用 jQuery .animate 转到页面底部

    我有一个表 其中最后一列包含操作按钮 可在表下打开另一个部分 当该部分打开时 正文页面保留在按下操作列中的按钮的位置 我需要使用 jQuery 最好使用 animate 它将 html 页面滚动到表格下打开的部分 小提琴示例 http js
  • 如何在PHP中输出简单的ascii表?

    我有一些数据 例如 Array 0 gt Array a gt largeeeerrrrr b gt 0 c gt 47 d gt 0 1 gt Array a gt bla b gt 1 c gt 0 d gt 0 2 gt Array
  • 在 VB6 IDE 中工作时卸载 COM 控件

    我日常工作的一部分是维护和扩展遗留的 VB6 应用程序 通用引擎是用 C C 编写的 VB6 使用这些函数来提高性能 当谈到异步编程时 C 接口是不够的 我们依靠 COM 控件来向 VB6 触发事件 我的问题是 当我在 VB6 中注册该控件
  • 如何区分缺少的反序列化字段和空字段?

    我想用Serde https serde rs 将一些 JSON 解析为 HTTP PATCH 请求的一部分 由于 PATCH 请求不传递整个对象 仅传递要更新的相关数据 因此我需要能够区分未传递的值和显式设置为的值null 以及存在的值
  • 使用 Office 365 登录/凭据作为单点登录

    我可以使用 Office 365 登录 凭据作为单点登录吗 实际上 我需要使用 Office 365 登录详细信息登录我的 Web 应用程序 此外 我想在我的 Web 应用程序中使用以下 url 凭据进行单点登录 https portal
  • 通用相关类型可能寿命不够长

    采取以下示例 feature generic associated types allow incomplete features trait Produce type CustomError lt a gt fn produce lt a
  • 为什么 UINavigationBar 背景图像重复?

    图像尺寸为 640 X 44 适用于 iPad 肖像 由于某种原因 它显示为图案图像而不是拉伸的 iOS 6 尝试以下方法来拉伸图像 load the background image navbar png UIImage imageNav
  • Laravel 5.4,重命名用户表列

    所以今天我尝试修改我的 laravel 项目中的默认身份验证 首先 Composer 1 4 2 和 Laravel 5 4 27 也意味着所有依赖项 都是最新的 我用以下方法验证了这一点 composer self update comp
  • 专为 iOS7 设计的 Storyboard 在 4 英寸设备上的 iOS 6 上无法全屏显示

    我正在设计我的 iPhone 应用程序storyboard and auto layout 一切正常iOS 7在 4 英寸和 3 5 英寸设备上 On iOS 6 1该应用程序始终在 3 5 英寸设备上运行 即使在 4 英寸设备上运行 也会
  • kubernetes pod 内存 - java gc 日志

    在 kubernetes 仪表板上 有一个 pod 其中内存使用情况 字节 显示为904 38Mi 该 Pod 包含运行的 Java 应用程序 Xms512m Xmx1024m 以及 kubernetes 部署文件 gt requests
  • 动画 CALayer 背景颜色并更新模型值

    我想要制作动画backgroundColor更改我的 UIView 中的子层 在tintColorDidChange 我需要多次从图层的当前背景颜色到新的色调颜色进行动画处理 每次使用不同的色调颜色 因此背景颜色的模型值需要更新 我不能使用
  • 如何在兼容浏览器的 JavaScript 中撤消和重做事件?

    我有一个 T 恤定制设计软件工具 必须为可拖动的文本添加重做和撤消事件 http wordpress tshirtecommerce com design online product id 17 http wordpress tshirt