js实现撤销恢复功能

xiaoxiao2021-02-28  70

Js实现撤销恢复功能

之前一个项目要自己写个前端插件,其中一个的功能是实现对表格(table)的撤销和恢复功能,在网上百度了一大堆也没有找到合适的方法,后来灵光一闪,想到了一个简单的方法:用数组保存之前对表格的操作,执行撤销和恢复的时候去取数组的最后一个里面的信息实现操作。

1.      先定义2个数组,分别对应撤销操作和恢复操作。

var__gridundo = [];                 //撤销操作存放数据

  var __gridredo = [];                 //恢复操作存放数据

2. 在对表格操作时保存操作信息到对应的操作。

//删除表格的一行

jxd.opticket.grid.deleteRow = function(index){

         …………………….//删除操作

         //用于撤销和恢复的信息

                 var undo = {};

      undo['index'] = index;//index表示表格的行索引

      undo['oper'] ='delete';//oper表示对表格的操作类型

      undo['data'] = data;//data表示被删除的行信息

   __gridundo.push(clone(undo));//把撤销信息加到数组中

   __gridredo.splice(0,__gridredo.length);//这里需要把恢复数组中内容清空,因为撤销和恢复是相对的操作,比如删除-->撤销-->恢复—>撤销,这样的操作是可以的,但是如果删除-->撤销-->删除,这样的操作就不能再恢复了,可以参照word文档的撤销和恢复来理解这句。

}

/**

     *撤销之前行操作

        *

     */

   jxd.opticket.grid.undo= function(){

         //判断撤销数组中有没有数据

if(__gridundo.length ==0){

            return ;

         }

         var table = $("#"+__ids.itemsGrid);

         var undo = __gridundo[__gridundo.length- 1];//最后一个就是最近的操作

         var index = undo['index'];//表格的行索引

         var oper = undo['oper'];//对表格的操作

         var up; //行上移还是下移

         var data ;//行数据

         if(oper =='move'){

            up= undo['up'];

         }else{

            data= undo['data'];

         }

         if(oper =='insert'){//如果之前对表格的操作是添加一行,那么撤销就是删除刚刚添加的行

            _deleteRow(parseInt(index));//调用删除行操作,这里的删除行的方法不是上面的删除行方法,因为这里的删除行方法里不需要向撤销数组中添加撤销的信息

         }elseif(oper == 'delete'){

            _insertRow(parseInt(index),data);

        }elseif(oper == 'move'){

            if(up ==true || up == 'True'){

                _moveRow((parseInt(index)- 1),false);

            }else{

                _moveRow((parseInt(index)+ 1),true);

             }

          }

         __gridredo.push(clone(undo));//把现在撤销的数据加到恢复的数组中

      __gridundo.splice(__gridundo.length- 1,1);//删除撤销数组中最后一个数据,因为已经撤销过了。

}

/**

    * 恢复之前行撤销的操作

    *

    */

jxd.opticket.grid.redo = function(){

      if(__gridredo.length ==0){

            return ;

         }

         var table = $("#"+__ids.itemsGrid);

         var redo = __gridredo[__gridredo.length- 1];

         var index = redo['index'];

         var oper = redo['oper'];

         var up;

         var data ;

         if(oper =='move'){

            up= redo['up'];

         }else{

            data= redo['data'];

         }

         if(oper =='insert'){

            _insertRow(parseInt(index),data);

         }else if(oper == 'delete'){

            _deleteRow(parseInt(index));

         }else if(oper == 'move'){

            if(up ==true || up == 'True'){

                _moveRow((parseInt(index)),true);

            }else{

                _moveRow((parseInt(index)),false);

            }

         }

         __gridundo.push(clone(redo));

      __gridredo.splice(__gridredo.length- 1,1);

}

到这里简单的js实现撤销和恢复操作就完成了

转载请注明原文地址: https://www.6miu.com/read-48087.html

最新回复(0)