Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/440.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript HTML5/jQuery:pushState和popState-深度链接?_Javascript_Jquery_Html_Deep Linking - Fatal编程技术网

Javascript HTML5/jQuery:pushState和popState-深度链接?

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

首先,我似乎无法理解pushState函数中的第一个参数是用于什么的?我该怎么说呢?我只想在滚动页面时更改url。我正在查询视口中当前元素的ID,其ID也应该是url中的链接。这与下面的代码配合得很好

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);
    });