为啥内联 JavaScript 在引用 JavaScript 错误时起作用 [重复]

Posted

技术标签:

【中文标题】为啥内联 JavaScript 在引用 JavaScript 错误时起作用 [重复]【英文标题】:Why does inline JavaScript work while referenced JavaScript errors [duplicate]为什么内联 JavaScript 在引用 JavaScript 错误时起作用 [重复] 【发布时间】:2021-04-02 14:18:10 【问题描述】:

我有两个相同的 html 页面版本,除了一个包含 javascript,另一个从文件中读取完全相同的 JavaScript。包含的版本有效,引用的版本失败。

两个版本都可以正常工作,该错误似乎与我添加代码以从样式表中获取可用动画列表有关。包含关键帧动画的 CSS 文件同样被包含或引用,对应于 JavaScript 是否存在。

另请注意,我正在使用 file:/// 而不是 https:// 进行测试。

引用的版本片段失败

...
<link rel="stylesheet" href="css/lib/normalise.css">
<link rel="stylesheet" href="css/style.css">
<link rel="stylesheet" href="css/anim.css">
<link rel="stylesheet" href="css/lib/animate.min.css">
...
<script type="text/javascript" src="js/script.js"></script>
</body>
</html>

包含的版本片段作品

...
<style>
... inline CSS rules including keyframes
</style>
...
<script type="text/javascript">
console.log('>>> BEGIN READING');

// ... code here ommitted, it works

function getAnimationList()
// Return a list of all of the animation keyframe names in all style sheets.
    var ss = document.styleSheets;
    var anims = [];
    // loop through all the style sheets
    for (var s = 0; s < ss.length; s++) 
        if (ss[s].cssRules)                  <<<**LINE 32**: ERROR OCCURS IN REFERENCED VERSION
            // loop through all the rules
            for (var r = ss[s].cssRules.length - 1; r >= 0; r--) 
                var rule = ss[s].cssRules[r];
                if ((rule.type === window.Cs-s-rule.KEYFRAMES_RULE || rule.type === 
                          window.Cs-s-rule.WEBKIT_KEYFRAMES_RULE)) 
                    anims.push(rule);
                
            
        
    
    return anims;
;

animList = getAnimationList();
if (animList.length == 0)
    console.log('>>> No Animations');
 else 
    console.log('>>> Number of animations is ' + animList.length);
;
    
// ... more code follows, ommitted for brevity
    
</body>
</html>

错误信息因使用的浏览器而异,如下所示。

Firefox 错误

Uncaught DOMException: CSSStyleSheet.cssRules getter: Not allowed to access cross-origin stylesheet script.js:32
    getAnimationList file:///C:/Users/mark/OneDrive/dev/babyclix/web/js/script.js:32
    <anonymous> file:///C:/Users/mark/OneDrive/dev/babyclix/web/js/script.js:45

边缘错误

Uncaught DOMException: Failed to read the 'cssRules' property from 'CSSStyleSheet': Cannot access rules
    at getAnimationList (file:///C:/Users/mark/OneDrive/dev/babyclix/web/js/script.js:32:19)
    at file:///C:/Users/mark/OneDrive/dev/babyclix/web/js/script.js:45:12

Chrome 错误

Uncaught DOMException: Failed to read the 'cssRules' property from 'CSSStyleSheet': Cannot access rules
    at getAnimationList (file:///C:/Users/mark/OneDrive/dev/babyclix/web/js/script.js:32:19)
    at file:///C:/Users/mark/OneDrive/dev/babyclix/web/js/script.js:45:12

谁能明白为什么 Cs-s-rules 语句会抛出错误。 Firefox 认为是跨域的,但所有内容都来自同一个文件夹。是否包含或引用 JavaScript 应该没有区别!

【问题讨论】:

可能重复:***.com/questions/48753691/… 简而言之,file:// 无法做到这一点。请改用本地开发服务器。 @lastr2d2 谢谢你解决了我的问题。现在使用 Apache 进行测试,它可以工作。 【参考方案1】:

我遇到了类似的问题,但这与 CSS 无关,但我认为这可能会帮助您解决问题。

首先,我注意到您的工作目录位于 OneDrive 目录中,这会在尝试加载文件时导致一些阻塞。不久前我遇到了这个问题,我通过将项目移出 OneDrive 目录来解决它。

尝试将您的项目目录移出 OneDrive 并检查错误是否仍然存在?

【讨论】:

谢谢,您的解决方案可能有效,我没有尝试过,但我遵循了@lastr2d2 的建议,并且确实有效。问候

以上是关于为啥内联 JavaScript 在引用 JavaScript 错误时起作用 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

Android - 为啥人们反复引用静态上下文内联,而不是在 Method() 中传递一次?

为啥这个javascript代码给出错误[重复]

我的 Javascript 文件自动使用另一个,为啥?

为啥我的 javascript 一直引用相同的 innerHTML?

JavaScript引用

概念简介Javas cript简介