4 回答

TA貢獻(xiàn)1796條經(jīng)驗(yàn) 獲得超10個(gè)贊
關(guān)于主題window
標(biāo)準(zhǔn)瀏覽器實(shí)現(xiàn)一個(gè)Window接口,通過(guò)該接口window向文檔中的 JavaScript 公開全局屬性。Window即使打開新選項(xiàng)卡,后續(xù)導(dǎo)航也會(huì)在同一文檔中加載不同的文檔。因此,您使用的屬性(例如window.location文檔window.history中的屬性)將在用戶(從 Facebook)導(dǎo)航到您的頁(yè)面之前出現(xiàn)Window,因此可用于您的文檔。
這也適用于當(dāng)您直接在新的瀏覽器窗口中加載頁(yè)面時(shí) - 文檔將有權(quán)訪問(wèn)該window屬性。更多信息請(qǐng)Window參見(jiàn)window:https://developer.mozilla.org/en-US/docs/Web/API/Window
如果您擔(dān)心頁(yè)面被非標(biāo)準(zhǔn)瀏覽器加載,或者由于某種原因, window 屬性history和location屬性被覆蓋,您可以在調(diào)用它們之前檢查它們是否可用:
if (window && window.location && window.location.hash) {
// safely use window.location.hash here
}
但即便如此,客戶端的瀏覽器也會(huì)抑制該錯(cuò)誤。
document.title關(guān)于使用with的主題replaceState()
規(guī)范將其指定為字符串,因此根據(jù)設(shè)計(jì),如果未設(shè)置,它將返回空字符串。在文檔完全加載之前,Mozilla 不會(huì)發(fā)出關(guān)于使用它的警告。更多信息請(qǐng)參見(jiàn)https://developer.mozilla.org/en-US/docs/Web/API/Document/title
以下是我使用不帶標(biāo)簽的 HTML 頁(yè)面進(jìn)行的一些快速測(cè)試,看看是否確實(shí)如此<title>。
<html>
<head>
<script>
console.log("title", document.title)
window.history.replaceState({}, document.title, "newHMTL.page");
</script>
</head>
<body>
Testing
</body>
</html>
沒(méi)有預(yù)期的錯(cuò)誤或警告。
關(guān)于主題replaceState
該規(guī)范指出,大多數(shù)瀏覽器都會(huì)忽略您傳遞給的title/參數(shù):document.titlereplaceState
目前大多數(shù)瀏覽器都會(huì)忽略此參數(shù),盡管將來(lái)可能會(huì)使用它。在此處傳遞空字符串應(yīng)該可以安全地防止將來(lái)對(duì)該方法進(jìn)行更改。或者,您可以傳遞州的簡(jiǎn)短名稱。
因此,當(dāng)我準(zhǔn)備好頁(yè)面時(shí),進(jìn)行一些更快速的測(cè)試。將標(biāo)題設(shè)置為null; undefined; and a function;然后將其傳遞給replaceState不會(huì)更改歷史記錄中的標(biāo)題,也不會(huì)在有標(biāo)簽<title>或沒(méi)有標(biāo)簽時(shí)在 Chrome 中引發(fā)錯(cuò)誤。所以 6 次測(cè)試。
<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>

TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超6個(gè)贊
是的,它是安全的,因?yàn)?code>window當(dāng)瀏覽器開始解析頭部時(shí),對(duì)象就準(zhǔn)備好了。
瀏覽器創(chuàng)建窗口 > 窗口將文檔對(duì)象加載到自身 > 文檔對(duì)象渲染 DOM > 文檔對(duì)象加載其所有資源 > 窗口對(duì)象觸發(fā) onload 事件
該head
部分是 DOM api 的一部分,而Document
對(duì)象是對(duì)象的屬性window
,因此document
一旦窗口對(duì)象準(zhǔn)備好,就會(huì)加載該部分。由于它history.replaceState
是對(duì)象的一部分window
,因此在頭部執(zhí)行任何腳本部分都是安全的。
Window 接口代表一個(gè)包含 DOM 文檔的窗口;document 屬性指向該窗口中加載的 DOM 文檔??梢允褂?document.defaultView 屬性獲取給定文檔的窗口

TA貢獻(xiàn)1796條經(jīng)驗(yàn) 獲得超7個(gè)贊
阿羅哈)是的,這對(duì)您和您的客戶來(lái)說(shuō)是安全的,因?yàn)榇翱谑且粋€(gè)全局對(duì)象,每個(gè)人都可以在瀏覽器中使用它,并且任何人都可以使用它。并且您的函數(shù)可以由任何人執(zhí)行。在這種情況下,不用擔(dān)心安全問(wèn)題;)

TA貢獻(xiàn)1865條經(jīng)驗(yàn) 獲得超7個(gè)贊
它非常安全,但如果沒(méi)有監(jiān)聽器,我不會(huì)在開發(fā)中使用它DOMContentLoaded
。為了更加安全并考慮到那些使用舊版瀏覽器的人,我建議您添加該監(jiān)聽器,DOMContentLoaded
這樣window.onload
您就不會(huì)在加載速度較慢的頁(yè)面上遇到任何問(wèn)題。此外,對(duì)于window.history
API,由于它是本機(jī)函數(shù),不需要單獨(dú)的功能,因此您可以安全、立即使用它。
TL;DR
添加一個(gè)DOMContentLoaded
偵聽器以防萬(wàn)一。
添加回答
舉報(bào)