在 Firefox 中,當執行 NoScript 或 uBlock Origin 時,為什麼此頁面會以這種方式呈現(noscript 標記的內容被忽略)?

在 Firefox 中,當執行 NoScript 或 uBlock Origin 時,為什麼此頁面會以這種方式呈現(noscript 標記的內容被忽略)?

我有一個頁面

http://www.zen76171.zen.co.uk/aaa2.html

使用這個 HTML

<!doctype html>
<html>
<head>
<noscript>aaa</noscript>
<script>document.write("bbb")</script>
</head>
<body>
ccc
</body>
</html>

我知道如果瀏覽器沒有運行 javascript,則 noscript 標記的內容應該會運行。

在 Chrome 或 Firefox 中,沒有擴充功能阻止任何內容,我得到 bbb ccc 的輸出。很好,很有道理。 'bbb' 顯示是因為允許使用 javascript,而 ccc 顯示是因為它將顯示 javascript 是否啟用。

然後我嘗試在 Firefox 中安裝 NoScript https://addons.mozilla.org/en-GB/firefox/addon/noscript/

現在,當我重新加載我提到的頁面時http://www.zen76171.zen.co.uk/aaa2.html

表明ccc。這對我來說表明腳本被阻止,所以這部分很好。

但我期望的輸出是aaa ccc,因為我期望在腳本被禁用時顯示“aaa”,並且腳本已停用。

我還解決了一個次要問題,如果我從 Firefox 中停用甚至「刪除」NoScript,那麼我仍然會得到與「ccc」相同的回應,我必須卸載並重新安裝 Firefox 才能刪除 NoScript。但現在當我想刪除 NoScript 時就可以了。

這個問題是:為什麼它只顯示“ccc”而不顯示“aaa ccc”?

添加

實際上我只得到“uBlock Origin”顯示的“ccc”。如果我安裝“uBlock Origin”,並選擇保持原樣而不禁用腳本,那麼我會得到“bbb ccc”(很好)。而如果我單擊以禁用頁面上的腳本,則會收到“ccc”。未顯示“aaa”。

答案1

noscript 標籤使用不當,而瀏覽器擴充功能正常運作。除此之外,頁面結果可能會被緩存,因此可能需要硬刷新(使用覆蓋緩存重新加載)。

使用不當

但我期望的輸出是“aaa ccc”,因為我期望“aaa”在腳本停用時顯示,並且腳本已停用。

不,預期的輸出「aaa」不會顯示,因為 noscript 標籤使用不當。

W3schools 上的 HTML noscript 標記提供了一個簡潔的用法解釋:

定義和用法[...]

<noscript> 元素可以在 <head> 和 <body> 中使用。

在 <head> 元素內部使用時: <noscript> 必須只包含 <link>、<style> 和 <meta> 元素。

HTML 4.01 與 HTML5 之間的差異

在 HTML 4.01 中,<noscript> 標籤只能在 <body> 元素內使用。

在 HTML5 中,<noscript> 標籤可以在 <head> 和 <body> 內部使用。

換句話說,OP使用的noscript標籤是基於HTML5是有效的,但並不遵循HTML 標準。 HTML head 元素中的 noscript 標籤不應該包含任何「自由文本」。

頁面結果

我還解決了一個次要問題,如果我從 Firefox 中停用甚至「刪除」NoScript,那麼我仍然會得到與「ccc」相同的回應 [...]

大多數瀏覽器(包括 Firefox)預設使用緩存,因此可能需要硬刷新。這可以隨時輕鬆重現,除非使用者以不同方式配置快取行為。

差異1:硬刷新是透過鍵盤快速鍵執行的,對於 Firefox,鍵盤快速鍵可以是Ctrl+F5Ctrl++ 。如果是瀏覽器擴展,快取效果可能會持續到瀏覽器再次重新啟動為止(使用者體驗可能會有所不同)。ShiftR

如果我安裝“uBlock Origin”,並選擇保持原樣而不禁用腳本,那麼我會得到“bbb ccc”(很好)。而如果我單擊以禁用頁面上的腳本,則會收到“ccc”。未顯示“aaa”。

包含「aaa」的 noscript 標記可能會被擴充忽略或省略,因為「aaa」的用法不遵循 HTML 標準。 HTML head 元素中的 noscript 標記必須只包含上述三個元素。

差異2:在 Firefox 中本地查看 HTML 文件時,即使啟用了 uBlock Origin 並選中了擴展選項“禁用 JavaScript”,頁面結果也將是“bbb ccc”。這可能是由於 Firefox Quantum 中的擴充權限有限。換句話說,瀏覽器擴充功能無法阻止透過以下方式顯示的本機 HTML 頁面的腳本:文件 URI 方案(不是透過網頁伺服器運行的本機主機,這是另一回事)。

再試一次

考慮修改後的 HTML 內容如下:

<!doctype html>
<html>
<head>
<noscript>aaa<style>#this {color:#cccccc;}</style></noscript>
<script>document.write("bbb")</script>
</head>
<body>
<noscript>nnn</noscript>
<span id="this">ccc</span>
</body>
</html>

然後使用 uBlock Origin 在 Firefox 中載入 HTML,並取消選取(關閉)或選取(開啟)其選項「停用 JavaScript」。

  • 如果“禁用 JavaScript”關閉,則結果將為“bbb ccc”
  • 如果“停用 JavaScript”為 ON,則結果將為“nnn ccc”,其中“nnn”從 HTML body 元素中的 noscript 標記顯示,“ccc”從 HTML head 元素中的 noscript 標記繼承顏色
  • 在這兩種情況下,如前所述,「aaa」永遠不會出現(不遵循標準)

差異3:只有當瀏覽器本身停用 JavaScript 時,「aaa」才會可見(Firefox 隱藏配置,about:config -「javascript.enabled」設定為「false」)。或者,使用任何純文字瀏覽器來查看類似的結果。這與瀏覽器擴充功能提供的選項不同,Firefox Quantum 限制了瀏覽器擴充功能提供的選項按設計

長話短說在 HTML body 元素中使用 noscript 標記,以便在停用腳本時使文字可見。瀏覽器擴充功能可以根據 HTML 標準正常運作,但受到設計的限制。

相關內容