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

Oracle APEX倒计时仅在活跃浏览器标签页运行,求独立运行方案

解决Oracle APEX倒计时器不受浏览器标签页活跃状态影响的方案

问题根源:浏览器对后台非活跃标签页的setTimeout/setInterval执行频率会做节流限制,导致你的倒计时逻辑在切到其他标签时暂停,切回才恢复。要让计时器独立运行,核心是基于时间戳计算剩余时间,而非依赖固定间隔的逐秒递减。

修改思路

  1. 初始化时记录倒计时的目标结束时间戳(当前时间 + 总倒计时毫秒数)
  2. 每次执行tick函数时,通过当前时间和结束时间戳的差值,计算真实剩余时间
  3. 根据剩余时间更新页面显示,而非依赖前一次的分秒值递推
  4. 即使标签页后台运行,切回时会自动校准剩余时间,保证倒计时准确

修改后的完整代码

var timeoutHandle;
function countdown(minutes) {
    // 计算倒计时结束的时间戳(当前时间 + 总毫秒数)
    const endTime = Date.now() + minutes * 60 * 1000;

    function tick() {
        // 计算剩余毫秒数
        const remaining = endTime - Date.now();
        
        if (remaining <= 0) {
            clearTimeout(timeoutHandle);
            apex.item('P0_SESSION_TIMER').setValue("0:00");
            // 这里加入弹出模态框的逻辑,示例如下:
            // apex.modal.open({
            //     title: "会话提醒",
            //     content: "您的会话即将过期,是否继续?",
            //     buttons: [
            //         {
            //             label: "继续",
            //             action: function() {
            //                 apex.modal.close();
            //                 // 如需重置倒计时,调用countdown(5)即可
            //             }
            //         },
            //         {
            //             label: "退出",
            //             action: function() {
            //                 apex.modal.close();
            //                 // 执行退出逻辑,比如跳转登录页
            //             }
            //         }
            //     ]
            // });
            return;
        }

        // 将剩余毫秒转换为分秒
        const totalSeconds = Math.floor(remaining / 1000);
        const current_minutes = Math.floor(totalSeconds / 60);
        const current_seconds = totalSeconds % 60;

        // 格式化显示字符串
        const displayText = `${current_minutes}:${current_seconds < 10 ? '0' : ''}${current_seconds}`;
        apex.item('P0_SESSION_TIMER').setValue(displayText);

        // 继续下一次tick,间隔1000毫秒(即使后台被节流,回来时会自动校准)
        timeoutHandle = setTimeout(tick, 1000);
    }

    tick();
}

关键说明

  • 时间戳计算:通过Date.now()获取当前时间戳,直接计算剩余时间,完全不受浏览器后台节流影响,确保倒计时的准确性
  • 自动校准:标签页切回时,tick函数会立即根据当前时间和结束时间算出真实剩余时间,更新显示,不会出现“暂停后跳变”的问题
  • 模态框逻辑:在剩余时间<=0的分支里,补充了你需要的模态框弹出代码(注释部分),可以根据实际需求调整内容和按钮逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 06:13:17