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

在线考试系统JavaScript计时器异常:显示00:function array(){[native code]}:59

在线考试系统倒计时计时器故障排查与修复

看起来你遇到了一个典型的变量未初始化+逻辑不严谨导致的计时器显示异常问题,出现00:function array(){[native code]}:59这种奇怪内容的核心原因,是代码里没有正确初始化倒计时核心变量,还有一些语法和逻辑细节需要调整,我来帮你一步步解决:

问题根源分析

  • 变量未声明初始化:你代码里的hour、min、sec三个核心变量完全没有定义和赋值——当你想要显示2分钟倒计时时,至少要把min设为2,hour和sec设为0。因为变量未声明,JS会把它们当成隐式全局变量,很可能和页面里其他同名变量(比如某个库的min数组方法)冲突,这就是你看到function array(){[native code]}的原因。
  • 语法与逻辑不严谨:
    • 用-01这种写法不规范,JS虽然能解析,但应该直接写-1;
    • 当sec被转成字符串(比如"09")后,再执行sec--会导致类型混乱;
    • setTimeout传入字符串调用函数的方式不安全,容易引发上下文问题;
    • 多余的hour = hour;、min = min;代码完全没必要。

修复后的完整代码

//***********************************************//
//* Online Examination System *//
//*---------------------------------------------*//
//* *//
//* Author: chandra sai & omkar *//
//* Title: Count Down Timer *//
//***********************************************//

// 初始化倒计时变量:设置为2分钟(0小时,2分钟,0秒)
let hour = 0;
let min = 2;
let sec = 0;
let timerId; // 保存计时器ID,方便清除

function countDown() {
    sec--;

    // 处理秒数归零的逻辑
    if (sec < 0) {
        sec = 59;
        min--;

        // 处理分钟数归零的逻辑
        if (min < 0) {
            min = 59;
            hour--;
        }
    }

    // 格式化显示:数值转字符串,小于10补0
    const formattedHour = hour <= 9 ? `0${hour}` : hour;
    const formattedMin = min <= 9 ? `0${min}` : min;
    const formattedSec = sec <= 9 ? `0${sec}` : sec;

    const time = `${formattedHour} : ${formattedMin} : ${formattedSec}`;
    
    // 更新页面显示
    if (document.getElementById('timer')) {
        document.getElementById('timer').innerHTML = time;
    }

    // 检查是否倒计时结束
    if (hour === 0 && min === 0 && sec === 0) {
        window.clearTimeout(timerId);
        window.location = document.forms[0].action + "?fs=yes";
        return; // 结束函数,避免继续设置计时器
    }

    // 继续设置下一秒的计时器
    timerId = window.setTimeout(countDown, 1000);
}

function addLoadEvent(func) {
    var oldonload = window.onload;
    if (typeof window.onload != 'function') {
        window.onload = func;
    } else {
        window.onload = function() {
            if (oldonload) {
                oldonload();
            }
            func();
        }
    }
}

addLoadEvent(function() {
    countDown();
});

关键修改点说明

  • 显式初始化变量:在函数外声明并设置hour=0, min=2, sec=0,确保变量是我们需要的数值类型,避免和全局环境冲突;
  • 优化倒计时逻辑:用sec < 0、min < 0代替== -01,逻辑更严谨;
  • 分离数值操作与格式化:保持hour、min、sec始终为数值类型,只在显示时格式化字符串,避免类型混乱;
  • 安全的计时器调用:setTimeout直接传入函数countDown,而不是字符串,避免上下文解析问题;
  • 提前结束函数:倒计时结束后立即return,避免不必要的计时器设置。

这样修改后,你的计时器应该就能正常显示00 : 02 : 00并开始倒计时了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:47:11