成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

用了這個瀏覽器功能,前端頁面直接崩潰了,咋搞啊?

系統(tǒng) 瀏覽器
你是否遇到過這樣的場景:在瀏覽器中使用谷歌翻譯功能后,網(wǎng)頁突然崩了,控制臺錯誤:這一切的罪魁禍首,其實是谷歌翻譯悄悄修改了你的頁面結(jié)構(gòu)!下面就來簡單解釋原因和解決方案。

你是否遇到過這樣的場景:在瀏覽器中使用谷歌翻譯功能后,網(wǎng)頁突然崩了,控制臺錯誤:

圖片

這一切的罪魁禍首,其實是谷歌翻譯悄悄修改了你的頁面結(jié)構(gòu)!下面就來簡單解釋原因和解決方案。

谷歌翻譯如何“搞破壞”?

我們先看看谷歌翻譯是如何工作的。

下面是未翻譯的文字的 HTML 結(jié)構(gòu):

圖片

翻譯之后文字的 HTML 結(jié)構(gòu)是這樣的:

圖片

翻譯引擎將純文本節(jié)點包裹在<font>標簽中,這種看似無害的操作,卻為現(xiàn)代前端框架埋下了定時炸彈。

兩大致命場景

場景1:狀態(tài)更新失效

對于像React這樣的現(xiàn)代前端框架,它們依賴虛擬DOM來提高性能。當組件的狀態(tài)或?qū)傩园l(fā)生變化時,React會基于虛擬DOM的狀態(tài)來操作真實DOM。然而,當真實DOM被谷歌翻譯修改后,原節(jié)點的位置和狀態(tài)與React的預期不一致,導致更新操作無法執(zhí)行,頁面因此無法正確更新。

例如,在以下計數(shù)器組件中:

import React, { useState } from"react";

const Counter = () => {
const [count, setCount] = useState(0);

const increment = () => {
    setCount(count + 1);
  };

const decrement = () => {
    setCount(count - 1);
  };

return (
    <div>
      <h1>example</h1>
      <p>count:{count}</p>
      <p>{count}</p>
      <button onClick={increment}>+1</button>
      <button onClick={decrement}>-1</button>
    </div>
  );
};

exportdefault Counter;

在這段代碼中,兩種顯示方式在操作時的結(jié)果完全不同:

可以看到,使用<p>count:{count}</p>顯示時,當頁面使用翻譯功能后,點擊按鈕將不會再更新,而<p>{count}</p>在使用谷歌翻譯前后都是正常更新。

  • 對于第一種情況:谷歌翻譯將原始文本拆分為多個嵌套的 <font> 節(jié)點,破壞了 React 原本控制的文本結(jié)構(gòu)。當 count 更新時,React 嘗試直接修改原始文本節(jié)點的內(nèi)容,但此時該節(jié)點已被替換為 <font> 節(jié)點,導致更新失效。
  • 對于第二種情況:即使谷歌翻譯包裹了 <font> 標簽,但 整個 <p> 的唯一子節(jié)點仍然是動態(tài)值 {count} 對應的 <font>。React 在更新時可以通過對比虛擬 DOM 發(fā)現(xiàn) <font> 內(nèi)部的文本變化,從而正確更新內(nèi)容。

場景2:應用崩潰

谷歌翻譯的干擾還可能導致應用崩潰。當應用試圖從DOM中移除一個已被谷歌翻譯修改的文本節(jié)點時,會拋出一個NotFoundError錯誤。這是因為當應用試圖從 DOM 中移除一個條件渲染的文本節(jié)點時,這個節(jié)點已被谷歌翻譯卸載。

下面來看一個例子:

import React, { useState } from "react";

const ToggleText = () => {
  const [showText, setShowText] = useState(true);

  return (
    <div>
      <button onClick={() => setShowText(!showText)}>切換文本</button>
      {showText && "Hello, World!"}
    </div>
  );
};

export default ToggleText;

翻譯后的文本被<font>標簽包裹后,不再是父元素的直接子節(jié)點。當狀態(tài)切換觸發(fā)DOM卸載時,React會因找不到原始節(jié)點而拋出NotFoundError,最終導致組件樹崩潰。

如何解決?

