当前位置: 首页 > 面试题库 >

如何通过history.pushState获得有关历史更改的通知?

柯翔
2023-03-14
问题内容

因此,既然HTML5引入history.pushState了更改浏览器历史记录的方法,那么网站开始将其与Ajax结合使用,而不是更改URL的片段标识符。

可悲的是,这意味着这些呼叫无法再由来检测onhashchange

我的问题是:
是否有可靠的方法(黑客?;))来检测网站何时使用history.pushState?该规范未声明有关引发的事件的任何信息(至少我找不到任何东西)。
我试图创建一个Facade,并window.history用我自己的JavaScript对象替换了它,但是它根本没有任何效果。

进一步的说明: 我正在开发一个Firefox插件,需要检测这些更改并采取相应措施。
我知道几天前有一个类似的问题,它询问听某些DOM事件是否有效,但我宁愿不依赖于此,因为可以出于许多不同的原因来生成这些事件。

更新:

使用Firefox 4或Chrome8),显示onpopstatepushState被调用时不会触发(或者我做错了吗?可以随时进行改进!)。

更新2:

另一个(侧面)问题是window.location使用时未更新pushState(但是我认为我已经在此处阅读过此信息)。


问题答案:

5.5.9.1事件定义

popstate 导航到会话历史记录条目时,事件在某些情况下被解雇。

据此,当您使用时,没有理由触发popstatepushState。但是这样的事件pushstate会派上用场。因为history是宿主对象,所以您应该小心使用它,但是在这种情况下,Firefox看起来不错。这段代码可以正常工作:

(function(history){
    var pushState = history.pushState;
    history.pushState = function(state) {
        if (typeof history.onpushstate == "function") {
            history.onpushstate({state: state});
        }
        // ... whatever else you want to do
        // maybe call onhashchange e.handler
        return pushState.apply(history, arguments);
    };
})(window.history);





window.onpopstate = history.onpushstate = function(e) { ... }

您可以window.history.replaceState用相同的方式修补猴子。

注意:当然,您可以onpushstate简单地将其添加到全局对象,甚至可以通过以下方式使它处理更多事件:add/removeListener



 类似资料:
  • 问题内容: 该代码不起作用 问题答案: JavaScript区分大小写。 因此,如果要更改字体大小,则必须执行以下操作:

  • 我需要有关如何更改通过DocuSign向收件人发送电子邮件时显示的名称的帮助。我使用的是REST API,我复制了DocuSign的一个示例。我可以更改电子邮件主题,但我不知道top如何更改电子邮件正文中的[名称]。下面是一个如何更改电子邮件主题的示例。我正在使用c#Web开发。 这些是我想改变的,任何有[名字的东西]: [姓名]通过docusign 提前谢谢你。

  • 我想获取我的贝宝账户交易历史记录。与我登录时可以导出的数据相同。 那里的所有事务都不是通过RESTAPI本身生成的。 我读了一些帖子,上面说在这种情况下不能使用,例如“事务搜索”应用编程接口(https://developer.paypal.com/docs/api/transaction-search/v1/)。 我试过了,但没能成功。 在我获得访问令牌后: 我尝试调用/v1/reporting

  • 文档页面显示boto3支持服务配额,但看起来不支持,或者我在这里做了什么不正确的事情? https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/service-quotas.html

  • 我需要在其中运行 但是,有一个错误是我无法从maven存储库中获取pom文件。

  • 我们有一个Android应用程序,可以实现订阅,出于分析目的,我们需要用户进行的所有交易。 我们希望通过API获取所有事务,但找不到任何返回此信息的Googleendpoint。 在Google Play控制台中,我们可以看到这些事务。 在inspector中,我看到Google使用私有endpoint来获取这些数据,但我找不到任何公共APIendpoint。 Google私有endpoint是,