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
})