我对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
}
}-*/;
答案 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);
}
}-*/;