Descargar código
La idea consiste en tener objetos que representen las acciones (mover, eliminar, resaltar...), los cuales deben guardar el estado anterior del objeto afectado.
- ChangeColorCommand = function(obj, color) {
- this.obj = obj;
- this.new_color = color;
- // guardar estado anterior
- this.prev_color = obj.style.backgroundColor;
- }
- ChangeColorCommand.prototype.execute = function() {
- this.obj.style.backgroundColor = this.new_color;
- }
- ChangeColorCommand.prototype.undo = function() {
- this.obj.style.backgroundColor = this.prev_color;
- }
- execute: ejecuta la acción (dah)
- undo: deshace la acción valiéndose de los datos guardados previamente en el constructor.
- cuando ejecuta una acción, la guarda en undo_stack y borra toda acción que se podía rehacer
- cuando se deshace algo, saca el ultimo objeto de la pila undo_stack, ejecuta el método undo y guarda la acción en la pila redo_stack.
- CommandManager = function(max_undo) {
- // máxima cantidad de acciones guardadas
- max_undo = max_undo || 30;
- // pilas de acciones
- this.undo_stack = [];
- this.redo_stack = [];
- // ejecutar comando cmd
- this.executeCommand = function(cmd){
- cmd.execute();
- // si se sobrepasa cantidad de acciones
- // eliminar primer elemento
- if (this.undo_stack.length >= max_undo) {
- this.undo_stack.shift();
- }
- this.undo_stack.push(cmd);
- this.redo_stack = [];
- }
- // deshacer acción
- this.undoCommand = function() {
- var cmd = this.undo_stack.pop();
- // si existe acción
- if ( cmd ) {
- cmd.undo();
- this.redo_stack.push(cmd);
- }
- }
- }
- var UndoRedo = new CommandManager(),
- box = document.getElementById("box");
- // cambiar color a rojo
- UndoRedo.executeCommand(new ChangeColorCommand(box, "red"));
- // cambiar color a verde
- UndoRedo.executeCommand(new ChangeColorCommand(box, "green"));
- // cambiar de verde a rojo
- UndoRedo.undoCommand();
- // cambiar de rojo a blanco
- UndoRedo.undoCommand();
Eso es todo, espero les haya servido; si tienen alguna duda o critica no duden en dejarla en los comentarios.