2010-04-07 71 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