`
uncoseason
  • 浏览: 1920 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
最近访客 更多访客>>
社区版块
存档分类
最新评论

Web界面无人操作时触发事件 onNobodyEvent

阅读更多
灵感源于一个投射展示型项目,代码很简单并包含注释就不做累述了。
/*
 * nobody.js
 * @author Yimo
 * @version v1.0
 */
(function(){
	// 人为操作事件支持,以下事件触发将被认定为当前页面存在人为操作
	var events = ['mousemove','keypress','mousedown','mousewheel'];
	
	// 添加事件
	function addEvent(type,handler){
		if (window.addEventListener){
			window.addEventListener(type, handler, false);
        } else if (window.attachEvent){
        	window.attachEvent("on" + type, handler);
        } else {
        	window["on" + type] = handler;
        }
	}
	
	// 移除事件
	function removeEvent(type,handler){
		if (window.removeEventListener){
			window.removeEventListener(type, handler, false);
        } else if (window.detachEvent){
        	window.detachEvent("on" + type, handler);
        } else {
        	window["on" + type] = null;
        }
	}
	// 按ID缓存对应nobody事件的内部对象用于后续事件销毁
	var cache = {};
	
	/*
	 * 无人操作事件
	 * 
	 * @param func 事件触发时的回调函数
	 * @param timeout 无人操作事件触发延迟时间
	 * @param onlyonce 是否仅触发一次
	 * 
	 * @return 事件定时器ID
	 */
	window.onNobody = function(func,timeout,onlyonce){
		// 域内独立对象,保证onNobody每次调用都有一个属于自己的detail对象
		var detail = {
			 counter : 0,
			 lastTime : new Date().getTime(),
			 reset : function(){
				 detail.counter = 0;
			 }
		}
		for(var i = 0; i < events.length; i++){
			addEvent(events[i],detail.reset);
		};
		var id = setInterval(function(){
			if(detail.counter >= timeout){
				func();
				if(!onlyonce){
					detail.counter = 0;
				}else{
					window.clearNobody(id);
				}
			}
			var time = new Date().getTime();
			detail.counter += time - detail.lastTime;
			detail.lastTime = time;
		},1);
		cache[id] = detail;
		return id;
	}
	
	/*
	 * 移除无人操作事件
	 * 
	 * @param id 添加无人操作事件时返回的ID
	 */
	window.offNobody = function(id){
		clearInterval(id);
		for(var i = 0; i < events.length; i++){
			removeEvent(events[i],cache[id].reset);
		};
	}
})();
2
1
分享到:
评论
2 楼 uncoseason 2014-02-20  
Jack_ljk 写道
window.clearNobody = function(id){
    cache[id] && (clearInterval(id), delete cache[id]);
}

考虑一下setInterval(fn, 1); // 每1毫秒执行一次是否太频繁,1000应该也是在可接受的范围内吧?


setInterval本身在浏览器端的native实现中根据不同浏览器实现平均大概会在10-20ms调用一次进行校验当满足interval执行时间则执行interval回调,例如setInterval(fn,1000)同样会在后台每10-20ms左右调用一次校验的。根据浏览器单线程的特性这个函数调用实际不会那么频繁的并且实际执行时间在毫秒级是不能够确认的,间隔时候尽可能的设小是为了尽可能的贴合间隔时间精准度。如果没有那么高的时效性要求是可以考虑将这个时间加大的
1 楼 Jack_ljk 2014-02-20  
window.clearNobody = function(id){
    cache[id] && (clearInterval(id), delete cache[id]);
}

考虑一下setInterval(fn, 1); // 每1毫秒执行一次是否太频繁,1000应该也是在可接受的范围内吧?

相关推荐

    拖动控件时不触发事件,给新人的

    常见的如`MouseDown`、`MouseMove`和`MouseUp`,这些事件在鼠标操作时会被触发。在拖动控件时,`MouseDown`通常用于开始拖动,`MouseMove`处理拖动过程,而`MouseUp`则结束拖动。如果我们希望在拖动时不触发任何事件...

    DataGridView DataGridViewCheckBoxColumn编辑时实时触发事件代码

    `DataGridViewCheckBoxColumn`允许用户通过点击来选择或取消选择一个条目,而实时触发事件则可以让你在用户做出这些改变时立即执行相应的操作。 标题中的“DataGridView DataGridViewCheckBoxColumn编辑时实时触发...

    光标停止输入触发事件 js

    - 当用户释放按键时触发 `onkeyup` 事件,当按下按键时触发 `onkeydown` 事件。 2. **延时定时器 (setTimeout)** - `setTimeout` 函数用于设置一个延时定时器,在指定的毫秒数之后执行一次函数。 - 本例中,`...

    javascript触发模拟鼠标点击事件

    但是在某些特定的业务场景下,我们可能需要在用户没有直接操作时,程序性地触发这些事件。 在旧版本的Internet Explorer(IE)浏览器中,可以使用`fireEvent`方法来触发事件。例如: ```javascript var obj = ...

    select 选择同一值触发onchange事件

    web前端小问题,select 选择事件,当选择select同一值触发onchange事件

    FileSystemWatcher控件:事件触发多次的解决方法

    6. **设置EnableRaisingEvents属性**:在不必要时,可以临时禁用事件的触发,比如在进行批量操作时,然后在操作完成后重新启用。 在实际应用中,应根据具体需求选择合适的方法,或者结合多种策略来优化事件处理,...

    基于事件触发的无人驾驶汽车路径跟随预测控制.pdf

    事件触发控制(Event-Triggered Control)是一种控制策略,它与传统的周期采样控制不同,事件触发控制不是周期性地执行控制动作,而是在某些预先设定的事件发生时才进行控制。这种策略可以减少控制算法的计算量,...

    C#WindowsService定时触发事件

    在IT领域,Windows服务(Windows Service)是一种在后台运行的应用程序,它不依赖于用户界面,可以在操作系统启动后自动执行任务。C#是.NET框架下的主要编程语言,它提供了丰富的库来创建和管理Windows服务。本篇...

    WEB登陆界面实验代码

    在本实验中,我们将深入探讨如何构建一个基于WEB的登录界面,使用的技术栈包括JSP(JavaServer Pages)、Servlet和Bean,以及可能涉及到的COM组件。这个实验旨在帮助你理解和实践WEB开发的基本流程,以及这些技术...

    javascritp 鼠标触发事件大全

    首先,JavaScript提供了多种鼠标事件,这些事件允许开发者在用户与网页元素进行交互时执行特定操作。以下是一些主要的鼠标事件: 1. `click`:当用户点击鼠标左键时触发。这通常用于执行单击操作,如按钮点击或链接...

    鼠标事件演示鼠标的实时坐标,鼠标触发事件

    在计算机编程领域,尤其是涉及到用户界面(UI)的开发时,鼠标事件扮演着至关重要的角色。这些事件使得程序能够响应用户的鼠标操作,如点击、移动、拖拽等,从而实现与用户的交互。在这个名为“鼠标事件演示鼠标的...

    labview定时结构实现不同时间触发不同事件

    基于Labview代码编程,可实现多个不同事件触发不同事件,例如,间隔200ms,400ms,600ms,进行对应的操作,通常在测控软件实现控制指令一级广播事件指令时用到,代码复用性较高,可粘贴直接使用,逻辑简单明了,很好用...

    点击子元素事件不触发父元素事件

    点击子元素,触发子元素事件的同时不触发父元素的时间

    c# treeview 添加节点后面button触发事件

    c# treeview 添加节点后面button触发事件

    [js]javascript事件集合(包有触发事件).pdf

    `ondragend`事件在拖动操作完成时触发;`ondragover`事件在被拖动的元素进入有效放置目标时触发;`ondrop`事件在元素上放下被拖动的元素时触发。 ```javascript document.getElementById('drag').ondragstart = ...

    Swing事件源可能触发的事件

    在Java Swing库中,用户界面(UI)组件是事件的源,它们能够触发多种类型的事件,这些事件通常与用户的交互、组件的状态变化或应用程序的内部操作相关。以下是对标题和描述中提到的Swing组件及其可能触发的事件的...

    AJAX中不触发javascript事件

    标题中的“AJAX中不触发javascript事件”指的是在使用AJAX技术进行页面更新时,可能出现JavaScript事件不按预期触发的情况。这通常是由于AJAX请求更新页面部分时,不会触发表单提交、点击或其他依赖于页面刷新的...

    WEB页编程技巧──JavaScript事件的应用.pdf

    2. Load事件:WEB页加载完成时触发的事件。 3. Mouseover事件:鼠标指针移到元素上时触发的事件。 4. Mouseout事件:鼠标指针离开元素时触发的事件。 5. Focus事件:元素获得焦点时触发的事件。 6. Blur事件:元素...

    qt例程-事件触发VSQtUseQmlUi.7z

    "事件触发"是QT中的一个重要概念,而"QtUseQmlUi"则涉及到QT的QML(Quick Markup Language)用户界面设计。下面我们将深入探讨这两个主题。 首先,让我们了解一下QT中的事件触发机制。在QT编程中,事件是应用程序...

    在程序中调用下拉框改变事件.

    改变事件是指当用户在下拉框中选择了一个不同的选项时触发的事件。这个事件通常被用来更新页面上的其他元素或者执行某些操作,比如重新加载数据、显示新的内容等。 ### 二、在程序中调用下拉框改变事件的方法 ####...

Global site tag (gtag.js) - Google Analytics