如何撤消/重做javascript正则表达式。替换脚本?
我的目标是能够撤消(使用如何撤消/重做javascript正则表达式。替换脚本?,javascript,html,jquery,regex,Javascript,Html,Jquery,Regex,我的目标是能够撤消(使用ctrl+z)一个。单击脚本后替换它 e、 g。 “word sample”点击修复按钮后会变成“word sample”。我需要一个功能,以便用户可以在需要时使用ctrl+z反转此更改 我知道浏览器不会自动支持它,因为这是一个javascript操作 请参阅我的代码片段,以演示在单击“修复”后“撤消”不起作用 函数fixTextarea(textarea){ textarea.value=textarea.value.replace(“,”,“,”)) .替换(“;”
ctrl+z
)一个。单击脚本后替换它
e、 g。
“word sample”
点击修复按钮后会变成“word sample”
。我需要一个功能,以便用户可以在需要时使用ctrl+z
反转此更改
我知道浏览器不会自动支持它,因为这是一个javascript操作
请参阅我的代码片段,以演示在单击“修复”后“撤消”不起作用
函数fixTextarea(textarea){
textarea.value=textarea.value.replace(“,”,“,”))
.替换(“;”,“;”)
.替换(“.”,“)
.替换(“,”)
.替换(“,”)
.替换(“-”、“-”)
.替换(/(^ |[-\u2014\s(\[“])”)/g,“$1\u2018”)
.替换(/'/g,“\u2019”)
.替换(/(^ |[-\u2014/\[(\u2018\s])”/g,“$1\u201c”)
.替换(/“/g,“\u201d”)
};
函数fixtext(){
设textarea=document.getElementById(“textarea1”);
textarea.select();
固定文本区域(文本区域);
}
window.addEventListener('DOMContentLoaded',函数(e){
var区域=document.getElementById(“textarea1”);
var getCount=函数(str,search){
返回str.split(search).length-1;
};
var replace=函数(搜索,替换为){
if(类型(搜索)=“对象”){
area.value=area.value.replace(搜索,替换为);
返回;
}
如果(面积值索引(搜索)>=0){
var start=area.selectionStart;
var end=area.selectionEnd;
var textBefore=area.value.substr(0,结束);
var lengthDiff=(replaceWith.length-search.length)*getCount(textBefore,search);
area.value=area.value.replace(搜索,替换为);
area.selectionStart=开始+长度差异;
area.selectionEnd=终点+长度差;
}
};
});
textarea{
-webkit盒阴影:无;
-莫兹盒阴影:无;
盒影:无;x;
背景色:#fafafa;
宽度:30%;
高度:100px;
字体系列:“Calibri”,无衬线;
大纲:无;
}
.nbtn{
边框:1px实心;
边框颜色:#555555;
边界半径:3px;
填充:9px 9px;
字体大小:13px;
文本对齐:居中;
光标:指针;
颜色:#000000;
背景色:#e0f2f1;
字体大小:粗体;
边缘底部:10px;
}
.nbtn:悬停{
背景色:#fafafa;
}
.nbtn:活动{
背景色:#e0f7fa;
变换:translateY(1px);
大纲:无;
盒影:1px#666666;
}
“单击“修复”以“查看将发生什么”,如果可以,请尝试撤消我的操作。”
修复它
您可以使用下面的代码片段。
在单击“修复”btn之前,我保留了一个堆栈(manage ctrl+Z ops的常用数据结构)来保存前面的文本,而不是反转正则表达式操作
在这种类型的解决方案中,我利用了javascript的工作方式以及通过声明一个新函数实现的闭包。
堆栈数组被捕获在fixTextStackGen中,这是函数“修复”文本可以访问的方式。
通过在fixTextStackGen中添加撤销函数声明,“修复”和“撤销”操作都可以访问该数组
请参阅下面的代码:
函数fixTextarea(textarea){
textarea.value=textarea.value
.替换(“,”,“,”)
.替换(“;”,“;”)
.替换(“.”,“)
.替换(“,”)
.替换(“,”)
.替换(“-”、“-”)
.替换(/(^ |[-\u2014\s(\[“])”)/g,“$1\u2018”)
.替换(/'/g,“\u2019”)
.替换(/(^ |[-\u2014/\[(\u2018\s])”/g,“$1\u201c”)
.替换(/“/g,“\u201d”);
}
//新的fix函数
功能固定文本区域2(文本区域){
textarea.value=textarea.value
.替换(/[f|c|e|i]/gim,“b”);
}
常量fixtStackGen=()=>{
让堆栈=[];
设textarea=document.getElementById(“textarea1”);
//延迟计算,现在捕获闭包中的“fix”函数以及堆栈数组
设doFunc=(fixFunction)=>()=>{
stack.push(textarea.value)
textarea.select();
固定功能(文本区域);
}
让undoFunc=()=>{
textarea.value=0=0){
var start=area.selectionStart;
var end=area.selectionEnd;
var textBefore=area.value.substr(0,结束);
变长差=
(replaceWith.length-search.length)*getCount(textBefore,search);
area.value=area.value.replace(搜索,替换为);
area.selectionStart=开始+长度差异;
area.selectionEnd=终点+长度差;
}
};
});
“单击“修复”以“查看将发生什么”,如果可以,请尝试撤消我的操作。”
修正它1
修复它2
不确定你在问什么。如果你想支持“撤销”,你可以保留一个历史缓冲区,并将键/点击/任何东西映射到知道如何获取历史缓冲区中的内容并将其还原的东西。如果只是文本字段内容,那么很容易;如果需要的话