Javascript 如何撤销&;是否重新使用我的文本同步解决方案?

Javascript 如何撤销&;是否重新使用我的文本同步解决方案?,javascript,Javascript,没什么 首先,由于某些原因,粘贴选定的文本在该站点不起作用(在我的机器上调试它时起作用)-它会始终在0和0的鼠标位置上进行选择 第二,除了重做和撤消之外,与文本的所有其他交互都必须是良好的 我尝试实现一个缓冲区来存储他们以前的文本替换长度,因为正如您可能知道的那样,重做和撤消没有ev.data,我需要知道我要替换的文本-这些事件会触发新文本和以前的选择开始和选择结束 我已经用我自己的本地服务器替换了post请求,该服务器只是用相同的“请求”修改了前面的文本“received” 我正在尝试实现实时

没什么

首先,由于某些原因,粘贴选定的文本在该站点不起作用(在我的机器上调试它时起作用)-它会始终在0和0的鼠标位置上进行选择

第二,除了重做和撤消之外,与文本的所有其他交互都必须是良好的

我尝试实现一个缓冲区来存储他们以前的文本替换长度,因为正如您可能知道的那样,重做和撤消没有
ev.data
,我需要知道我要替换的文本-这些事件会触发新文本和以前的选择开始和选择结束

我已经用我自己的本地服务器替换了post请求,该服务器只是用相同的“请求”修改了前面的文本“received”

我正在尝试实现实时共享功能,以便每个参与者只发送新旧文本之间的差异

因此,在大多数情况下,它目前运行良好,除了我不知道如何使重做和撤消工作。任何帮助都将不胜感激

const codelem=document.getElementById(“代码”)
//这里是模拟服务器
//通常,邮政编码会将调整发送到服务器
//和previoustext将是服务器中的副本
//我将等待套接字接收更新并应用它
let previoustext=“”;
常量邮政编码=(startpos,endpos,input,incaseerrormsg)=>previoustext=codeelem.value=previoustext.slice(0,startpos)+
输入+
previoustext.slice(endpos)
//鼠标选择startpos和endpos加上一个标志和一个处理程序
让startpos,
endpos,
mouseshenanigans=假,
MousesheniGanshandler=功能(ev){
//我真的不知道为什么我要在这里检查开始和结束选择是否相等
//在设置标志之前
//在任何情况下,这都不应该有什么不同
this.selectionStart!=this.selectionEnd&(mouseshenanigans=true);
(startpos=this.selectionStart),(endpos=codelem.selectionEnd)
}
//检测鼠标是否选择了文本
codeelem.addEventListener(“选择”,鼠标移动手柄)
//或者如果鼠标在文本中的位置发生了变化
//这也会在每次输入时重置
codeelem.addEventListener(“鼠标”,函数(ev){
mouseshenanigans=false
})
//记录历史
/**@type{[number,number,string][]}*/
让historyredo=[]
/**@type{Number}*/
让currentredo=-1
//粘贴解决方案,这样我就不需要提示用户
//复制和粘贴权限,以查看复制的新文本
//我只是保存粘贴前的最后一个位置
让最后的选择开始
document.addEventListener(“粘贴”,事件=>{
lastselectionstart=codeelem.selectionStart
})
codeelem.addEventListener(“输入”,异步函数(ev){
//如果鼠标已选择文本
//用那个
const startopsinner=mouseshenanigans?startpos:this.selectionStart,
endposinner=mouseshenigans?endpos:this.selection结束
//详细诊断
console.log('\n')
console.log({
historyredolength:historyredo.length,
当前重做
})
console.log('\n\n\n')
console.log({
value:this.value,
前文,
事件类型:ev.inputType
})
console.log('\n'),console.log({
摩沙尼根人,
selectionStart:this.selectionStart,
selectionEnd:this.selectionEnd,
数据:ev.data,
datansliceselection:this.value.slice(this.selectionStart,this.selectionEnd),
})
mouseshenaigans&(console.log('\n'),console.log({
星际中心,
endposinner,
datasliceposinner:this.value.slice(startopsinner,endposinner)
}))
开关(电动输入型){
//如果删除或插入文本
案例“deleteContentBackward”:
案例“insertText”:
//如果是最后一个字符,则不向后删除
if(this.value.slice(startopsinner,endposinner)==“和&ev.inputType!=“deleteContentBackward”)
邮政编码(
这是selectionStart,
此选项。选择结束+1,
ev.data | |“”,
“你被侵犯了”
)
//否则,取决于是否有鼠标选择
//使用这些的开始和结束位置
//或者使用当前选择
//因为当前所选内容是已替换的文本
其他的
邮政编码(
mouseshenanigans?startpos:this.selectionStart,
mouseshenigans?endpos:this.selectionEnd,
ev.data | |“”,
“你被侵犯了”
)
打破
//粘贴文本的相似情况
//除了我们没有浆糊
//因此,我们使用粘贴事件中最后保存的位置
//从替换的文本中进行切片
案例“insertFromPaste”:
邮政编码(
MousesheniGans?startpos:lastselectionstart,
MousesheniGans?endpos:lastselectionstart,
this.value.slice(lastselectionstart,this.selectionEnd),
“你被侵犯了”
)
打破
//现在我不知道该怎么做了
案例“historyRedo”:
案例“historyUndo”:
console.log('\n')
console.log({
historyredo0:historyredo[currentredo][0],
historyredo1:historyredo[currentredo][1],
historyredo 2:historyredo[currentredo][2]
})
if(this.selectionStart!=this.selectionEnd)
邮政编码(
这是selectionStart,
this.selectionStart+historyredo[currentredo][1],
这个.value.slice(
这是selectionStart,
这是selectionEnd
),
“你被侵犯了”
)
//正在尝试保存以前的一些数据
ev.inputType==“historyUndo”?(historyredo.push([startopsinner,historyredo[currentredo][1],previoustext.slice(startopsinner,endposinner)],++currentredo:(-currentredo,historyredo.pop())
打破
}
//正在尝试保存以前的一些数据
常数