我有一个JavaScript Web应用程序,它有许多依赖项,其中一些依赖项会根据window.navigator.onLine
更改其行为。例如,一些依赖项会禁用文件传输或重试逻辑。
如onLine
文档中所述,
在Chrome和Safari浏览器中,如果浏览器无法连接到局域网(LAN)或路由器,则它处于离线状态。
但是,我的应用程序需要工作,即使没有连接网络接口。
另一个激励性的例子是为什么要覆盖onLine
:
MDN指出了window.navigator.onLine
没有给予想要的信息的进一步情况(这里是误报):
您可能会得到误报,例如在计算机运行的虚拟化软件具有始终“连接”的虚拟以太网适配器的情况下。
由于这些原因,并且不必修补我的应用使用的所有依赖库,我希望覆盖window.navigator.onLine
,以便它始终返回true
。
但是,它似乎是一个readonly
属性。
我已经试过使用Proxy
,如下所示:
if (window.navigator) {
// `as any` to ignore `readonly` property
(window.navigator as any) = new Proxy(window.navigator, {
// See https://javascript.info/proxy
get(target, prop, ...rest) {
if (prop === "onLine") {
return true;
}
return Reflect.get(target, prop, ...rest);
},
});
}
但是在window.navigator = ...
的赋值上,我在例如Chrome 111中得到错误:
Cannot set property navigator of #<Window> which has only a getter
有没有什么方法可以做到这一点?
1条答案
按热度按时间tvokkenx1#
你可以用
getter
或writeable来修补它,我将使用getter来确保正确性,即使是像Avas
这样的注入浏览器:(这是一种消极的方式,如果可能的话,修复它们而不是覆盖):对于那些想测试这段代码但又不想关机的人,试试下面的离线离线代码