2010-04-07 39 views
0

我在几个不同的页面上使用Jorn Zaefferer的自动完成插件。在这两种情况下,显示字符串的顺序都有点混乱。jQuery“自动完成”插件搞乱了我的数据顺序

例1:字符串数组:基本上他们是按字母顺序排列,除了常识已经被推到了顶部:

常识,艺术与设计,商科,公民,设计与技术,英语,地理,历史,信息和通信技术,数学,MFL法语,MFL德语,MFL西班牙语,音乐,体育,PSHE,宗教教育,科学,别的东西

显示的串:

常识,地理,艺术和设计,商业研究,公民身份,设计与技术,英语,历史,ICT,数学,M FL法语,MFL德语,MFL西班牙语,音乐,体育,PSHE,宗教教育,科学,别的东西

请注意,地理学已被推到第二个项目,在普通知识之后。其余的都很好。

示例2:字符串数组:如上所述,但使用跨课程而不是常规知识。

跨课程,艺术与设计,商业研究,公民身份,设计与技术,英语,地理,历史,ICT,数学,MFL法语,MFL德语,MFL西班牙语,音乐,体育,PSHE,科学,别的东西

显示的串:

跨学科,公民,艺术与设计,商科,设计与技术,英语,地理,历史,信息和通信技术,数学,MFL法语,MFL德语,MFL西班牙语,音乐,体育,PSHE,宗教教育,科学,别的东西

在这里,公民已经pu流到了第2位。

我已经做了一些尝试,看起来好像有一个错误,指出“在第一个项目之后放置与第一个项目相同的信件并将其他项目单独留下”。有点神秘。我尝试了一些调试,通过触发自动完成插件代码中的警报,但无处不在我可以看到,它使用正确的顺序。它似乎只是在它表现出错的时候。

任何想法的人? 最大

编辑 - 回复克林特

感谢在代码中的相关位指着我顺便说一句。为了使诊断更简单,我将值的数组更改为[“胡萝卜”,“苹果”,“樱桃”],自动完成重新命令为[“胡萝卜”,“樱桃”,“苹果”]。

这里的阵列,它生成用于stMatchSets:

stMatchSets =({ '':[#1 = {值: “胡萝卜”,数据:[ “胡萝卜”],结果是: “胡萝卜”}, #3 = {value:“apple”,data:[“apple”],result:“apple”},#2 = {value:“cherry”,data:[“cherry”],result:“cherry”}] ,c:[#1#,#2#],a:[#3#]})

因此,它将第一个字母一起收集到一张地图中,作为第一遍匹配策略很有意义。我希望它能做的是在填充显示的列表时使用给定的数组值,而不是地图。我不能完全理解代码内部的缓存内容(我对javascript不太熟悉)。

解决 - 我通过在插件中黑客入侵解决了这个问题。
在第549行(或565),我们返回一个变量csub,它是一个保存匹配数据的对象。在它返回之前,我重新排列顺序,使得订单与我们给定的原始数组值相匹配,即我们曾经首先构建索引,并将其放入另一个变量中:

csub = csub。 sort(function(a,b){return originalData.indexOf(a.value)> originalData.indexOf(b.value);})

hacky但它​​的工作原理。就我个人而言,我认为这种行为(可能编码更干净)应该是插件的默认行为:即结果的顺序应该匹配原始传递的可能值的数组。这样,用户可以按照字母顺序排列数组(如果他们想要的话)(以微不足道的方式)以字母顺序得到结果,或者他们可以保留自己的“自定义”顺序。

回答

2

我做的,而不是你的解决方案是什么加

if (!q && data[q]){return data[q];} 

略高于

var csub = []; 

在行〜535找到。

如果我理解正确,这会做什么,以获取输入为空时的缓存数据,在〜472行中指定:stMatchSets[""] = []。假设输入为空时的缓存数据是您首先提供的第一批数据,那么它的效果都很好。

+0

谢谢snz3,完美的作品。欢呼,最大 – 2010-06-21 09:37:24

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

等等。所以,这是一个功能。

+0

谢谢克林特,我不知道我跟着你。当文本字段为空时,列表显示给它的所有选项。为什么它会重新命令它们不同,并且以这种奇怪的方式?即 “第一个给定的项目,其他给定的项目以相同的字母开头,所有其他项目”。这是一个功能是什么?我没有去,我真的在寻求启蒙。谢谢,最大。 此外,除了这种奇怪的行为,我真的很喜欢jorn的自动完成,宁愿坚持下去并修复此问题,而不是再次用其他方法重新开始。 – 2010-04-08 08:45:11

+0

我编辑我的帖子,而不是评论更多在这里,由于stackoverflow没有评论中的换行符。 – 2010-04-08 09:26:38

+0

你有matchContains设置为true吗?如果是这样,请尝试关闭该功能。如果这样做不能达到你想要的行为,你将不得不修改插件代码本身。 – 2010-04-08 15:57:03