智能 GWT JSNI 只执行一次

Smart GWT JSNI executes only once

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

我想实现用户 activity 监控功能。当用户不活动 n 分钟时,页面将触发通知模式并呼叫用户回来。诸如 9gag 上的唤醒通知之类的东西。

触发通知后,我将实现一些额外的功能(即计算用户处于非活动状态的次数..)

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

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
            }
}-*/;

解决方案是将事件侦听器添加到 $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);
    }
}-*/;