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

调用setAttendancePromptTimeLimit获取视频时长返回NaN问题咨询

问题原因

你遇到的NaN是视频元数据加载时机不同步导致的,具体逻辑差异如下:

  • showVideoDuration()里的打印逻辑是绑定在loadedmetadata事件回调中执行的,这个事件会在浏览器加载完视频的时长、分辨率等核心元数据后才触发,此时HTMLMediaElement.duration属性已经被赋值为有效数值,所以能正常输出16.1的结果。
  • setAttendancePromptTimeLimit()是在init()方法里同步执行的,此时视频元数据还未加载完成,根据Web API规范,元数据加载完成前duration属性的默认值就是NaN,所以打印结果为非数字。

修复方案

你可以任选以下两种方案修复:

  1. 把setAttendancePromptTimeLimit()的执行逻辑也绑定到loadedmetadata事件,等元数据加载完成后再调用:
// 修改showVideoDuration方法,元数据加载完成后再执行考勤逻辑
showVideoDuration = function(cb){
  const handleMetaLoaded = () => {
    console.log(this.getPlayerDuration())
    // 新增调用,保证此时duration有值
    this.setAttendancePromptTimeLimit()
  }
  arguments.length ? cb : this.addListener(this.vidPlayer, 'loadedmetadata', handleMetaLoaded)
}

init = () => {
  this.showVideoDuration()  
}
  1. 在setAttendancePromptTimeLimit()里先做有效性判断,避免拿到无效值:
setAttendancePromptTimeLimit = cb => {
  const duration = this.getPlayerDuration()
  if (!isNaN(duration)) {
    // 正常执行业务逻辑
    console.log(duration)
  } else {
    // 未加载完成则绑定事件监听,延迟执行
    this.addListener(this.vidPlayer, 'loadedmetadata', () => {
      console.log(this.getPlayerDuration())
    })
  }
}

额外提示:你的类名videoPlyer拼写存在笔误,少了字母a,正确拼写应为videoPlayer,不影响当前问题运行,但建议修正避免后续维护问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 18:54:03