如何使用javascript在文本区域内创建有序列表?

如何使用javascript在文本区域内创建有序列表?,javascript,Javascript,我有一个文本区域,我在其中单击按钮添加订单列表项的编号。这是我的代码 var addListItem=function(){ 如果(!this.addListItem.num){ this.addListItem.num=0 } ++this.addListItem.num; var text=document.getElementById('editor').value; console.log('text',text); var exp='\n'+this.addListItem.num+

我有一个文本区域,我在其中单击按钮添加订单列表项的编号。这是我的代码

var addListItem=function(){
如果(!this.addListItem.num){
this.addListItem.num=0
}
++this.addListItem.num;
var text=document.getElementById('editor').value;
console.log('text',text);
var exp='\n'+this.addListItem.num+'.\xa0';
text=text.concat(exp);
document.getElementById('editor')。值=文本;
}

数学家
  • 如果删除列表并再次创建新列表,它将从“1”开始
  • 此外,从最后一个数字开始计数
var addListItem=function(){
如果(!this.addListItem.num){
this.addListItem.num=0
}
++this.addListItem.num;
var text=document.getElementById('editor').value;
//如果textarea为空,则在此处开始新计数
如果(text.trim()=''){
this.addListItem.num=1;//在此处重新开始计数
}
//否则,请检查textarea是否有以前的数字以继续计数
否则{
var lastLine=text.substr(text.lastIndexOf(“\n”)+1.trim();
this.addListItem.num=parseInt(lastLine.slice(0,-1))+1;//将1添加到最后一个数字
}
console.log('text',text);
var exp='\n'+this.addListItem.num+'.\xa0';
text=text.concat(exp);
document.getElementById('editor')。值=文本;
}

数学家

您可以尝试以下方法:

逻辑:
  • 每次单击时,在textarea中获取文本并将其拆分为新行
  • 既然有了行项目,就需要得到以数值开头的最后一句话。但用户可以自己输入新行来格式化文本
  • 为此,在每一行上循环并验证它,它以数字开头,后跟
  • 如果是,则使用子字符串获取此数字并将其解析为int。如果未找到匹配项,则可以返回0
  • 这将确保编号系统,并且不需要变量来保存最后一个值
注意:此逻辑假定最后一个值为最大值。如果您想处理这个问题,只需比较
n
parseInt
并分配最大值即可

示例:

var addListItem=function(){
var text=document.getElementById('editor').value;
var exp='\n'+(getLastNumber(文本)+1)+'.\xa0';
text=text.concat(exp);
document.getElementById('editor')。值=文本;
}
函数getLastNumber(str){
var list=str.split(/[\r\n]/g);
var n=0;
list.forEach(函数){
如果(/^\d+\./.test)){
n=parseInt(s.substring(0,s.indexOf(“.”));
}
});
返回n;
}

数学家

如果您想要一个更健壮的解决方案来处理各种不同的情况,您可以使用正则表达式来检测列表中的数字

此解决方案还允许用户键入自己的号码,而单击按钮仍然有效

这是因为该解决方案使用文本区域内容作为真相的来源,而不跟踪侧面的状态

var addListItem=function(){
var text=document.getElementById('editor').value;
//正则表达式匹配任何具有数字和句点的新行
//并提取数字。请随时使用regex101.com了解
//这是一个更深入的问题。
var listNumberRegex=/^[0-9]+(?=\)/gm;
var existingNums=[];
var-num;
//拿到所有的火柴
while((num=listnumbergex.exec(text))!==null){
现有nums.push(num);
}
//对值进行排序
existingNums.sort();
//使用现有最大数字+1或使用1。
var addListItemNum;
如果(现有nums.length>0){
//获取最后一个数字并添加1
addListItemNum=parseInt(existingNums[existingNums.length-1],10)+1;
}否则{
//否则如果没有,就用1。
addListItemNum=1;
} 
var exp='\n'+addListItemNum+'.\xa0';
text=text.concat(exp);
document.getElementById('editor')。值=文本;
}

数学家

侦听器需要解析内容以对项目重新编号。也许只是在换行符上拆分,每次从1开始重新编号?请解释您更改了什么以及为什么更改我不认为这是OP删除列表和创建新列表的目的,但如果我在两者之间添加新项目,它将转到列表的末尾谢谢,它可以工作。但是我可以在两者之间添加项目