为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

当年话下 2023-07-14 15:49:02
我想删除当用户登录我的网站时Facebook 添加到 URL 的#_=_伪影。我正在使用这个脚本:if (window.location.hash === '#_=_') {    const uri = window.location.toString();    const withNoHash = uri.substring(0, uri.indexOf('#'));    window.history.replaceState({}, document.title, withNoHash);}我希望脚本尽快启动,所以我把它放在了<head>Chrome 和 Firefox 上,它似乎工作得很好。window.history当脚本执行时 API 已就绪,这是否标准化<head>?(document.title顺便说一句)。
查看完整描述

4 回答

?
白衣染霜花

TA贡献1796条经验 获得超10个赞

关于主题window


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


这也适用于当您直接在新的浏览器窗口中加载页面时 - 文档将有权访问该window属性。更多信息请Window参见window:https://developer.mozilla.org/en-US/docs/Web/API/Window


如果您担心页面被非标准浏览器加载,或者由于某种原因, window 属性history和location属性被覆盖,您可以在调用它们之前检查它们是否可用:


if (window && window.location && window.location.hash) {

// safely use window.location.hash here

}

但即便如此,客户端的浏览器也会抑制该错误。


document.title关于使用with的主题replaceState()


规范将其指定为字符串,因此根据设计,如果未设置,它将返回空字符串。在文档完全加载之前,Mozilla 不会发出关于使用它的警告。更多信息请参见https://developer.mozilla.org/en-US/docs/Web/API/Document/title


以下是我使用不带标签的 HTML 页面进行的一些快速测试,看看是否确实如此<title>。

<html>

    <head>

        <script>

            console.log("title", document.title)

            window.history.replaceState({}, document.title, "newHMTL.page");

        </script>

    </head>

    <body>

    Testing

    </body>

</html>

没有预期的错误或警告。


关于主题replaceState


该规范指出,大多数浏览器都会忽略您传递给的title/参数:document.titlereplaceState


目前大多数浏览器都会忽略此参数,尽管将来可能会使用它。在此处传递空字符串应该可以安全地防止将来对该方法进行更改。或者,您可以传递州的简短名称。


因此,当我准备好页面时,进行一些更快速的测试。将标题设置为null; undefined; and a function;然后将其传递给replaceState不会更改历史记录中的标题,也不会在有标签<title>或没有标签时在 Chrome 中引发错误。所以 6 次测试。


<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>


查看完整回答
反对 回复 2023-07-14
?
30秒到达战场

TA贡献1828条经验 获得超6个赞

是的,它是安全的,因为window当浏览器开始解析头部时,对象就准备好了。

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

head部分是 DOM api 的一部分,而Document对象是对象的属性window,因此document一旦窗口对象准备好,就会加载该部分。由于它history.replaceState是对象的一部分window,因此在头部执行任何脚本部分都是安全的。

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


查看完整回答
反对 回复 2023-07-14
?
芜湖不芜

TA贡献1796条经验 获得超7个赞

阿罗哈)是的,这对您和您的客户来说是安全的,因为窗口是一个全局对象,每个人都可以在浏览器中使用它,并且任何人都可以使用它。并且您的函数可以由任何人执行。在这种情况下,不用担心安全问题;)



查看完整回答
反对 回复 2023-07-14
?
莫回无

TA贡献1865条经验 获得超7个赞

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

查看完整回答
反对 回复 2023-07-14
  • 4 回答
  • 0 关注
  • 86 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信