首先,我想说我做完了我的作业。我知道javascript不应该在页面重新加载后保持它的设置。
我还找到了3种可以做到这一点的方法:
1.饼干
2. html本地存储
3.阿贾克斯
在尝试使用html本地存储实现这一点后,好几天,我已经放弃了。我找到了这个教程,它允许缓存整个html界面 - see "Caching a whole interface"。我使用这种方法取得了一些进展,但最终我失败了。
这是我的filtrify代码:
<script type="text/javascript">
$(function() {
var container = $("#itemListLeading"),
pagination = $("#pagination");
function setLazyLoad () {
container.find("img").lazyload({
event : "turnPage",
effect : "fadeIn"
});
};
function setPagination () {
pagination.jPages({
containerID : "itemListLeading",
perPage : 9,
direction : "auto",
animation : "fadeInUp",
previous : "a.jprev",
next : "a.jnext",
callback : function( pages, items ){
items.showing.find("img").trigger("turnPage");
items.oncoming.find("img").trigger("turnPage");
}
});
};
function destroyPagination () {
pagination.jPages("destroy");
};
setLazyLoad();
setPagination();
var ft = $.filtrify("itemListLeading", "placeHolder", {
close: true, // Close windows after tag select
block : "data-original",
callback: function ( query, match, mismatch ) {
if ( mismatch.length ) $("div#reset").show(); // Show Reset
else $("div#reset").hide();
$('.ft-label').parent() // Hide unrelated tags
.find('li[data-count=0]').hide().end()
.find(':not(li[data-count=0])').show().end();
$(".ft-selected li").css("display","inline-block"); // small tag display fix
destroyPagination();
setPagination();
}
});
$("div#reset span").click(function() { // Make reset button clickable
ft.reset();
});
});
</script>
这是我对本地存储实施的注意事项:
$(function() {
var edit = document.getElementById('filter-menu');
$(edit).blur(function() {
localStorage.setItem('todoData', this.innerHTML);
});
// when the page loads
if ( localStorage.getItem('todoData') ) {
edit.innerHTML = localStorage.getItem('todoData');
}
$("#reset span").click(function() { // Reset cache button
localStorage.clear();
location.reload();
});
});
我遇到的问题:
1.Cache并不总是有效(使用.click功能我得到了更好的结果)
2.当缓存确实有效时,缓存过滤器设置的状态(按下的按钮),但显示所有过滤器对象(而不仅仅是与过滤器设置相关的过滤器对象)
3.我无法使用重置按钮(代码的最后一段)重置缓存(重新加载),尽管当我在firebug中复制localStorage.clear(); location.reload();
时,缓存已重置。
答案 0 :(得分:1)
在您的filtrify回调函数中,您需要将query
保存为字符串,例如本地存储
localStorage.setItem('ftquery', JSON.stringify(query))
然后在实例化filtrify后,您需要“触发”查询
ft.trigger(JSON.parse(localStorage.getItem('ftquery')));
因此,要使用您的代码示例,请编辑filtrify部分,如下所示:
var ft = $.filtrify("itemListLeading", "placeHolder", {
close: true, // Close windows after tag select
block : "data-original",
callback: function ( query, match, mismatch ) {
// save query to localStorage
localStorage.setItem('ftquery', JSON.stringify(query));
...
}
});
// retrieve query from localStorage
if (localStorage.getItem('ftquery')) {
ft.trigger(JSON.parse(localStorage.getItem('ftquery')));
}
答案 1 :(得分:0)
所以,如果你已经设置了javascript解决方案,并且你实际上正在使用jQuery,我会考虑看一下jQuery Cookie插件(https://github.com/carhartl/jquery-cookie)。它非常适合这种情况,可能会激发你进一步调查cookie,比如php。
如果您决定采用这条路线,那么实施将是直截了当的。你可以用类似localStorage的方式处理它:
$(function() {
var edit = document.getElementById('filter-menu').innerHTML;
$.cookie('todoData', edit, { expires: 7 });
});
我已经用它来实现类似的功能集,我相信它在大多数现代浏览器中都得到了很好的处理。我还建议更具体地抓取每个标签,或者循环遍历每个列表项(LI),并用逗号分隔。