【问题标题】:Typeahead.js remote works, but prefetch doesn'tTypeahead.js 远程工作,但预取不
【发布时间】:2015-02-05 20:59:45
【问题描述】:

我在我的网络应用程序中使用 typeahead.js 0.10.5。由于某些奇怪的原因,通过远程工作实时获取建议,而预取被破坏。这里发生了一些不明显和奇怪的事情。根据开发控制台和 Chrome 的网络监视器,它甚至没有对页面加载进行查询。当然,它会在我开始输入时进行查询。

这真的让我很难过——我在这里做错了什么?

    // Instantiate the Bloodhound suggestion engine
    var tags = new Bloodhound({
      datumTokenizer: Bloodhound.tokenizers.obj.whitespace('value'),
      queryTokenizer: Bloodhound.tokenizers.whitespace,
      remote: {
        url: '/tags/tags/search.json?q=%QUERY',
        filter: function (taglist) {
            // Map the remote source JSON array to a JavaScript object array
            return $.map(taglist, function (tag) {
                console.log(tag);
                return {
                    value: tag.tag
                };
            });
        }
      },
      prefetch: {
        url: '/tags/tags/search.json?q=',
        filter: function (taglist) {
            // Map the remote source JSON array to a JavaScript object array
            return $.map(taglist, function (tag) {
                console.log(tag);
                return {
                    value: tag.tag
                };
            });
        },      
      }
    });

    // Initialize the Bloodhound suggestion engine
    tags.initialize();

    // Instantiate the Typeahead UI
    $('#search-tags').typeahead(null, {
        displayKey: 'value',
        source: tags.ttAdapter(),
        hint: true,
        highlight: true
    });

【问题讨论】:

  • 尝试从浏览器的 localStorage 中删除条目并重新开始。
  • 嗯,我尝试使用 Chrome 的“删除最近的活动”并没有这样做,但是在从本地存储中手动删除密钥后它起作用了。将此作为答案发布,我会将其标记为正确。

标签: javascript jquery typeahead.js twitter-typeahead


【解决方案1】:

尝试从浏览器的 localStorage 中删除条目并重新开始。

【讨论】:

    【解决方案2】:

    Bloodhound 对象默认将预取的数据缓存在浏览器的本地存储中,为其分配 1 天的 TTL(生存时间),并且在 TTL 过期之前不会重新验证它。初始化 Bloodhound 对象时,可以更改默认设置“cache: false”和/或“ttl: 1000”(毫秒)。

    预取是相关的,但与缓存略有不同,因为预取的数据不受服务器发送的 Cache-Control 标头的约束。它也存在于 LocalStorage 中,而不是浏览器的缓存中(这就是为什么硬重新加载或缓存清除不会导致重新获取它的原因)。

    另一方面,远程获取的文件会根据 Cache-Control 标头重新验证。因此,如果服务器允许,浏览器仍然可以缓存它们。但是,它们存储在缓存中,而不是 LocalStorage。

    LocalStorage 中存在每个域的空间限制(请参阅What is the max size of localStorage values?),因此大型预取将失败,尽管我不知道 typeahead 是否正常失败(即使用数据,即使它无法存储它)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-23
      • 1970-01-01
      • 2022-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多