javascript 覆盖window.navigator.onLine使其始终在线

fivyi3re  于 2023-04-19  发布在  Java
关注(0)|答案(1)|浏览(93)

我有一个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

有没有什么方法可以做到这一点?

tvokkenx

tvokkenx1#

你可以用getter或writeable来修补它,我将使用getter来确保正确性,即使是像Avas这样的注入浏览器:(这是一种消极的方式,如果可能的话,修复它们而不是覆盖):

Object.defineProperty(window.navigator, 'onLine', {
  get: () => true
})

console.log('navigator.onLine = %s', navigator.onLine)

对于那些想测试这段代码但又不想关机的人,试试下面的离线离线代码

Object.defineProperty(window.navigator, 'onLine', {
  get: () => false
})

console.log('navigator.onLine = %s', navigator.onLine)

相关问题