每次我在 Wordpress 中保存、更新或删除艺术家(自定义帖子类型)时,我都会使用这篇文章中的代码生成一个 Artists.json 和一个 events.json 文件。我的问题可能与 WP 无关,这就是我将其发布在这里的原因。
JSON 文件用作 Twitter 的 typeahead.js 的输入。这个 typeahead 给出了奇怪的行为(参见这篇文章),现在看来 json 文件在本地存储中的存储方式有问题。
问题似乎出在将 json 文件转换为本地存储 itemhash 的地方(我真的没有这方面的经验)。json 文件的格式为["artist1", "artist2", "artist3", "..."]
,如果我使用 Chrome 开发人员工具中的资源选项卡,我可以看到 json 文件被转换并存储在本地存储中,但是如果我将__Artists__itemHash
内容粘贴到 txt 文件中,我可以在end 文件被切断。我认为这会导致提前输入的问题?
itemHash 的内容
{
"0":
{
"value":"test10",
"tokens": ["test10"],
"datum": {"value":"test10"}
},
"1":
{
"value":"test8",
"tokens":["test8"],
"datum":{"value":"test8"}
},
"2":
{
"value":"test7",
"tokens":["test7"],
"datum":{"value":"test7"}
},
等等...最后文件看起来像这样:
"278":
{
"value":"Luna // The file ends here...
json 文件中总共有大约 8000 位艺术家,并且该文件生成正确(如:所有艺术家都在那里)。那么也许它与本地存储中的最大文件大小有关?这是我能做出的唯一猜测,希望有人知道这个本地存储的工作原理以及文件被切断的原因。
作为参考,javascript(添加了用于调试的ttl):
$(document).ready(function() {
$('input.search-event').typeahead({
name: 'Events',
prefetch: '/media/json/events.json',
ttl: 0,
limit: 10
});
$('input.search-artist').typeahead({
name: 'Artists',
prefetch: '/media/json/artists.json',
ttl: 0,
limit: 10
});
});
更新
这些东西每分钟都变得越来越奇怪:
在 Chrome 的开发者工具的网络选项卡中,我没有看到 Artists.json 和 events.json。FF 中的 FireBug 也是如此。
在 Safari 的 Web Inspector 中,我确实看到了这两个文件。艺术家.json 的文件内容似乎被破坏了(在文件中间的某个地方有很多空白,然后它继续有更多条目)。但是当我将内容粘贴到编辑器中时,所有条目似乎都在那里。
events.json 的内容似乎很好。
如果我在 events.json 中添加一个条目,当我重置 Safari 时,这个新条目会显示在 Safari 的 typeahead 字段中,但它不会在 FF 和 Chrome 中显示,因此这可能表示缓存/本地存储错误。
Artists.json 不能在所有三种浏览器中运行。它确实会自动建议一些条目,但不会自动建议最后添加的条目(即使在重置 Safari 后也不建议)。这个我真的要疯了...
更新 2
当我window.localStorage.clear();
在 Chrome 的控制台中输入时,本地存储被删除。当我现在重新加载页面时,artist.json 和 events.json 确实会出现在网络选项卡中。进步!然后当我将项目添加到这两个文件时,这些项目不会显示在预先输入字段中,但如果我再次清除本地存储,添加的项目会显示。