Javascript 在文本区域中找到超链接的现有编号设置下一个可用编号保存/单击“模式”

Javascript 在文本区域中找到超链接的现有编号设置下一个可用编号保存/单击“模式”,javascript,jquery,codeigniter,Javascript,Jquery,Codeigniter,我正在使用CodeIgniter&jQuery和parsedown/markdown当我打开引导模式时,它允许我创建一个新的参考样式链接,如图所示 我试图找到一些如何在我的文本区域找到我的下一个可用免费号码的方法,然后单击“在模型中保存”将设置它 I am fine [exmple-1][1] and [example-3][3] [1]: http://www.example.com [3]: http://www.example.com 当我打开我的引导模式并创建一个新的超链接时,它将设

我正在使用CodeIgniter&jQueryparsedown/markdown当我打开引导模式时,它允许我创建一个新的参考样式链接,如图所示

我试图找到一些如何在我的文本区域找到我的下一个可用免费号码的方法,然后单击“在模型中保存”将设置它

I am fine [exmple-1][1] and [example-3][3]

[1]: http://www.example.com
[3]: http://www.example.com
当我打开我的引导模式并创建一个新的超链接时,它将设置并添加下一个可用的编号

这是你的电话号码

问题:如何在引导模式中创建新的超链接 然后单击“保存”,可以找到下一个可用的号码设置它。因为上面的示例中只设置了1和3,所以单击“在模型中保存”时,下一个值应该是2

目前,正如您在下面看到的,我只使用
var counter=1
计数器++以便能够创建数字

脚本:

$('#myLink').on('shown.bs.modal', function() {
    var text = getSelectedText();
    $('#title').val(text.trim());
    $('#url').val('http://');
});    

function getSelectedText() {
    var textarea = document.getElementById("message");
    var len = textarea.value.length;
    var start = textarea.selectionStart;
    var end = textarea.selectionEnd;
    var sel = textarea.value.substring(start, end);
    return sel;
}

var counter = 1;

$('#save-link').on('click', function(e) {
    var textarea = document.getElementById("message");
    var len = textarea.value.length;
    var start = textarea.selectionStart;
    var end = textarea.selectionEnd;
    var sel = textarea.value.substring(start, end);

    var replace = '[' + $('input#title').val() + ']' + '[' + counter + ']';

    var id = '\n   [' + counter + ']: ' + $('input#url').val();

    counter++;

    if ($('#title').val().length > 0) {
        textarea.value = textarea.value.substring(0,start) + replace +
        textarea.value.substring(end,len) + ' \n' + id;
        $('#myLink').modal('hide');
        //$('#myLink form')[0].reset();
    } else {

        return false;
    }
});

正如Barmar所说:将已生成的数字存储在对象或数组中,然后检查下一个不存在的数字:

var existingNumbers = [1, 3];

function getNextNumber() {
    var i = 1;

    while (existingNumbers.indexOf(i) > - 1) {
        i++;
    }

    existingNumbers.push(i);
    return i;
}
然后使用以下命令获取下一个数字:

var number = getNextNumber();

您可以使用简单的正则表达式在文本区域中查找使用过的数字:

function findAvailableNumber(textarea){
    //Find lines with links
    var matches = textarea.value.match(/(^|\n)\s*\[\d+\]:/g);

    //Find corresponding numbers
    var usedNumbers = matches.map(function(match){
        return parseInt(match.match(/\d+/)[0]); }
    );

    //Find first unused number
    var number = 1;
    while(true){
        if(usedNumbers.indexOf(number) === -1){
            //Found unused number
            return number;
        }

        number++;
    }

    return number;
}
添加函数,删除行
var counter=1和替换
计数器++带有
var计数器=findAvailableNumber(textarea)


您在哪里检查号码是否可用?您只需使用
计数器
而不进行检查。是的,您只需使用var counter即可使用一个对象,该对象的键是已使用的数字。编写一个循环,查找不在对象中的第一个数字。
[2]
最初是如何被跳过的?是否有一个按钮来删除列表中间的一个项目?这听起来像是一个解决问题的解决方案。为什么数字是连续的很重要?看起来您正在生成降价或其他内容,在这种情况下,数字是否连续并不重要…单击“保存”时,显示数字4应该从1开始。这
var existingNumbers=[1,3]对我来说。它实际上应该从数字2开始。第4个是下一个,因为我已经添加了1和3来证明它跳过了它们。如果你想让它们从1开始,你只需要清空现有的编号:
var existingNumber=[]
@wolfgang1983--是否还有删除链接的选项?如果它存在,这个解决方案也需要包含它。我按照你说的做了,但是当单击我的引导模式上的保存时,get matches Null无法让它工作当我想使用我的引导模式时,如果不存在,将不允许我创建链接