var data = { url: $(this).attr('href'), selector: $(this) };
history.pushState(data, 'foo', $(this).attr('href'));
当我这样做时,我收到一个错误:
组件返回失败代码:0x8000ffff(NS_ERROR_UNEXPECTED) [nsIDOMHistory.pushState]
如果我将选择器更改为字符串,那么错误就会消失...... 但是我需要jQuery对象,所以我可以在“popstate”事件上触发点击它:s
答案 0 :(得分:9)
历史状态中的数据必须是可序列化的。也就是说,它必须可以转换为JSON。 $(this)
返回一个类似于数组的对象,其DOM节点无法转换为JSON。你应该寻找一种不同的方式去做你正在寻找的东西。
请记住,推送状态只是 有用的信息,并不是规范的。如果用户无法通过复制并粘贴地址栏中的网址来获得完全相同的内容,那么您就会遇到问题。
答案 1 :(得分:3)
您可以存储对(不可序列化的)富对象的引用,然后通过引用检索它。
见快速演示:
var historyStateReference = {
url1:{/*richobj*/},
url2:{/*richobj*/}
}
var serializableObj = {
richObjRef = "url1",
//otherProps
}
// pushState with a simple serializable Object
history.pushState(serializableObj, null, "newPath");
// then later refrence it via history.state
historyStateReference[history.state.richObjRef]
答案 2 :(得分:0)
考虑将ID或其他唯一属性分配给由jQuery对象表示的DOM节点,然后您可以将该ID的值作为字符串存储在数据对象中,该字符串是可序列化的。
如果元素没有唯一ID,请考虑生成一个并将其添加到元素中。
答案 3 :(得分:0)
扩展Brian Nickel和GregL的答案,你可以通过执行$('#'+ this.id).attr('href')来解决这个问题...只要你按照两个人的建议识别DOM在我之前。
有时我只能得到我想要的结果:
var $this = $('#'+this.id); //.... before hand ...
它可以让我在我的身份更有创意,例如,我可以$('#'+this.id+'*locator*');
... id='abGGFather'
... id='abGFather'
... id='abFather'
... id='ab'