我希望有一个倒数计时器(很像票务网站使用ticketek一样),以便用户知道我们将保留10分钟的预订,因此他们最好快点填写表格!

我在如何将其他JavaScript合并到xPage中的知识方面存在空白。我将不胜感激。

本质上,我的计划如下:

  • 加载页面。
  • 倒数计时器的运行时间为10:00至0:00
  • 在0:00,转到新页面并丢失所有输入的数据

  • 为此,我在此stackoverflow帖子(The simplest possible JavaScript countdown timer?)中引用了最上面的答案,并尝试在xPage中使用它。

    我将此代码原样(因此不起作用)并入了xPage中(请参见下文),希望它能起作用,然后将其更改为使用计算的字段控件。我已将其保留下来,希望有人能将我引导到我对此理解错误的地方?

    是否有关于我要去哪里的指针,或者如何最好地获得像这样的控件?
    <?xml version="1.0" encoding="UTF-8"?>
    <xp:view xmlns:xp="http://www.ibm.com/xsp/core">
    <xp:this.afterPageLoad>
            <xp:executeScript>
                <xp:this.script><![CDATA[#{javascript:function startTimer(duration, display) {
        var timer = duration, minutes, seconds;
        setInterval(function () {
            minutes = parseInt(timer / 60, 10)
            seconds = parseInt(timer % 60, 10);
    
            minutes = minutes < 10 ? "0" + minutes : minutes;
            seconds = seconds < 10 ? "0" + seconds : seconds;
    
            display.textContent = minutes + ":" + seconds;
    
            if (--timer < 0) {
                timer = duration;
            }
        }, 1000);
    }
    
     var fiveMinutes = 60 * 5,
            display = document.querySelector('#time');
        startTimer(fiveMinutes, display);}]]></xp:this.script>
            </xp:executeScript>
        </xp:this.afterPageLoad>
        <div>
            Please complete in <span id="time">05:00</span>minutes.
    </div>
    </xp:view>
    

    最佳答案

    将CSJS代码放入onClientLoad事件。更改某些内容后,它现在可以工作:

    <?xml version="1.0" encoding="UTF-8"?>
    <xp:view
        xmlns:xp="http://www.ibm.com/xsp/core">
        <xp:eventHandler
            event="onClientLoad"
            submit="false">
            <xp:this.script><![CDATA[
    function startTimer(duration, display) {
        var timer = duration;
        setInterval(function () {
            if (--timer <= 0) {
                window.location="http://www.google.de";
            }
            var minutes = parseInt(timer / 60, 10);
            var seconds = parseInt(timer % 60, 10);
            minutes = minutes < 10 ? "0" + minutes : minutes;
            seconds = seconds < 10 ? "0" + seconds : seconds;
            display.innerHTML = minutes + ":" + seconds;
        }, 1000);
    }
    
    var fiveMinutes = 60 * 5;
    var display = document.getElementById("time");
    startTimer(fiveMinutes, display);
    ]]></xp:this.script>
        </xp:eventHandler>
        <div>
            Please complete in&#160;<span id="time">05:00</span>&#160;minutes.
        </div>
    </xp:view>
    

    如果您需要在时间到后清理XPage中的内容,请创建一个面板,该面板在时间到时会部分刷新:
        ...
        if (--timer <= 0) {
            XSP.partialRefreshPost("#{id:timeIsUp}", {params: {timeIsUp: "timeIsUp"}});
        }
        ...
    
    <xp:panel id="timeIsUp">
        <xp:this.rendered><![CDATA[#{javascript:
            if (param.timeIsUp <== null) {
                ' clean your data
                context.redirectToPage('tooLate')
            };
            true
        }]]></xp:this.rendered>
    </xp:panel>
    

    09-25 20:16