Javascript 在<;中使用window.history.replaceState()是否安全;头>;?

Javascript 在<;中使用window.history.replaceState()是否安全;头>;?,javascript,Javascript,我想删除当用户登录我的网站时出现的#u=人工制品 我正在使用以下脚本: if(window.location.hash==='#u=.'){ 常量uri=window.location.toString(); const withNoHash=uri.substring(0,uri.indexOf(“#”); window.history.replaceState({},document.title,withNoHash); } 我希望脚本尽快启动,所以我把它放在了中,它在Chrome和Fir

我想删除当用户登录我的网站时出现的
#u=
人工制品

我正在使用以下脚本:

if(window.location.hash==='#u=.'){
常量uri=window.location.toString();
const withNoHash=uri.substring(0,uri.indexOf(“#”);
window.history.replaceState({},document.title,withNoHash);
}
我希望脚本尽快启动,所以我把它放在了
中,它在Chrome和Firefox上似乎工作得很好

当脚本在
中执行时,
窗口.历史记录
API准备就绪,这是否标准化了?


(顺便说一句,
document.title

是的,当浏览器开始解析head部分时,
窗口
对象将准备就绪

浏览器创建窗口>窗口将文档对象加载到自身>文档对象渲染DOM>文档对象加载其所有资源>窗口对象激发onload事件

head
部分是domapi的一部分,
Document
对象是
window
对象的一个属性,因此一旦window对象就绪,
文档将被加载。
由于
history.replaceState
window
对象的一部分,因此在head部分执行任何脚本部分都是安全的

窗口接口表示包含DOM文档的窗口;document属性指向该窗口中加载的DOM文档。可以使用document.defaultView属性获取给定文档的窗口


关于
窗口的主题

标准浏览器实现了一个
窗口
接口,在该接口中,一个全局
窗口
属性向文档中的javascript公开。即使打开了新选项卡,后续导航也会在同一
窗口中加载不同的文档。因此,您在文档中使用的属性,如
window.location
window.history
,将在用户(从Facebook)导航到您的页面之前显示在
窗口中,从而可供您的文档使用

这也适用于在新浏览器窗口中直接加载页面时-文档将有权访问
窗口
属性。有关
窗口
窗口
的详细信息,请参见:

如果您担心页面被非标准浏览器加载,或者由于某种原因,窗口属性的
历史记录
位置
属性被覆盖,您可以在调用它们之前,检查它们是否可用:

if (window && window.location && window.location.hash) {
// safely use window.location.hash here
}
但即使这样,客户端的浏览器也会抑制错误

关于使用
文档.title
replaceState()

规范将其指定为字符串,因此根据设计,如果未设置,它将返回空字符串。Mozilla没有警告您在文档完全加载之前使用它。更多

下面是我做的一些快速测试,看看使用不带
标记的HTML页面是否确实如此

<html>
    <head>
        <script>
            console.log("title", document.title)
            window.history.replaceState({}, document.title, "newHMTL.page");
        </script>
    </head>
    <body>
    Testing
    </body>
</html>

它非常安全,但是如果没有
DOMContentLoaded
监听器,我不会在开发中使用它。为了更加安全并考虑到那些使用旧浏览器的用户,我建议您为
DOMContentLoaded
window.onload添加侦听器,这样您就不会在加载速度较慢的页面上遇到任何问题。还有
window.history
API,因为它是一个本机函数,不需要单独的功能,所以您可以立即安全地使用它;DR
添加一个
DOMContentLoaded
侦听器以防万一。

Aloha)是的,它对您和您的客户端是安全的,因为窗口是一个全局对象,在浏览器中每个人都可以使用,任何人都可以使用它。您的功能可以由任何人执行。在这种情况下,不要担心安全;)

坦率地说,我不确定我是否理解为什么在执行JavaScript时,
窗口
文档
API的任何部分都不会准备好。据我所知,没有先例表明API的某些部分需要先异步实例化,然后才能在代码中使用——这是有道理的,它们是环境的一部分,并且在环境出现时就存在。您是否有证据/理由相信引发这个问题的其他原因?我不确定我是否理解您的问题,因为能够执行脚本意味着在该上下文中可以使用完整的web API。另外,如果脚本目前在chrome和ff中运行,这还不够好吗?也许更多的上下文是needed@AlexanderNied在从html解析并实例化之前,
document.head
document.body
是著名的
null
,但这是DOM的一部分<代码>窗口
API确实应该随时准备好,除非另有说明。@引发这个问题的所有原因确实是DOM API在
中没有准备好,因此,我担心
window
api。这与手头的问题无关,但是如果用户登录到您的某个uri中已经有非fb散列的站点,那么您当前的脚本是否会捕获到该伪制品?您如何知道这一点?你能在这方面参考W3C规范吗?这是什么引语?实际上很明显,浏览器首先创建的是窗口对象,然后是与url相关的属性<代码>窗口对象有一个关联的文档,它是一个文档对象。它是在创建窗口对象时设置的,并且仅在导航过程中从初始的about:blank Document开始更改。
reference[replaceState
title
参数与文档的
title
没有关系,它只是设置了I may misr
<html>
    <!-- <title>title</title> -->
    <head>
    <script>
        let title = () => alert("huh?") //null; //undefined;
        console.log("Title", title);
        window.history.replaceState({}, title, "NewHTML.page");
        //works as expected
    </script>
    </head>
    <body>
    Testing
    </body>
</html>