亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么某些“ file://”提取調用被允許,而另一些則被“跨域請求阻止”?

為什么某些“ file://”提取調用被允許,而另一些則被“跨域請求阻止”?

MMTTMM 2021-03-30 17:14:44
我剛剛開始學習JavaScript,所以請多多包涵。我有兩個html頁面,例如page1.html和page2.html。兩個頁面上都有兩個按鈕,“下一頁”和“上一頁”。想法是打開序列中的下一頁或上一頁。我通過設置window.location.href新的file://URL來打開新頁面。當然,除了嘗試訪問頁面0或頁面3時,瀏覽器會顯示找不到文件。因此,我決定fetch僅在response.okis是的情況下嘗試使用和打開新頁面true。這是我處理的功能button.onclick:fetch(url).then(function(response) {    if (response.ok) {        window.location.href = url;    }    else {        alert("This is the last page.");    }});當頁面存在時,它會按預期工作(它將打開頁面)。但是,如果不這樣做,控制臺將顯示1條警告和1條錯誤(并且根本不會更改頁面,也不會觸發alert二者之一):Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at file:///path/to/page3.html. (Reason: CORS request not http).TypeError: NetworkError when attempting to fetch resource.我四處搜索,發現出于安全原因阻止了非http請求(不允許網頁隨心所欲地訪問本地文件)。令我感到困惑的是,即使文件存在(第1頁或第2頁),它仍然是非HTTP請求,但仍然有效。為什么僅在文件不存在時才阻止它?為什么我要NetworkError和它在一起?
查看完整描述

1 回答

?
慕絲7291255

TA貢獻1859條經驗 獲得超6個贊

fetch(在瀏覽器中,無論如何)有這樣一段話約file:網址:

目前,不幸的是,文件URL留給讀者練習。

如有疑問,請返回網絡錯誤。

通常,URLfetch不會成功file:??杀氖牵坪踉贔irefox上,如果要提取的文件存在,則可以成功,但是如果不存在,則將引發網絡錯誤。(我想這是有道理的,它不可以返回HTTP狀態代碼;它不使用HTTP。)在Chrome和Edge上,無論文件是否存在,它始終會失敗。在某些瀏覽器(例如Chrome)中,舊版本XMLHttpRequest也沒有(但是在其他瀏覽器(例如Firefox)中)。

fetch/XMLHttpRequesthref頁面的設置之間的主要區別在于,在前一種情況下,頁面A上的代碼能夠讀取頁面B的內容;但在后一種情況下,它不能-可以轉到頁面B,但不能讀取頁面B的內容。頁面A替換為頁面B。

如果XMLHttpRequest在我們現在居住的安全環境中進行標準化,我懷疑它也將明確禁止訪問file:URL。


由于Firefox將不存在的文件視為NetworkError,因此您的代碼(僅適用于Firefox)可能是:

// With file: URLs, this ONLY works in Firefox

fetch(url)

.then(function(response) {

    if (!response.ok) {

        throw new Error("HTTP status " + response.status);

    }

})

.then(function() {

    window.location.href = url;

})

.catch(error => {

    alert("This is the last page.");

});

也許:


fetch(url)

.then(function(response) {

    return response.ok;

})

.catch(function() {

    return false;

})

.then(function(flag) {

    if (flag) {

        window.location.href = url;

    } else {

        alert("This is the last page.");

    }

});

您可以在那里使用箭頭功能。我不是因為你沒有,而是:


fetch(url)

.then(response => response.ok)

.catch(() => false)

.then(flag => {

    if (flag) {

        window.location.href = url;

    } else {

        alert("This is the last page.");

    }

});


查看完整回答
反對 回復 2021-04-08
  • 1 回答
  • 0 關注
  • 196 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號