Javascript 如何修改数据列表元素或替代项

Javascript 如何修改数据列表元素或替代项,javascript,html,autocomplete,html-datalist,Javascript,Html,Autocomplete,Html Datalist,我正在通过测试字符串相似性,而不是检查完美的字符匹配,来实现自动完成文本输入。这样,一个下拉列表像数据列表一样仍然会向用户提供建议,即使他们意外地添加了一个额外的字符或将所需的输入拼写错误 我有一个可以工作的Javascript文件,可以将HTML文本输入中的字符串输入与JSON文件中的所有字符串进行比较,JSON文件中包含大约700个学校名称作为字符串。然后,Javascript文件格式化HTML,并将10个最相似的字符串传递到无序列表(用于调试)和数据列表(用户可以在其中选择正确答案)中 但

我正在通过测试字符串相似性,而不是检查完美的字符匹配,来实现自动完成文本输入。这样,一个
下拉列表
数据列表
一样仍然会向用户提供建议,即使他们意外地添加了一个额外的字符或将所需的输入拼写错误

我有一个可以工作的Javascript文件,可以将HTML文本输入中的字符串输入与JSON文件中的所有字符串进行比较,JSON文件中包含大约700个学校名称作为字符串。然后,Javascript文件格式化HTML,并将10个最相似的字符串传递到无序列表(用于调试)和数据列表(用户可以在其中选择正确答案)中

但是,
datalist
似乎内置了自动完成功能,可以检查相同的字符组,如果建议中不存在输入的字符串,
datalist
将智能地删除建议

<input 
    type ="text" 
    id="search" 
    list="hsDropdown" 
    class ="form-control form-control-lg"
    placeholder="High School Name"
    autocomplete="off"
    autofocus = "false"
/>

<hr/>

<p id="word"></p>
<datalist id ="hsDropdown"></datalist>
<ul id ="list"></ul>

</main>

<script src="js/script.js" type ="text/javascript"></script>
<script src="js/ukkonen/index.js" type ="text/javascript"></script>



    我的HTML中的
    datalist
    中的选项由我的script.js正确填充,并带有最相似的字符串,但我需要找到一种方法来覆盖
    datalist
    标记的属性,该属性会导致不出现匹配不完全的结果,或者


    我需要找到另一种方法,从
    文本框中显示
    下拉列表,该列表不限于硬自动更正。

    您可以查看jQuery插件和打开的模糊搜索问题

    ,他实现了
    fuzzy_match
    功能,并将其嵌入插件中,如下所示:

    我还有一个名为matcher的函数,它看起来像:

    我还有一个分类机,它对匹配的元素进行分类(因此匹配的元素位于顶部)

    每当我们在元素上调用select2时,我们都将此匹配器作为匹配器选项传递,将sorter作为sorter选项传递,如下所示:

    是否提供了
    模糊匹配
    功能代码:

    /**
    *
    *@param模式
    *@param str
    *@returns{[boolean,score,formatted]}
    */
    函数模糊匹配(模式,str){
    //分数常数
    var adjacency_bonus=55;//相邻匹配的奖金
    var separator_bonus=10;//如果匹配发生在分隔符之后,则会获得奖金
    var camel_bonus=10;//如果匹配为大写而prev为小写,则为奖金
    var leading_letter_penal=-3;//在第一次匹配之前,对str中的每个字母应用惩罚
    var max_leading_letter_pulty=-9;//前导字母的最大惩罚
    var unmatched_letter_penal=-1;//对每个无关紧要的字母的惩罚
    //循环变量
    var得分=0;
    var-patternIdx=0;
    var patternLength=pattern.length;
    var-strIdx=0;
    var strLength=str.length;
    var=false;
    var prevLower=假;
    var prevSeparator=true;//如果第一个字母匹配得到分隔符加值,则为true
    //如果多个字符串字母与模式匹配,则使用“最佳”匹配字母
    var-bestLetter=null;
    var-bestLower=null;
    var bestLetterIdx=null;
    var-bestLetterScore=0;
    var matchedinces=[];
    //在字符串上循环
    while(strIdx!=strLength){
    var patternChar=patternIdx!=patternLength?pattern.charAt(patternIdx):null;
    var-strChar=str.charAt(strIdx);
    var patternLower=patternChar!=null?patternChar.toLowerCase():null;
    var strLower=strChar.toLowerCase();
    var strUpper=strChar.toUpperCase();
    var nextMatch=patternChar&&patternLower==strLower;
    var-rematch=bestLetter&&bestLower==strLower;
    var advanced=nextMatch&&bestLetter;
    var patternRepeat=bestLetter&&patternChar&&bestLower==patternLower;
    如果(高级| |模式重复){
    分数+=最佳分数;
    匹配的骰子。推(bestLetterIdx);
    bestLetter=null;
    bestLower=null;
    bestLetterIdx=null;
    最佳信用评分=0;
    }
    if(下一场比赛| |重赛){
    var-newScore=0;
    //在第一次模式匹配之前对每个字母应用惩罚
    //注意:std::max,因为惩罚是负值。所以max是最小的惩罚。
    if(patternIdx==0){
    var惩罚=Math.max(strIdx*前导字母惩罚,max前导字母惩罚);
    分数+=处罚;
    }
    //连续发放奖金
    如果(已匹配)
    新闻核心+=邻接奖金;
    //对分隔符后的比赛应用奖金
    if(前置分隔符)
    新闻核心+=分隔符奖金;
    //跨驼峰案例边界应用奖金。包括“聪明”的胰岛检查。
    如果(前置器和strChar==strUpper和strLower!=strUpper)
    新闻核心+=骆驼奖金;
    //如果下一个图案字母匹配,则更新图案索引
    如果(下一次匹配)
    ++patternIdx;
    //更新str中的最佳字母,可能是“下一个”字母或“重赛”
    如果(新闻核心>=bestLetterScore){
    //对现在跳过的信件申请罚款
    如果(最佳字母!=null)
    分数+=不匹配的字母\u处罚;
    bestLetter=strChar;
    bestLower=bestLetter.toLowerCase();
    bestLetterIdx=strIdx;
    bestLetterScore=新闻核心;
    }
    prevMatched=true;
    }
    否则{
    //追加不匹配字符
    formattedStr+=strChar;
    分数+=不匹配的字母\u处罚;
    prevMatched=false;
    }
    //包括“聪明”的胰岛检查。
    prevLower=strChar==strLower&strLower!=strUpper;
    prevSeparator=strChar==''| | strChar=='';
    ++strIdx;
    }
    //申请最后一场比赛的分数
    if(最佳信函){
    分数+=最佳分数;
    匹配的骰子。推(bestLetterIdx);
    }
    //在最后一个模式匹配后完成格式化字符串
    //基于匹配的字母生成格式化字符串
    var formattedStr=“”;
    var lastIdx=0;
    对于(变量i=0;ifunction matcher(term, text){
        if(term.term === undefined){
            return {text: text, score: 1};
        }
        var match = fuzzy_match(term.term, text.text);
        return (match[0])?{text: text, score: match[1]}:false;
    }
    
    function sorter(data) {
        return data.filter(function(item) {
            return !!item;
        }).sort((a, b) => b.score - a.score)
              .map(item => item.text);
    }
    
    $("#element").select2({
      placeholder: 'select a name',
      matcher,
      sorter
    })