我正在尝试制作一个JavaScript(jQuery也很好)函数来检查用户在当前页面上处于非活动状态的时间。我知道在JavaScript中有特定的窗口事件,如window.onload
,window.onmousemove
等。但我想知道是否有任何函数可以捕获任何事件(例如鼠标移动,按键或任何事件)否则表示用户在页面上的活动而不必手动设置所有这些事件监听器?
答案 0 :(得分:5)
我没有发现非活动事件。
我认为JQ是公平的游戏,因为你标记它。您可以使用一个绑定语句绑定多个事件,因此这样的事情应该起作用:
$('body').bind('mousedown keydown mousemove', resetInactiveTimer);
答案 1 :(得分:3)
不幸的是,javascript中没有通用的window.onevent。
我已经完成了一个“心跳”脚本,就像你要描述的那样,当用户在页面上处于活动状态时,确保会话保持活动状态,并且要监听的主要事件是mousemove
,{{1 } / keydown
,keyup
,可能还有窗口焦点。
请记住,如果您使用像TinyMCE这样的富文本编辑器,它在页面上运行自己的iFrame,那么这些事件可能不会被冒泡,您将需要对这些场景进行广泛测试。
使用jQuery或Mootools等Javascript框架可以更轻松地将单个函数绑定到多个事件或触发自己的事件来触发或重置超时。
答案 2 :(得分:1)
您不希望捕获所有事件,例如加载和突变事件与用户活动无关。我不知道用于一次捕获许多事件的浏览器界面。
我会为多种目的注册多个事件处理程序。当一个键关闭或鼠标按钮关闭时,显然用户不会闲置,无论他们持有多长时间。我会在最后一次发布后开始计时器,在mousemove上重置它或滚动,并在第一次按下时清除它。
答案 3 :(得分:1)
您可以创建一个CustomEvent然后调度它,就像我的例子:
var allEvents = new CustomEvent("all", {
detail: {
time: new Date()
},
bubbles: true,
cancelable: true
});
function onEvt(evt) {
switch (evt.type) {
case 'abort': case 'beforeunload': case 'blur': case 'change': case 'click': case 'close': case 'contextmenu': case 'devicelight':
case 'devicemotion': case 'deviceorientation': case 'deviceproximity': case 'dragdrop': case 'error': case 'focus': case 'hashchange':
case 'keydown': case 'keypress': case 'keyup': case 'load': case 'mousedown': case 'mousemove': case 'mouseout': case 'mouseover':
case 'mouseup': case 'mozbeforepaint': case 'paint': case 'popstate': case 'reset': case 'resize': case 'scroll': case 'select':
case 'submit': case 'unload': case 'userproximity': case 'pageshow': case 'pagehide':
evt.currentTarget.dispatchEvent(allEvents);
break;
}
}
window.addEventListener('click', onEvt);
window.addEventListener('all', function(evt) {
alert('mwahahahahaha');
});
答案 4 :(得分:0)
没有通用事件,但您可以根据Nicholas C. Zakas的Idle Timer编写自己的函数。