JavaScript之事件处理(监听)函数
事件是用户和浏览器自身进行的特定行为。这些事件都有自己的名字,如click,,load,mouseover。用于响应某个事件而调用的函数称为事件处理函数,或者DOM称之为事件监听函数。事件处理函数有两种分配方式:在Jav aScript中或者在HTML 中。
如果在JavaScript中分配事件处理函数,则需要首先获得要处理的对象的引用,然后将函数赋值给对应的事件处理函数属性,像这样:
var oDiv=document.getElementById(“div1”);
oDiv.onclick=function(){
alert(“I was clicked”);
};
用这个分配方法,事件处理函数名称必须小写,才能正确响应事件。
如果在HTML中分配事件处理函数,则只要在HTML标签中添加事件处理函数的特性,并在其中包含合适的脚本作为特性值就可以了,如下:
用这种方法,事件处理函数的大小写都可以,所以onclick等同于onClick、OnClick或ONCLICK(建议使用标准的XHTML 代码,则事件处理函数应该全部用小写定义)。
这两个方法在当前所有流行的浏览器都可使用,但传统的做法能为每个可用事件分配多个事件处理函数。于是,IE包含了自己独有的方法,而DOM却规定了另一个方法。
(一)IE
在IE中,每个元素和window对象都有两个方法:attachEvent()和detachEvent()。顾名思义,attachEv ent()用来给一个事件附加事件处理函数,而detachEvent()用来将事件处理函数分享出来。每个方法都有两个参数:要分配的事件处理函数的名字及一个函数。
[object].attachEvent(“name_of_event_handler”,fnHandler);
[object].dettachEvent(“name_of_event_handler”,fnHandler);
在attachEvent()中,函数被作为事件处理函数添加,detachEvent()在事件处理函数列表中查找制定的函数,并移除它。例如:
var fnClick1=function(){
alert(“Clicked”);
};
var fnClick2=function(){
alert(“Also Clicked”);
};
var oDiv=document.getElementById(“div”);
oDiv.attachEvent(“onclick”,fnClick1); //添加事件
// oDiv.onclick=fnClick1; //用传统的JavaScrip t方法来添加事件
oDiv.attachEvent(“onclick”,fnClick2); //添加事件
oDiv.detachEvent(“onclick”,fnClick); //移除事件
上面的例子表明,可以为一个对象添加多个事件处理函数,它是按照添加它们的顺序进行调用的。传统方法上对事件处理函数的赋值其实被看成另一种attachEvent()的调用。上例先显示Clicked,接着显示Also Clicked。
(二)DOM
DOM方法addEventListener()和removeEventListener()用来分配和移除事件处理函数,与IE不同,这些方法需要三个参数:事件名称,要分配的函数和处理函数用于冒泡阶段还是捕获阶段。如果事件处理函数是用于捕获阶段,第三个参数为true;用于冒泡阶段,则为false。下面是语法:
[object].addEventListener(“name_of_event”,fnHandler,bCapture);
[object].removeEventListener(“name_of_event”,fnHandler,bCapture);
var fnClick1=function(){
alert(“Clicked”);
};
var fnClick2=function(){
alert(“Also Clicked”);
};
var oDiv=document.getElementById(“div”);
oDiv.addEventListener(“click”,fnClick1,false); //添加事件
oDiv.addEventListener(“click”,fnClick2,false); //添加事件
oDiv.removeEventListener(“click”,fnClick1,false); //移除事件
oDiv.removeEventListener(“click”,fnClick2,true); //无法移除事件,因为没有指明捕获阶段
与IE一样,也可以为一个对象添加多个事件处理函数。显示效果是一样的。
如果使用addEventListener()将事件处理函数加入到捕获阶段,则必须在removeEventlistener()中指明是捕获阶段,才能正确地将这个事件处理函数删除。
如果使用传统方法直接给事件处理函数属性赋值,事件处理函数将被添加到事件的冒泡阶段。
直接赋值的一个很重要的不同点是,后续对事件处理函数的赋值将清除前面的赋值:
oDiv.onclick=fnClick;
oDiv.onclick=fnDifferentClick;
起初fnClick被赋给onclick事件处理函数,然后又被fnDifferentClick替换了。
Activiti 监听器的配置使用
Activiti 监听器的配置使用 一)流程监听器的配置 此监听器的作用是记录流程的启动和结束事件日志,详细参考类 cn.bc.workflow.activiti.delegate.ProcessLogListener 用Activiti Designer打开流程图,点击空白处,在Properties的Listeners中如下配置流程的start和end两个事件: 二)任务监听器的配置 此监听器的作用是记录任务的创建、分派和完成的事件日志,详细参考类 cn.bc.workflow.activiti.delegate.TaskLogListener 用Activiti Designer打开流程图,点击要配置的任务节点,在Properties的Listeners中如下配置任务的事件监听:
如下是自动将任务分配到岗位或岗位内用户的任务监听器的配置: 详见类cn.bc.workflow.activiti.delegate.Assign2GroupUserListener,监听器在流程图中需要配置为"java class"类型,Fields参数中有两种配置方式:1)岗位名称+保存组织ID的流程变量名(全局变量),2)岗位编码。 监听器会根据配置方式先获取岗位,然后自动获取岗位内的用户信息,如果岗位内只有一个用户,就直接将任务分配给此用户,否则分配给岗位。
三)流向或网关监听器的配置 此监听器的作用是记录流向的执行事件日志,在平台中是可选的,视具体情况按需配置,详细参考类cn.bc.workflow.activiti.delegate.FlowLogListener 用Activiti Designer打开流程图,点击要配置的流向或网关,在Properties的Listeners 中类似任务监听器的方式进行配置即可:
Javascript前台捕获浏览器关闭事件,后台处理一些善后工作
Javascript前台捕获浏览器关闭事件,后台处理一些善后工作 1.使用onbeforeunload 事件捕获浏览器关闭事件 IE和火狐都支持onbeforeunload事件,但是opera不支持。 注意:不仅关闭浏览器时会触发onbeforeunload事件,刷新等事件也会触发onbeforeunload事件。 2.事件注册方法
3.使用Ajax技术向服务器异步发送需要做的善后工作 这里以登陆为例:当用户关闭浏览器时,需要把用户登陆的状态修改为‘已退出’。由于用户登陆的状态存放在服务器的数据库中,所有必需在客户端捕获浏览器关闭动作,在浏览器关闭之前,向服务器发送一个请求,当然这个的请求是异步发送的(Ajax技术);服务器收到请求后,把当前用户的登陆状态修改为‘已退出’。 function CloseBrowse()//用户关闭浏览器 { var n = window.event.screenX - window.screenLeft; var b = n > document.documentElement.scrollWidth - 20; //可以捕获点击小差和 Alt+F4 时浏览器关闭的情况,但是不能捕获在多窗口浏览模式下,用户点多窗口模式的小差关闭浏览器的情况 if (b && window.event.clientY < 0 || window.event.altKey) { var url = "Service.asmx/UpdateLoginState"; UpdateLoginState(url); } } //使用Ajax 向服务器发送异步请求,要求服务器修改登录状态 function UpdateLoginState() { var url = "Service.asmx/UpdateLoginState"; SendRequestToWebService(url); } function SendRequestToWebService(url){ createXmlhttp(); xmlhttp.open("POST", url, true); //xmlhttp.onreadystatechange = handleStateChange; xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;"); xmlhttp.send(); } //创建XMLHttpRequest对象 function createXmlhttp() {JavaScript事件
我的记录(JavaScript事件)JavaScript 事件冒泡简介及应用实例 一、什么是事件冒泡 在一个对象上触发某类事件(比如单击onclick事件),如果此对象定义了此事件的处理程序,那么此事件就会调用这个处理程序,如果没有定义此事件处理程序或者事件返回true,那么这个事件会向这个对象的父级对象传播,从里到外,直至它被处理(父级对象所有同类事件都将被激活),或者它到达了对象层次的最顶层,即document对象(有些浏览器是window)。 打个比方说:你在地方法院要上诉一件案子,如果地方没有处理此类案件的法院,地方相关部门会帮你继续往上级法院上诉,比如从市级到省级,直至到中央法院,最终使你的案件得以处理。 二、事件冒泡有什么作用 (1)事件冒泡允许多个操作被集中处理(把事件处理器添加到一个父级元素上,避免把事件处理器添加到多个子级元素上),它还可以让你在对象层的不同级别捕获事件。 【集中处理例子】