DOM异常:无法从"窗口"读取"localStorage"属性:在Chrome隐身模式下并在Iframe中运行

gudnpqoy  于 2023-02-06  发布在  Go
关注(0)|答案(2)|浏览(254)

任何人都可以请帮助我在这个问题上,因为我得到这个相同的错误消息,我的网站上,当我运行它在一个单独的域的iframe内隐身模式只?你可以访问网站从here.

  • 非隐姓埋名模式没有问题。
  • 在没有iframe的情况下运行单个站点没有问题
  • 对于那些不使用localStorage的网站,即使在iframe内部运行或不使用iframe也没有问题

控制台出错-
"DOM异常:无法从"窗口"读取"localStorage"属性:拒绝访问此文档"
谢谢

gzjq41n4

gzjq41n41#

更新日期:2020年4月8日

阻止第三方Cookie

允许第三方cookie

从上面的屏幕截图中,您可以看到来自

https://www.googletagmanager.com
https://cstatic.weborama.fr
https://www.google.com

删除了页面显示与这些网站的cookie之间的直接依赖关系。

按照以下步骤在Chrome设置中取消选中block third-party cookies
在“内容设置”中设置“阻止第三方Cookie和网站数据”复选框时,将引发此异常。
要查找设置,请打开Chrome设置,在搜索框中键入"third",在“常规设置”中选中**Allow all cookies**。

px9o7tmv

px9o7tmv2#

我遇到了这个问题,并确定这是因为我们的应用的依赖关系在尝试访问本地存储时抛出了一个错误。当应用在incognito中的iframe中运行时,访问本地存储会抛出一个错误。如果依赖关系没有通过try / catch处理对本地存储的调用,则会导致应用崩溃。
相同的行为可以在Brave浏览器中重现,通过禁用cookie/本地存储。
一个好的解决方案是在抛出错误的库中归档bug(应该像在try / catch中 Package 引用并忽略错误一样简单)。
我们还通过为本地存储对象添加proxy来修复此问题,该对象将执行相同的操作。

<script>
  let storageOrUndefined;

  try {
    storageOrUndefined = window.localStorage;
  } catch (e) {
    storageOrUndefined = undefined;
  }

  const isIframe = window !== window.top;
 
  if (isIframe) {
      const lsProxy = new Proxy(
      {},
      {
        get: (_, prop, __) => (argument) => {
          if (!storageOrUndefined) {
            return null;
          }

          try {
            return storageOrUndefined[prop](argument);
          } catch (e) {
            return null;
          }
        },
      }
    );

    Object.defineProperty(window, "localStorage", {
      value: lsProxy,
      configurable: true,
      enumerable: true,
      writable: false,
    });
  }
</script>

相关问题