智能GWT JSNI只执行一次

Smart GWT JSNI executes only once

本文关键字:一次 执行 GWT JSNI 智能      更新时间:2023-09-26

我对智能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
            }
}-*/;

解决方案是在$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);
    }
}-*/;