Smart GWT JSNI只执行一次

时间:2015-07-20 07:01:50

标签: javascript gwt smartgwt jsni

我对Smart GWT应用程序中的JSNI执行有疑问。

我想实现用户活动监控功能。当用户处于非活动状态n分钟时,页面将触发通知模式并呼叫用户返回。像9gag上的唤醒通知。

在通知被触发后,我将实现一些额外的功能(即计算用户失效的次数..)

问题: 正常工作的JSNI函数(我在纯HTML和JavaScript页面上测试过)只执行一次。在第一次将不活动通知模式推送给用户后,函数不再执行。

public static native void wakeUp()/*-{
            console.log("#### Wake Up - started");
            var timeout;
            resetTimer();

            document.onmousemove = resetTimer;
            document.onclick = resetTimer;

            function resetTimer() {
                clearTimeout(timeout);
                timeout = setTimeout(function() {
                    console.log("#### Wake Up - inactive for 1 minute...");
                    //display custom modal
                    @com.pb.client.MGMWeb::displayWakeUpNotification()();
                }, 1 * 10 * 1000);//inactivity duration
            }
}-*/;

1 个答案:

答案 0 :(得分:0)

解决方案是将事件监听器添加到$ doc而不是使用document。

工作示例:

public static native void wakeUp()/*-{
    console.log("#### WakeUp - Start");
    var timeout;
    resetTimer();

    $doc.addEventListener('onclick', resetTimer, false);
    $doc.addEventListener('onmouseover', resetTimer, false);
    $doc.addEventListener('mousedown', resetTimer, false);
    $doc.addEventListener('keypress', resetTimer, false);
    $doc.addEventListener('mousemove', resetTimer, false);
    $doc.addEventListener("DOMMouseScroll", resetTimer, false);
    $doc.addEventListener("MSPointerMove", resetTimer, false);
    $doc.addEventListener("touchmove", resetTimer, false);

    function notifiyUser() {
        @com.pb.client.MGMWeb::displayWakeUpNotification()();
        console.log("#### Wake Up - inactive for 1 minute..");
    }

    function resetTimer() {
        clearTimeout(timeout);
        timeout = setTimeout(notifiyUser, 1 * 60 * 1000);
    }
}-*/;