绕过jQuery.autocomplete上的所有缓存(1.02)

时间:2009-04-15 07:37:11

标签: javascript jquery caching autocomplete autofill

我在搜索框中使用 jQuery.autocomplete(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)不,你只是错误地使用它,你冲洗!总是有可能,而且我更喜欢花时间走这条路 - 假设它带有一个链接到我未能找到/阅读的文档!

干杯,

罗杰:)

5 个答案:

答案 0 :(得分: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”可以很容易地用在您可以附加/设置为选项的功能中。如果后端可能有更多数据,我用它来清除缓存:

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

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

答案 1 :(得分:1)

我遇到了同样的问题。虽然我已将选项cacheLength设置为1,但缓存不起作用。

使用您的解决方案在每个打印的术语之后调用flushCache函数它可以工作。我无法使用:

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

因为'i'在过滤后是例如1,但'this.max'仍然是25,因为原始后端查询导致25个返回的行。

然而,在输入包含瑞典字符'å','ä'或'ö'的字词时,会出现此 ONLY 错误。因此,兑现可能会按预期进行,但不会出现这些特殊字符。

反正。我的解决方案是始终在formatItem()函数中调用flushCache控件:

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

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

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

希望这有助于某人,如果有人遇到与特殊字符相同的问题,请发帖回复。

答案 2 :(得分:1)

显然已经到了这18个月了,但是

  

cacheLength:0

在为我工作的选项中。那么也许最新版本修复了这个错误?

答案 3 :(得分: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;

答案 4 :(得分:0)

可以选择禁用子集匹配,例如

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