盡管這個問題在 React 社區(qū)中早已被提出,但官方至今都沒有提供完美的解決方案。Dan 給出了一個方法來修復,但是會犧牲一定的性能,需要開發(fā)者根據(jù)實際情況來權(quán)衡是否有必要添加這段代碼,并且這段代碼也并沒有解決本質(zhì)問題。

https://github.com/facebook/react/issues/11538

圖片圖片

其實,對于上面提到的例子,只需要添加標簽來分離文本和動態(tài)內(nèi)容,這樣 React 就不會直接刪除和插入文本節(jié)點,就可以避免這個問題。但這只是其中一種情況,我們很難避開所有導致應用崩潰的情況。

有以下解決方案可供參考:

  • 阻止部分翻譯 :可以通過給需要保持原樣的部分添加 notranslate 屬性來防止谷歌翻譯對其進行操作。
<p translate="no"></p>
  • 完全禁用翻譯 :如果希望整個頁面都不被谷歌翻譯,可以在 HTML 頭部加入以下meta標簽:
<meta name="google" cnotallow="notranslate">
  • 使用 Error Boundary 隔離錯誤: 對每個組件使用 Error Boundary,防止錯誤擴散到整個應用,導致應用崩潰。
<ErrorBoundary>
  <ToggleText />
</ErrorBoundary>
  • 必要時進行國際化:如果應用需要支持多種語言,可以考慮實現(xiàn)應用的多語言支持,而不是依賴谷歌翻譯。這樣可以更好地控制文本的顯示和更新,告別第三方翻譯插件的 DOM 污染。
責任編輯:武曉燕 來源: 前端充電寶
相關推薦

2021-08-28 06:15:49

瀏覽器手機瀏覽器夸克

2020-12-17 11:08:20

Safari手機瀏覽器蘋果

2023-03-01 14:08:10

2021-10-11 10:22:43

AndroidChrome瀏覽器

2011-05-06 09:36:16

動態(tài)頁面

2021-06-01 09:12:47

前端瀏覽器緩存

2021-05-17 14:15:16

Edge瀏覽器Android翻譯功能

2021-09-05 15:55:05

WebP圖片格式瀏覽器

2021-05-26 05:44:39

Google瀏覽器崩潰Chrome

2023-10-30 23:14:57

瀏覽器URL網(wǎng)頁

2025-06-09 07:10:00

JavaScriptAPI開發(fā)

2012-02-01 13:42:19

2018-01-19 14:39:53

瀏覽器頁面優(yōu)化

2021-01-19 16:02:16

Edge瀏覽器Chrome谷歌

2023-12-19 22:48:22

2012-09-06 10:05:03

Windows 8瀏覽器

2011-08-05 10:17:02

Chrome瀏覽器

2011-02-23 10:57:27

Konqueror

2011-09-15 16:33:25

2021-09-11 15:31:31

MozillaFirefoxTab Unloadi
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 自拍偷拍亚洲欧美 | 粉嫩一区二区三区性色av | 国产日韩久久久久69影院 | 色综合av | yeyeav| 国产成人精品网站 | 人人爽人人爽 | 国产99久久精品一区二区永久免费 | 日韩区| 北条麻妃一区二区三区在线视频 | 日韩一区二区三区在线播放 | 亚洲精品国产综合区久久久久久久 | 碰碰视频| 久久99深爱久久99精品 | 国产精品日日做人人爱 | 亚洲精品一区二区三区 | 日日骚网 | 91精品国产综合久久小仙女图片 | 99精品电影 | 激情在线视频网站 | 天天操夜夜操 | 精品网 | 午夜ww| 91免费在线视频 | 亚洲成人中文字幕 | 夜夜爽99久久国产综合精品女不卡 | 国产视频2021 | a爱视频| 国产农村妇女毛片精品久久麻豆 | 国产亚洲一区二区三区 | 精品久久久久久亚洲综合网 | 午夜视频精品 | 欧美精品一区久久 | 一区二区三区网站 | 亚洲永久免费观看 | 日日日色| 老牛影视av一区二区在线观看 | 国产精品免费观看视频 | 在线中文字幕亚洲 | 久久久久亚洲精品 | 鸳鸯谱在线观看高清 |