无法访问样式表 CORS 的 cssRules

Cannot Access cssRules for Stylesheet CORS

所以我一直在读到您无法访问 css 外部样式表的规则,因为它遇到了 CORS 策略问题。

我决定采取不同的方法,但我仍然 运行 遇到问题。

我的方法:

  1. 在后台下载css个文件并上传到S3 Bucket
  2. Return 支持现有的 link 和新的 link 用于匹配目的
  3. 删除现有的 link 标签并添加一个指向我的 CDN 的新标签
  4. 访问document.styleSheets
  5. Tadaaaa(但这失败了)

我想弄清楚的是,如果我的 CDN 允许从任何来源访问,为什么我仍然 运行 遇到问题?

export default () => {
  const payload = [...document.styleSheets].filter(s => s.href).map(s => s.href);

  axios.post('SOME ENDPOINT', { css: payload }).then(({ status, data: { data: newLinks } }) => {
    if (status === 200) {
      for (const i in newLinks) {
        document.querySelector(`link[href="${newLinks[i].source}"]`).remove()
        const stylesheet = document.createElement('link');
        stylesheet.rel = 'stylesheet';
        stylesheet.href = newLinks[i].downloaded;
        document.getElementsByTagName('head')[0].appendChild(stylesheet);
      }
    }
  }).then(() => {
    let delay = 250
    setTimeout(() => {
      console.log('Stylesheets with Removed Links', [...document.styleSheets]);
    }, delay)
  }).then(() => {
    console.log([...document.styleSheets])
  })
}

Safari 上的错误SecurityError: Not allowed to access cross-origin stylesheet

我看过这个link

网络选项卡的结果

我最终找到了解决方案...

在此感谢 Paulo Belo link

stylesheet.crossOrigin = "anonymous" 解决了我的问题,让我可以访问 cssRules。

https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/crossorigin

请注意,此修复不适用于引发此错误的现有样式表。

Exception: DOMException: Failed to read the 'cssRules' property from 'CSSStyleSheet': Cannot access rules at CSSStyleSheet.s

此修复仅适用于您自己上传的工作表,或者在我的情况下是来自我的 CDN 的工作表。