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

无法在DOMContentLoaded外部获取CSS属性值并用于导出函数的问题

解决DOMContentLoaded赋值外部变量后无法在导出函数中访问的问题

问题本质是DOMContentLoaded是异步触发的:你的代码执行顺序是先声明transitionDuration,添加监听,然后立即执行外部的console.log(此时监听还没触发,变量仍为undefined);只有当DOM完全加载后,监听回调才会执行并给变量赋值。如果expandScreen在DOM加载完成前被调用,同样会拿到未赋值的变量。

下面是两种可行的解决方案,无需将expandScreen放在监听内部:

方案一:用Promise封装加载逻辑

通过Promise确保expandScreen执行时已拿到正确的transitionDuration值:

const sceneContainer = document.getElementById('scene-container');
const canvas = document.getElementById("three-canvas");

let transitionDuration;
let isExpanded = false;

// 创建Promise等待DOM加载完成并获取过渡时长
const transitionDurationPromise = new Promise((resolve) => {
  // 若DOM已加载完成,直接获取值
  if (document.readyState === 'complete' || document.readyState === 'interactive') {
    transitionDuration = window.getComputedStyle(sceneContainer).getPropertyValue("transition-duration");
    resolve(transitionDuration);
  } else {
    document.addEventListener('DOMContentLoaded', () => {
      transitionDuration = window.getComputedStyle(sceneContainer).getPropertyValue("transition-duration");
      console.log("Inside DOMContentLoaded:", transitionDuration);
      resolve(transitionDuration);
    });
  }
});

export async function expandScreen() {
  // 等待获取到有效时长后再执行逻辑
  const duration = await transitionDurationPromise;
  
  // 这里可以正常使用duration值,示例:
  console.log('过渡时长:', duration);
  // 你的业务逻辑...
}

方案二:使用Getter函数延迟获取

每次需要时长时通过函数获取,确保值已加载:

const sceneContainer = document.getElementById('scene-container');
const canvas = document.getElementById("three-canvas");

let _transitionDuration;
let isExpanded = false;

function getTransitionDuration() {
  // 如果已缓存值,直接返回
  if (_transitionDuration) {
    return Promise.resolve(_transitionDuration);
  }
  
  return new Promise((resolve) => {
    if (document.readyState === 'complete' || document.readyState === 'interactive') {
      _transitionDuration = window.getComputedStyle(sceneContainer).getPropertyValue("transition-duration");
      resolve(_transitionDuration);
    } else {
      document.addEventListener('DOMContentLoaded', () => {
        _transitionDuration = window.getComputedStyle(sceneContainer).getPropertyValue("transition-duration");
        console.log("Inside DOMContentLoaded:", _transitionDuration);
        resolve(_transitionDuration);
      });
    }
  });
}

export async function expandScreen() {
  const duration = await getTransitionDuration();
  // 用duration执行你的逻辑
}

补充说明

如果你的脚本是放在HTML的<body>底部(DOM元素之后),也可以直接省略DOMContentLoaded监听,因为此时脚本执行时DOM已加载完成,能直接获取到正确的transition-duration值。但异步方案更通用,适配脚本放在任意位置的情况。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 10:44:51