`
enix2212
  • 浏览: 25377 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

javascript undo redo

阅读更多
在浏览器中用调试工具看调用结果

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
		"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
	<title>javascript</title>
</head>

<body>
<input type="button" value=" - " id="a" /> <input type="button" value=" + " id="b" />

<input type="button" value=" - " id="c" /> <input type="button" value=" + " id="d" />
<script type="text/javascript">
	/*function a() {
		Do([].slice.call(arguments));
	}
	function Do() {
		var temp = (arguments[0]),indicator = arguments.callee;
		indicator.stack = [];
		indicator.stack[0] = temp;
	}
	a({c:1,b:2}, 123, function(arg) {
		return arg+1;
	});
	function dir() {
		console.log(arguments[0]);
	}
	dir(Do.stack[0][2](3));*/

	function MemoryDo(step){

		var indicator,that,fn,slice,args;
		(
			indicator=arguments.callee,
			slice=[].slice
		)
		if(!(this instanceof indicator)){return new indicator(step);}

		indicator.keys={};
		that=this;
		this.stack=[];
		this.index=0;

		
		fn = indicator.prototype;
        fn.constructor = indicator;

		fn.is=function(o){
			return ({}).toString.call(o).slice(8, -1);
		}
		fn.slice=function(o,index){
			return slice.call(o,index || 0);
		}
		fn.setIndex=function(number){
			if(number<0 || this.is(this.index)!=='Number'){return};
			this.index=number;
		}
		fn.getIndex=function(){
			return this.is(this.index)==='Number' ? this.index : null;
		}
		fn.sign=function(){
			return ('abcdefghijk'[Math.random().toFixed(1) * 10]+this.randomNumber(10000,10000000));
		}
		fn.randomNumber=function(a,b){
			return Math.round(Math.random()*b+a);
		}
		fn.dataBuffer=function(){
			var temp,socureCall=arguments.callee.caller,flag=arguments[0][arguments[0].length-1],data;
			if (socureCall.arguments.length !== arguments[0].length || indicator.keys[flag]==='used') return;

			data=this.stack;
			if(data.length===this.step){data.shift()};

			temp=data[data.length]=[];
			temp[temp.length]=(this.slice(arguments[0],0)).concat(this.sn);
			temp[temp.length]=arguments.callee.caller;

			indicator.keys[this.sn]='used';

			this.index=this.stack.length;
		}
		fn.redo=function(){
			//var data=indicator.stack[indicator.stack.length-1];
			//console.log(data);
			if(this.index===this.stack.length){
				this.re=-1;return;
			}else{
				this.re=1;
				this.virtualDo(this.index+=1);
			}

		}
		fn.undo=function(){
			//var data=indicator.stack[indicator.stack.length-1];
			//console.log(data);
			
			if(this.index===0){
				return;
			}else{
				this.un=1;
				this.virtualDo(this.index-=1);
			}

		}
		fn.virtualDo=function(){
			var data=this.stack,i=0,len=this.index,temp;
			for(;i<len;){
				temp=data[i++];
				temp[1].apply(undefined,temp[0]);
			}
		}


		this.step=this.is(step)==='Number'? step : 10;
		this.sn=this.sign();
		
	}


var a=MemoryDo(4);
var b=MemoryDo(2);
function doIt(o,fn){
	a.dataBuffer(arguments);

	fn(arguments);
	b.dataBuffer(arguments);
}
doIt({a:1,b:2,c:3},function(a){
	console.dir(a);
});
doIt({b:2,c:3},function(a){
	console.dir(a);
});
doIt({c:3},function(a){
	console.dir(a);
});
doIt({d:4},function(a){
	console.dir(a);
});
document.getElementById('a').onclick=function(){
	a.undo();
}
document.getElementById('b').onclick=function(){
	a.redo();
}
document.getElementById('c').onclick=function(){
	b.undo();
}
document.getElementById('d').onclick=function(){
	b.redo();
}
</script>
</body>
</html>


分享到:
评论

相关推荐

    redux-undo-redo:undo redo软件包,用于redux

    redux-undo-redo 用于Redux的撤消重做软件包 该软件包的灵感主要来自开发的。 该软件包将还原重做历史记录添加到还原状态。 对于每个不可撤消的操作,您必须提供其还原操作。 它还支持分组操作,使您可以一步一步...

    undo-redo-vuex:一个Vuex插件,用于模块命名空间的撤消和重做功能

    src =" node_modules/undo-redo-vuex/dist/undo-redo-vuex.min.js " &gt; &lt;/ script &gt; 模块 import undoRedo from "undo-redo-vuex" ; 用法 作为的标准, undo-redo-vuex可以用于以下设置: 如何在商店模块中...

    undo-redo:撤消重做堆栈

    undo-redo,撤消重做数据结构。 版权所有:copyright:2020-2021 Subendra Kumar Sharma。 版权所有。 ( ) 该文件是撤消重做的一部分。 undo-redo是免费软件:您可以根据自由软件基金会发布的GNU通用公共许可证的...

    JS-undo-redo:使用 HTML5 Localstorage 在浏览器中使用 JS 进行撤消、重做和持久性实现

    这是一个非常小的(大约 100 行)javascript 库,它允许利用 HTML5 Localstorage 来实现页面上数据的撤消、重做和持久化。 它是如何开始的 我正在为我们的费用记录创建一个数据输入表。 我很快发现意外删除、关闭...

    vue-store:具有内置undoredo功能的轻量级Vue 3 composition API兼容存储模式库

    商店 轻量级Vue 3组成API兼容的商店模式库。 提供了一个在功能方面与VueX相当的简单替代方案: 简单的API学习; 只有1个功能来创建商店 在本地和全局商店实例之间选择 公开状态为readonly以防止通过意外引用进行...

    undo-redo-stack:撤消重做堆栈

    `UndoRedoStack` 类管理两个堆栈,并提供了`doOperation`、`undo`和`redo`方法来执行操作、撤销和重做。实际使用时,你需要根据具体业务需求来扩展这些基础结构,比如处理更复杂的操作状态或者限制撤销/重做的次数。...

    UndoRedo.js:功能强大且简单的Javascript库提供了撤消功能的历史记录。 就像一台时光机! :one_o’clock:

    UndoRedo.js 功能强大且简单的Javascript库提供了撤消/重做功能的历史记录。 就像一台时光机! :one_o’clock:安装: Node.js : 使用以下命令来安装节点模块: npm install undoredo.js --save 然后简单地要求它: ...

    undo-redo-algorithm:实现一个简单的撤消重做算法

    "undo-redo-algorithm" 提供了一个简单实现这一功能的方法,尤其适用于JavaScript环境。这里我们将深入探讨撤消/重做的基本原理,以及如何在JavaScript中实现这一算法。 撤消/重做算法的核心思想是记录和存储用户...

    meteor-undo-redo:客户端上的撤消重做操作

    gfk:undo-redo 一个附加的Meteor软件包,用于在客户端上撤消,重做操作。安装在“流星”应用目录中,输入: $ meteor add gfk:undo-redo用法创建一个UndoRedo.Manager并注册动作。 var manager = new UndoRedo . ...

    angular-undo-redo:使用命令模式的 Angular 撤消重做功能

    角度撤消重做 这个存储库展示了如何使用在 AngularJS... git clone https://github.com/bobey/angular-undo-redo.git && cd angular-undo-redo npm install bower install grunt 并打开public/index.html 。 就是这样!

    ToDoApp:这是在React JS和Bootstrap中使用UNDO和REDO功能开发的ToDo App

    单击下面预览项目Create React App入门该项目是通过。可用脚本在项目目录中,可以运行:npm start 在开发模式下运行应用程序。 打开在浏览器中查看它。 如果进行编辑,页面将重新加载。 您还将在控制台中看到任何...

    undo-redo:演示演示如何实现撤消模式

    在`undo-redo-master`这个项目中,我们可以期待看到一个完整的Vue应用示例,它演示了如何在实际代码中实现上述概念。该项目可能包含以下文件: - `main.js`:Vue应用的入口文件,初始化Vue实例。 - `App.vue`:Vue...

    vuex-history:UndoRedo for Vuex,在所需的时间手动拍摄状态快照

    Vuex历史 Vuex存储的撤消/重做功能。 特征 Vue友好。 您可以在所需的时间手动拍摄状态快照 vuex-history监视商店状态中的特定属性。 您可以有多个历史列表(例如,主视图的历史列表+侧面板的历史列表) ...

    meteor-undo-redo:为 Meteor 撤消重做

    meteor add babrahams:undo-redo 该包公开了一个名为tx的对象,该对象具有使撤消/重做堆栈运行所需的所有方法。 您可以使用包含{tx: true}的选项散列进行写入,如下所示,使它们可以撤消/重做(请注意,不支持...

    redo:React-待办事项-通量

    1. **React**: React是Facebook开源的一个JavaScript库,用于构建用户界面,特别是单页面应用。它的核心思想是组件化,将UI拆分为可复用的独立组件,每个组件都有自己的视图和逻辑。React通过虚拟DOM(Virtual DOM)...

    JavaScript设计模式Demo

    在JavaScript中,命令模式可用于实现 undo/redo 功能。 8. **模版方法模式**:在抽象类中定义一个算法的框架,允许子类在不改变算法结构的情况下重写算法的特定步骤。 9. **适配器模式**:使接口不兼容的对象能够...

    常用JavaScript编辑器介绍.doc

    该编辑器提供了代码编辑、彩色显示代码、无限次 Redo 和 Undo、JavaScript 和 HTML 模板等功能。但是,该编辑器的功能相对较弱。 4. SurfMap JavaScript SurfMap JavaScript 是一款帮助开发者建立 JavaScript 站点...

    JS 实现undo

    在JavaScript编程中,撤销(Undo)功能是一种常见的需求,它允许用户取消最近的操作,返回到之前的状态。在本文中,我们将探讨如何使用JavaScript实现撤销功能,主要基于给出的"undo_demo"示例来讲解。 首先,理解...

    undo:用于storeon的模块,允许撤消或重做最新事件

    import { undoable , UNDO , REDO } from "@storeon/undo/full" ;const store = createStore ( [ /* all your modules */ undoable ,] ) ;// now you can use UNDO and REDO with dispatchdispatch ( UNDO ) ;安装...

    文档在线编辑器(javascript源码)

    5. ** undo/redo 功能**:通过维护一个操作历史栈,实现撤销和重做功能,这是在线编辑器中的常见需求。 6. **富文本编辑**:编辑器可能支持添加图片、链接、列表等富文本元素,这涉及到HTML标签的生成和处理。 7. ...

Global site tag (gtag.js) - Google Analytics