2009-04-15 34 views
4

我使用jQuery.autocomplete(1.02)我的搜索框和我想確切串和子串匹配。我並不在乎數據庫的負載情況,我很高興它能夠在每次擊鍵時觸發一個查詢,並完全繞過緩存 - 我只是不想錯過任何東西。繞道jQuery.autocomplete所有cacheing(1.02)

爲此我試圖設置cacheLength = 1,允許的最低限度,但自動完成功能拒絕斷火每個鍵一個GET請求。

searchbox   GET_request 

    'a'  -> http://localhost/service_search_request?q=a 
    'ar'  -> http://localhost/service_search_request?q=ar 
    'ars'  -> http://localhost/service_search_request?q=ars 

相反,它發出的第一和第三,錯過了第二,讓我對「AR」錯誤的結果: - /我已經清除了緩存和會話,但它看起來像某種緩存是仍在繼續。 AFAIK我沒有任何代理正在進行,我每次都會移動刷新。它看起來很可能是這種行爲來自jQuery.autocomplete本身。

所以我的問題是...

A)這個問題似乎有可能?即它是一個功能,或者可能是一個錯誤?

B)如果是的話是有它周圍的清潔方法是什麼?...

C)如果沒有,你會用什麼來代替自動完成?

自然D)不,你只是不正確地使用它你沖洗!總是一種可能性,事實上我寧願花時間沿着這條路走 - 假設它帶有一個鏈接到我沒有找到/閱讀的文檔!

乾杯,

羅傑:)

回答

4

我不知道爲什麼cacheLength不起作用,但與自動完成的麻煩了。恕我直言,它有錯誤。但是,在list of options中,有一個matchSubset可以設置爲false。

編輯: 圍繞行335的某處是一個稱爲「請求」的函數。你可以添加一些調試消息吧,看看會發生什麼:(注:您需要firebug安裝或「控制檯」將是未知的)

function request(term, success, failure) { 

    console.debug("ac request..."); 

    if (!options.matchCase) 
     term = term.toLowerCase(); 

    var data = cache.load(term); 

    console.debug("ac request 1, loaded data from cache: " + data + " term: " + term); 

    // recieve the cached data 
    if (data && data.length) { 
     success(term, data); 
    // if an AJAX url has been supplied, try loading the data now 
    } else if((typeof options.url == "string") && (options.url.length > 0)){ 

     console.debug("ac request 2, data is not in the cache, request it"); 

「flushCache」可以很容易地就可以把函數中使用/設置爲選項。我用這個來清除Cache,如果後端可能有更多的數據:

formatItem: function (data,i,n,value){ 
    if(i === (this.max -1)){ 
     console.debug("flushCache"); 
     jQuery(this).flushCache(); 
    } 

    return data[1] + " (" + data[0] + ")"; 
} 
+0

呀試圖matchSubset設置爲真假兩 - 縹緲: -/ 說不上來是否有在自動完成代碼的黑客或尋找另一個插件。不知道我的JavaScript是足夠熱足以改變/修正它,但如果我創建我自己的哈克叉我維持它的流暢,嗯。 – user84643 2009-04-15 09:22:00

+0

文檔也提到.flushCache(),但我不確定如何才能在自動完成之前觸發它。如果我將它附加到可能會導致競爭條件的keyUp事件不是?我想這裏一定是一種方式來做到這一點,但我無法理解語法和更多的重點 - 我不知道它是否會工作 – user84643 2009-04-15 10:03:28

+0

我在帖子中回答,看看.... – 2009-04-15 10:42:41

1

我遇到同樣的問題。雖然我已將選項cacheLength設置爲1,但緩存不起作用。

使用您的解決方案在每個打印的字詞後都可以調用flushCache函數。我不能使用:

if(i === (this.max -1)){ 

,因爲「我」,在過濾,但「this.max」還是25的原始後端查詢導致了25後e.g 1返回的行。

然而,這個bug 鍵入包含瑞典字符「A」,「A」或「O」的話時,只有出現。所以也許兌現工作如預期,但不與這些特殊字符。

無論如何。對我來說,解決辦法是始終調用在formatItem()函數flushCache控制:

function formatItem(row, position, n, term) { 

    if($("#keywords-h").length > 0){ 
     $("#keywords-h").flushCache(); 
     } 

     // format Item 
     return "<span>" + row[0] + "</span>"; 
} 

希望這可以幫助別人,如果有人是有特殊字符同樣的問題,請張貼回覆。

1

有了明顯得出這一18個月,但

cacheLength:0

在選項

爲我工作。所以也許最新版本修復了這個錯誤?

1

這對我有效。

function requestData(q) { 
    if (!options.matchCase) q = q.toLowerCase(); 

    //-- I turned off this line 
    // var data = options.cacheLength ? loadFromCache(q) : null; 

    //-- And added this line of code 
    var data = null; 
0

有一個選項可以禁用子集匹配,例如,

$("#query").autocomplete(
    url, 
    { 
     matchSubset: false 
    } 
)