首页 > 编程语言 >直播平台搭建源码,纯js实现编辑器撤消/重做

直播平台搭建源码,纯js实现编辑器撤消/重做

时间:2022-12-15 14:11:46浏览次数:62  
标签:Core arrayPrevStep unactive arrayNextStep js 编辑器 源码 ._ prototype

直播平台搭建源码,纯js实现编辑器撤消/重做

核心JS

 

//基类
var Core = function() {}
Core.prototype = {
arrayPrevStep: [], //存放撤消操作方法列表
arrayNextStep: [], //存放恢复操作方法列表
triggerUndo: false, //撤消操作标记
triggerRedo: false, //恢复操作标记
_undo: null, //撤消按钮
_redo: null, //恢复按钮
setStep: function(func) {   //操作之后触发保存的方法(调用后台保存方法)
if (this.triggerUndo) {
this.arrayNextStep.push(func);
if (this._redo.classList.contains('unactive')) {
this._redo.classList.remove('unactive');
}
} else {
if (!this.triggerRedo) Core.prototype.arrayNextStep = [];
this.arrayPrevStep.push(func);
if (this.arrayPrevStep.length > 20) {
this.arrayPrevStep.shift();
}
if (this._undo.classList.contains('unactive')) {
this._undo.classList.remove('unactive');
}
if (this.arrayNextStep.length < 1) {
this._redo.classList.add('unactive');
}
}
Core.prototype.triggerUndo = false;
Core.prototype.triggerRedo = false;
},
_selectionNavUndo: function() {
var _this = this;
_this._undo.addEventListener('click', function() {
var head = _this.arrayPrevStep.length - 1;
if (head !== -1) {
Core.prototype.triggerUndo = true;
try {
_this.arrayPrevStep[head]();
} catch (e) {
_this.arrayPrevStep = [];
}
Core.prototype.arrayPrevStep = _this.arrayPrevStep.slice(0, head);
if (_this.arrayPrevStep.length === 0 &&
!_this._undo.classList.contains('unactive')) {
_this._undo.classList.add('unactive');
}
}
});
},
_selectionNavRedo: function() {
var _this = this;
_this._redo.addEventListener('click', function() {
var head = _this.arrayNextStep.length - 1;
if (head !== -1) {
Core.prototype.triggerRedo = true;
try {
_this.arrayNextStep[head]();
Core.prototype.arrayNextStep = _this.arrayNextStep.slice(0, head);
} catch (e) {
Core.prototype.arrayPrevStep = [];
Core.prototype.arrayNextStep = [];
Core.prototype.triggerUndo = false;
Core.prototype.triggerRedo = false;
console.error(e);
}
if (_this.arrayNextStep.length === 0 &&
!_this._redo.classList.contains('unactive')) {
_this._redo.classList.add('unactive');
}
}
});
}
}
Core.prototype.constructor = Core;
Core.prototype._undo = document.querySelector('.undo');
Core.prototype._redo = document.querySelector('.redo');
// 初始化撤消/恢复按钮
Core.prototype._selectionNavUndo();
Core.prototype._selectionNavRedo();
// 操作场景(输入框改变)
var EditorText = function(el) {
var _this = this;
this._targetObject = el;
this._targetObject.addEventListener("change", function(e) {
var saveVal = _this._text;
_this._text = this.value;
_this.setText(_this._text, saveVal);
})
}
// 继承Core基础类,并新增EditorText特有方法
EditorText.prototype = Object.assign(Object.create(Core.prototype), {
_targetObject: null,
_text: "",
setText: function(newValue, oldValue) {
var _this = this;
_this._targetObject.value = newValue;
_this.setStep(function() {
_this.setText(oldValue, newValue)
})
}
})
EditorText.prototype.constructor = EditorText;
document.querySelectorAll("input").forEach(item => {
// 建立监听
new EditorText(item);
});
 

HTML

 

<html>
<body>
<style>
.main {
margin: 400px auto;
width: 500px;
}
.btn-box {
margin-top: 20px;
}
button{

color: #ffffff;
border: none;
padding: 6px 18px;
border-radius: 3px;
}
button.unactive{
cursor: no-drop;
background-color: #f6f6f6;
color: #999999;
}
</style>
<div>
<div>
<input type="text" name="name" placeholder="请输入姓名">
<input type="text" name="age" placeholder="请输入年龄">
</div>
<div>
<button class="undo unactive">撤销</button>
<button class="redo unactive">恢复</button>
</div>
</div>
<script>
//核心js
</script>
</body>
</html>

 

以上就是直播平台搭建源码,纯js实现编辑器撤消/重做, 更多内容欢迎关注之后的文章 

 

标签:Core,arrayPrevStep,unactive,arrayNextStep,js,编辑器,源码,._,prototype
From: https://www.cnblogs.com/yunbaomengnan/p/16984880.html

相关文章

  • 高性能 Jsonpath 框架,Snack3 3.2.50 发布
    Snack3,一个高性能的JsonPath框架借鉴了Javascript所有变量由var申明,及Xmldom一切都是Node的设计。其下一切数据都以ONode表示,ONode也即Onenode之意,代表任何......
  • React + antd (版本:5)jsx使用Tree组件的经验
    //组件:LeftTree.jsximportReactfrom"react";import{Tree}from"antd";import*asservicefrom"../../util/service";classLeftTreeextendsReact.Compo......
  • 不积跬步,无以至千里【3】【js-2】
    1.addEventListener和onClick()的区别a、addEventListener可以对同一个元素绑定多个事件,执行顺序从上到下依次执行。而onclick同一个元素只能绑定一个事件,如有多个,后面的......
  • jq 解析json
    样例:{    "IP":"192.168.10.100",    "Prod":"5000",    "fy_tp_hellowrd_service":[        {            "Ip":"192.168.10.101", ......
  • API请求JSON特殊处理
    API请求JSON特殊处理场景框架处理的请求和返回的转换后的string,有时候不是我们预期的样子。可以使用JsonSerializerOptions.Converters.Insert()添加一个自定义的转换......
  • js对象中过滤掉null, "", undefined无效值
    exportconstfilterParams=(obj)=>{letnewObj={};for(constkeyinobj){//如果对象属性的值不为空,就保存该属性(如果属性的值为0false,保存......
  • HarmonyOS实现登录页面(六)测试(附DevEco Studio中的js代码)
    测试结果对应代码//data.result为http响应内容,可根据业务需要进行解析console.info('Result:'+data.result);//***http响应码***success:200|serv......
  • 搭建git服务器和源码安装
    创建git用户和组groupadd-g11111gituseradd-md/home/git-g11111-u11111git 安装依赖包yuminstallcurl-develexpat-develgettext-developenssl-develzlib-d......
  • linux上源码安装python
    Linux安装Python2.7以下例子基于python2.7.9,其他版本同理。#1、下载python#wgethttps://www.python.org/ftp/python/2.7.9/Python-2.7.9.tgz 2、解压、编译安装(依次执行......
  • 百度文库-js学习文档
    JS实例学习笔记——w3cschool+菜鸟教程基础实例——w3cschoolwrite()document.write("thisisastring");//⽣成普通⽂本document.write("<br>"+Date());//html+函数......