Javascript HTML5/jQuery:pushState和popState-深度链接?
首先,我似乎无法理解pushState函数中的第一个参数是用于什么的?我该怎么说呢?我只想在滚动页面时更改url。我正在查询视口中当前元素的ID,其ID也应该是url中的链接。这与下面的代码配合得很好Javascript HTML5/jQuery:pushState和popState-深度链接?,javascript,jquery,html,deep-linking,Javascript,Jquery,Html,Deep Linking,首先,我似乎无法理解pushState函数中的第一个参数是用于什么的?我该怎么说呢?我只想在滚动页面时更改url。我正在查询视口中当前元素的ID,其ID也应该是url中的链接。这与下面的代码配合得很好 var currentHash, url; if (history && history.pushState) { $(window).scroll(function() { hash = $('.layer:in
var currentHash,
url;
if (history && history.pushState) {
$(window).scroll(function() {
hash = $('.layer:in-viewport').attr('id');
catHash = $("#"+hash).parent('section').attr('id');
var data = "nothing";
if ( catHash != undefined )
url = "/" + catHash + "/" + hash;
else
url = "/" + hash;
if ( currentHash != hash ) {
window.history.pushState(data, hash, url);
}
currentHash = hash;
});
}
现在我有两个问题:
1.)现在,当我滚动页面时,地址栏中的url会成功更改。当我最初加载页面时,如何在地址栏中查询url/哈希。想象一下,我现在有一个像www.url.com/deep
这样的链接,我想知道/deep是什么?我是否只需要查询整个top.location并在每个“/”上拆分它?我的意思是这些链接实际上并不存在,所以当调用我用pushState函数操纵的url时,如何避免404页
2.)单击“后退”按钮时,如何查找地址栏中的最后更改?因此,我想在单击“浏览器后退”按钮时查找/deep
,以便在页面上导航回该位置。我猜这可能与popstate有关,但我不知道怎么做
谢谢你的帮助
更新:
window.history.pushState("test", hash, url);
这总是空的。这不应该返回“测试”吗
pushState函数中的第一个参数用于什么
从
状态对象-状态对象是一个JavaScript对象,它与pushState()创建的新历史记录条目相关联。每当用户导航到新状态时,都会触发popstate事件,并且该事件的state属性包含历史记录条目的state对象的副本
因此,当您返回到该状态时,您可以选择返回一组数据
现在,当我滚动页面时,地址栏中的url会成功更改。当我最初加载页面时,如何在地址栏中查询url/哈希
查看位置
对象…但您不需要这样做。您可以(也应该)填充页面服务器端。这是pushState
的优点之一,如果JavaScript不可用,并且服务器端回退顺利集成,则链接仍然有效
单击“后退”按钮时,如何查找地址栏中的最后更改
添加事件侦听器(查找
popState
事件),其中存储的数据将在事件对象上可用 jQuery抽象出事件对象,您需要:event.originalEvent.state
事件.状态
不是事件.数据
是的,我试过了,但是当我控制台.log(事件)时没有事件.状态
代码>只有数据,但是数据总是“空”的,如果我尝试记录事件。state
它也总是空的!好的,找到了解决方案…看起来像$(窗口)。绑定('popstate',函数(事件){
不起作用,但window.onpopstate=函数(事件){
是的!@matt如果你想用jQuery访问状态数据,你需要查看event.originalEvent.state
。谢谢你,我差一点就知道了。我更新了popstate的问题。这样我就可以在pushState中存储例如一个字符串作为第一个数据属性,并在按下后退按钮时返回它,对吗?我只需要知道当我按下浏览器后退按钮时如何查询我最后一次对pushState所做的更改。还有一件事:我得到了服务器端的东西,但是我怎么能(在我的情况下)使用单页布局返回此页面并查询地址栏?我有一个单页布局,我只想在页面上的某个位置更改url…当我发送其中一个Generated(不存在)时深度链接,有人在浏览器中打开它们,我想跳转到页面上的那个位置。正如您在上面看到的那样,/url
只是匹配视口中元素的ID…hash=$('.layer:in viewport')。attr('ID'))因此,当div#example
在视口中时,我的url看起来像abc.com/example
。当我重新加载页面时,我想查询这个/example
并添加一个
并跳到页面上的这个位置。我怎么做?如何使用存储在那里的数据?
$(window).bind('popstate', function(event){
console.log(event.data);
});