Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/459.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript定时器|随机行为_Javascript_Timer_Settimeout_Setinterval_Oracle Adf - Fatal编程技术网

JavaScript定时器|随机行为

JavaScript定时器|随机行为,javascript,timer,settimeout,setinterval,oracle-adf,Javascript,Timer,Settimeout,Setinterval,Oracle Adf,我需要在某个时间间隔后显示一个弹出窗口,其中一个倒计时计时器运行5分钟,如果在倒计时变为0:00之前没有交互,它将重定向到某个url。我已经为此编写了下面的js函数,但它在计时器以负数运行或停止执行时有问题!这是密码- function displayOnTimeOut() { window.docTitle = document.title; var outputText = AdfPage.PAGE.findComponent('root:popupTxt'); ou

我需要在某个时间间隔后显示一个弹出窗口,其中一个倒计时计时器运行5分钟,如果在倒计时变为0:00之前没有交互,它将重定向到某个url。我已经为此编写了下面的js函数,但它在计时器以负数运行或停止执行时有问题!这是密码-

function displayOnTimeOut() {
    window.docTitle = document.title;
    var outputText = AdfPage.PAGE.findComponent('root:popupTxt');
    outputText.setValue(' ');
    var timerInitDate = new Date();
    var endTime = timerInitDate.getMinutes() * 60 + timerInitDate.getSeconds() + 300;
    function displayCountdown() {
        var d = new Date();
        var timeNow = d.getMinutes() * 60 + d.getSeconds();
        var timeleft = endTime - timeNow;
        var seconds = timeleft % 60;
        var minutes = Math.floor(timeleft / 60);
        var minutesText = " minutes";
        if (minutes == 1) {
            minutesText = " minute";
        }
        var secondsText = " seconds";
        if (seconds == 1) {
            secondsText = " second";
        }
        if (seconds > 1 && seconds % 2 == 0) {
            document.title = document.title == docTitle ? 'News Flash' : docTitle;
        }
        if (timeleft == 0) {
            clearInterval(timerIntervalId);
            window.onbeforeunload = null;
            outputText.setValue(' ');
            window.location.href = '/some/url.jspx';
            return;
        } else {
            outputText.setValue(minutes + minutesText + " and " + seconds + secondsText);
        }
    }
    window.timerIntervalId = setInterval(displayCountdown, 1000);
    var popup = AdfPage.PAGE.findComponentByAbsoluteId('root:popup');
    popup.show();
}
var timeOutPeriod = 60 * 1000;
if (typeof timerTimeoutId !== 'undefined') {
    clearTimeout(timerTimeoutId);
}
if (typeof timerIntervalId !== 'undefined') {
    clearTimeout(timerIntervalId);
}
window.timerTimeoutId = setTimeout(displayOnTimeOut, timeOutPeriod);
请忽略调用它的方式/时间,我在需要时使用ExtendedRenderKitService调用它。 我不是JS编码方面的专家,因为上面的代码很明显,请有人看看好吗

非常感谢


谢谢

如果timeleft感谢lujcon,但是,如果timeleft变为0,我将调用clearInterval,所以它永远不会小于0,不是吗?还为此添加了return语句。它不是真的。setInterval每1秒执行一次并不意味着它将每秒执行一次。它可以是每1001毫秒一次。。。所以你可以有1秒的剩余时间,下一次迭代-还有1秒…哦,是的!知道了!谢谢:但有时计时器也会停止,但没有错误-它只是停留在一个随机值上。有什么想法吗?谢谢,最后一个问题-为什么要固定而不是数学。toFixed在不同浏览器上的行为不同。另外,我也不明白在这里使用日期对象会有什么不同,你能解释一下吗?如果你使用getMinutes,你会得到错误的值。想象时间10:58。getMinutes为58,结束时间为63!但是时间现在5分钟后会给你3分。getMinutes返回部分时间的分钟数。它是相对于当前的一个小时。如果时间变了,你会得到错误的结果,你是对的。toFixed不是最好的,因为它返回字符串。
function displayOnTimeOut() {
    window.docTitle = document.title;
    var outputText = AdfPage.PAGE.findComponent('root:popupTxt');
    outputText.setValue(' ');
    var timerInitDate = new Date();
    var endTime = new Date(timerInitDate.getTime() + 5*60000)
    function displayCountdown() {
        var timeNow = new Date();
        var timeleft = endTime - timeNow;

        if (timeleft <= 0) {
            clearInterval(timerIntervalId);
            window.onbeforeunload = null;
            outputText.setValue(' ');
            window.location.href = '/some/url.jspx';
            return;
        }

        var minutes = Math.floor(timeleft / 60000);
        var seconds = Math.floor(((timeleft % 60000) / 1000));

        var minutesText = " minutes";
        if (minutes == 1) {
            minutesText = " minute";
        }
        var secondsText = " seconds";
        if (seconds == 1) {
            secondsText = " second";
        }
        if (seconds > 1 && seconds % 2 == 0) {
            document.title = document.title == docTitle ? 'News Flash' : docTitle;
        }

        outputText.setValue(minutes + minutesText + " and " + seconds + secondsText);
    }
    window.timerIntervalId = setInterval(displayCountdown, 1000);
    var popup = AdfPage.PAGE.findComponentByAbsoluteId('root:popup');
    popup.show();
}
var timeOutPeriod = 60 * 1000;
if (typeof timerTimeoutId !== 'undefined') {
    clearTimeout(timerTimeoutId);
}
if (typeof timerIntervalId !== 'undefined') {
    clearTimeout(timerIntervalId);
}
window.timerTimeoutId = setTimeout(displayOnTimeOut, timeOutPeriod);