You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

符合CSP且无需内联事件脚本的CSS异步加载方案求助,需不升高TBT

失效根因

你写的代码随机失效的核心原因是:如果目标CSS文件加载速度极快(比如缓存命中、文件体积极小),会在JS绑定load事件之前就完成加载,此时load事件已经触发过,绑定的回调永远不会执行,就会出现CSS没有切换media为all的情况。

可靠解决方案

把内联script直接放在所有待异步加载的.AOcssLoad的link标签之后,不需要等待任何DOM就绪事件,代码如下:

<!-- 异步加载的CSS定义 -->
<link rel="stylesheet" media="print" class="AOcssLoad" href="xxx.css">
<link rel="stylesheet" media="print" class="AOcssLoad" href="yyy.css">

<!-- 紧接在CSS后面放这段JS,不要放到页头或者等DOM事件触发 -->
<script nonce="你的合法nonce值" type="text/javascript" data-exclude="true">
(function() {
  const cssLinks = document.querySelectorAll('.AOcssLoad');
  cssLinks.forEach(link => {
    link.classList.add('Loading');
    const onLoadComplete = () => {
      link.media = 'all';
      link.removeEventListener('load', onLoadComplete);
      link.removeEventListener('error', onLoadComplete);
      link.classList.replace('Loading', 'OnLoad');
    };
    // 已经加载完成的直接执行回调,未完成的绑定事件监听
    if (link.sheet || (link.readyState && link.readyState === 'complete')) {
      onLoadComplete();
    } else {
      link.addEventListener('load', onLoadComplete);
      link.addEventListener('error', onLoadComplete);
    }
  });
})();
</script>

方案优势

  1. 100%可靠:新增了已加载状态判断,不会出现事件绑定晚于加载完成导致的失效问题
  2. 无TBT升高:代码为极小的同步执行片段,无等待、无递归、无额外重排重绘触发,主线程耗时低于1ms,不会造成阻塞
  3. 符合CSP要求:没有使用任何内联事件,仅用带合法nonce的内联脚本即可通过CSP校验

内容的提问来源于stack exchange,提问作者Aditya Agarwal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 16:27:03