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

我想删除当用户登录我的网站时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顺便说一句)。


当年话下
浏览 120回答 4
4回答

白衣染霜花

关于主题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>&nbsp; &nbsp; <head>&nbsp; &nbsp; &nbsp; &nbsp; <script>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; console.log("title", document.title)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; window.history.replaceState({}, document.title, "newHMTL.page");&nbsp; &nbsp; &nbsp; &nbsp; </script>&nbsp; &nbsp; </head>&nbsp; &nbsp; <body>&nbsp; &nbsp; Testing&nbsp; &nbsp; </body></html>没有预期的错误或警告。关于主题replaceState该规范指出,大多数浏览器都会忽略您传递给的title/参数:document.titlereplaceState目前大多数浏览器都会忽略此参数,尽管将来可能会使用它。在此处传递空字符串应该可以安全地防止将来对该方法进行更改。或者,您可以传递州的简短名称。因此,当我准备好页面时,进行一些更快速的测试。将标题设置为null; undefined; and a function;然后将其传递给replaceState不会更改历史记录中的标题,也不会在有标签<title>或没有标签时在 Chrome 中引发错误。所以 6 次测试。<html>&nbsp; &nbsp; <!-- <title>title</title> -->&nbsp; &nbsp; <head>&nbsp; &nbsp; <script>&nbsp; &nbsp; &nbsp; &nbsp; let title = () => alert("huh?") //null; //undefined;&nbsp; &nbsp; &nbsp; &nbsp; console.log("Title", title);&nbsp; &nbsp; &nbsp; &nbsp; window.history.replaceState({}, title, "NewHTML.page");&nbsp; &nbsp; &nbsp; &nbsp; //works as expected&nbsp; &nbsp; </script>&nbsp; &nbsp; </head>&nbsp; &nbsp; <body>&nbsp; &nbsp; Testing&nbsp; &nbsp; </body></html>

30秒到达战场

是的,它是安全的,因为window当浏览器开始解析头部时,对象就准备好了。浏览器创建窗口 > 窗口将文档对象加载到自身 > 文档对象渲染 DOM > 文档对象加载其所有资源 > 窗口对象触发 onload 事件该head部分是 DOM api 的一部分,而Document对象是对象的属性window,因此document一旦窗口对象准备好,就会加载该部分。由于它history.replaceState是对象的一部分window,因此在头部执行任何脚本部分都是安全的。Window 接口代表一个包含 DOM 文档的窗口;document 属性指向该窗口中加载的 DOM 文档。可以使用 document.defaultView 属性获取给定文档的窗口

芜湖不芜

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

莫回无

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

相关分类

JavaScript