我在几个不同的页面上使用了Jorn Zaefferer的Autocomplete插件。在这两种情况下,显示的字符串的顺序都有些混乱。
示例1:字符串数组:基本上它们按字母顺序排列,除了已被推到顶部的常识:
一般知识,艺术与设计,商业研究,公民,设计与技术,英语,地理,历史,ICT,数学,MFL法语,MFL德语,MFL西班牙语,音乐,体育,PSHE,宗教教育,科学,还有其他的东西
显示的字符串:
一般知识,地理,艺术与设计,商业研究,公民,设计与技术,英语,历史,ICT,数学,MFL法语,MFL德语,MFL西班牙语,音乐,体育,PSHE,宗教教育,科学,还有其他的东西
请注意,在通用知识之后,地理位置已被推到第二项。其余的都很好。
示例2:字符串数组:如上所述,但使用跨课程而不是常识。
跨课程,艺术与设计,商业研究,公民,设计与技术,英语,地理,历史,ICT,数学,MFL法语,MFL德语,MFL西班牙语,音乐,体育,PSHE,宗教教育,科学,还有别的什么
显示的字符串:
跨课程,公民身份,艺术与设计,商业研究,设计与技术,英语,地理,历史,ICT,数学,MFL法语,MFL德语,MFL西班牙语,音乐,体育,PSHE,宗教教育,科学,还有别的什么
在这里,公民身份已被推到第二位。
我已经尝试了一点,似乎有一个错误说“把东西放在与第一个项目之后的第一个项目相同的字母开头,然后单独留下”。有点神秘。我通过触发自动完成插件代码中的警报尝试了一些调试,但我能看到的任何地方,它都使用了正确的顺序。似乎只是当它被证明它出错了。
任何想法? 最大
编辑 - 回复克林特
感谢您指点我的相关代码btw。为了使诊断更简单,我将值数组更改为[“carrot”,“apple”,“cherry”],自动完成重新排序为[“carrot”,“cherry”,“apple”]。
这是为stMatchSets生成的数组:
stMatchSets =({'':[#1 = {value:“胡萝卜”,数据:[“胡萝卜”],结果:“胡萝卜”},#3 = {值:“苹果”,数据:[“ apple“],结果:”apple“},#2 = {value:”cherry“,数据:[”cherry“],结果:”cherry“}],c:[#1#,#2#],a :[#3#]})
所以,它正在将第一个字母收集到一个地图中,这作为首次匹配策略是有意义的。我想要它做的是,在填充显示的列表时,使用给定的值数组而不是映射。我无法理解代码内容中缓存的内容(我对javascript不是很有经验)。
已解决 - 我通过破解插件中的javascript来修复此问题 在第549行(或565),我们返回一个变量csub,它是一个保存匹配数据的对象。在它返回之前,我重新排序,以便顺序匹配我们给出的原始值数组,即我们用于构建索引,我已经将其放入另一个变量:
csub = csub.sort(function(a,b){return originalData.indexOf(a.value)> originalData.indexOf(b.value);})
hacky但它确实有效。我个人认为这种行为(可能编码得更干净)应该是插件的默认行为:即,结果的顺序应该与原始传递的可能值数组相匹配。这样,用户可以按字母顺序对其数组进行排序,如果他们想要(这是微不足道的)按字母顺序获得结果,或者他们可以保留自己的“自定义”顺序。答案 0 :(得分:2)
我所做的不是你的解决方案就是添加
if (!q && data[q]){return data[q];}
正好在
之上var csub = [];
在第535行中找到。
如果我理解正确的话,这样做是为了获取输入为空时的缓存数据,在第472行中指定:stMatchSets[""] = []
。假设输入为空的缓存数据是您提供的第一个数据,那么它就是好的。
答案 1 :(得分:1)
我不确定这个自动完成插件,但你确定它不只是试图给你最好的匹配吗?我的自动完成插件做了一些启发式操作,并重新排序了这种性质。
这让我得到了另一个答案:那里有一百万个jQuery自动完成插件。如果这个不满足你,我相信还会有另一个。
编辑: 事实上,我完全确定它正在做什么。看看第474行:
// loop through the array and create a lookup structure
for ( var i = 0, ol = options.data.length; i < ol; i++ ) {
/* some code */
var firstChar = value.charAt(0).toLowerCase();
// if no lookup array for this character exists, look it up now
if( !stMatchSets[firstChar] )
等等。所以,这是一个功能。