跨浏览器的JavaScript事件处理[JavaScript高级程序设计]
2008-01-03 23:05
676 查看
//document.write("<script type=\"text\/javascript\" src=\"myLibrary\/browserDetect.js\"><\/script>");
/*
* 跨浏览器的事件处理方式,以便所有的浏览器和特征检测都可以在后台完成
* 本Js代码的目的就是尽可能的弱化IE事件模型和DOM事件模型之间的区别,使一部分代码能在所有主流浏览器上几乎完全相同的运行
*/
/*
* 管理多个函数的容器,无任何属性
*/
var EventUtil = new Object;
/*
* 创建统一的分配事件处理函数和删除的方式
*/
EventUtil.addEventHandle = function(oTarget,sEventType,fnHandle)
{
//特征检测法
if(oTarget.addEventListener)
{
//DOM事件模型中添加冒泡阶段的事件监听函数
oTarget.addEventListener(sEventType,fnHandle,false);
}
else if(oTarget.attachEvent)
{
oTarget.attachEvent("on"+sEventType,fnHandle);
}
else
oTarget["on"+sEventType] = fnHandle;
}
EventUtil.removeEventHandle = function(oTarget,sEventType,fnHandle)
{
if(oTarget.removeEventListener)
{
//DOM事件模型中添加冒泡阶段的事件监听函数
oTarget.removeEventListener(sEventType,fnHandle,false);
}
else if(oTarget.detachEvent)
{
oTarget.detachEvent("on"+sEventType,fnHandle);
}
else
oTarget["on"+sEventType] = null;
}
/*
* 格式化event对象
* 一种对付IE和DOM中的event对象之间区别的最佳手段是,调整它们使之尽可能地表现相似
* 因为有更多的浏览器使用的是DOM事件模型,所以这里将IE的事件模型调整为接近DOM
*/
EventUtil.formatEvent = function(oEvent)
{
//这个函数的主要目的是修复只存在于Windows上的IE中的问题
if(isIE && isWin)
{
/*
* 用户按某个字符键的时候,会按如下顺序发生事件:
* 1.keydown
* 2.keypress
* 3.keyup
* 用户按某个非字符键(shift,ctrl,alt)的时候,会按如下顺序发生事件:
* 1.keydown
* 2.keyup
*/
oEvent.charCode = (oEvent.type == "keypress") ? oEvent.keyCode : 0;
oEvent.isChar = (oEvent.charCode>0);
/*
* DOM中才有eventPhase
* 0:捕获阶段
* 1:在目标上
* 2:冒泡阶段
*/
oEvent.eventPhase = 2;
oEvent.preventDefault = function()
{
this.returnValue = 0;
}
/*
* scrollLeft保存窗口在水平方向上卷动的距离
* scrollTop保存窗口在垂直方向上卷动的距离
*/
oEvent.pageX = oEvent.clientX + document.body.scrollLeft;
oEvent.pageY = oEvent.clientY + document.body.scrollTop;
if(oEvent.type == "mouseout")
{
oEvent.relatedTarget = oEvent.toElement;
}else if(oEvent.type == "mouseover")
{
oEvent.relatedTarget = oEvent.fromElement;
}
oEvent.stopPropagation = function()
{
this.cancelBubble = true;
}
oEvent.target = oEvent.srcElement;
oEvent.time = (new Date()).getTime();
}
return oEvent;
}
/*
* 获取事件对象
* IE中通过在事件处理函数中引用window.event获区事件对象
* DOM中则是通过事件监听函数的第一个参数 argument[0]
*/
/*
* 该方法可以在事件处理函数中使用:
* oDiv.onclick = function()
* {
* var oEvent = EventUtil.getEvent();
* };
*/
EventUtil.getEvent = function()
{
if(window.event)
{
return this.formatEvent(window.event);
}
else
{
/*
* 每个函数都有一个caller属性,它包含了指向调用它的方法的引用
* 例如,如果funcA()调用了funcB(),那么funcB.caller就等于funcA
*/
return EventUtil.getEvent.caller.arguments[0];
}
}
/*
* 跨浏览器的事件处理方式,以便所有的浏览器和特征检测都可以在后台完成
* 本Js代码的目的就是尽可能的弱化IE事件模型和DOM事件模型之间的区别,使一部分代码能在所有主流浏览器上几乎完全相同的运行
*/
/*
* 管理多个函数的容器,无任何属性
*/
var EventUtil = new Object;
/*
* 创建统一的分配事件处理函数和删除的方式
*/
EventUtil.addEventHandle = function(oTarget,sEventType,fnHandle)
{
//特征检测法
if(oTarget.addEventListener)
{
//DOM事件模型中添加冒泡阶段的事件监听函数
oTarget.addEventListener(sEventType,fnHandle,false);
}
else if(oTarget.attachEvent)
{
oTarget.attachEvent("on"+sEventType,fnHandle);
}
else
oTarget["on"+sEventType] = fnHandle;
}
EventUtil.removeEventHandle = function(oTarget,sEventType,fnHandle)
{
if(oTarget.removeEventListener)
{
//DOM事件模型中添加冒泡阶段的事件监听函数
oTarget.removeEventListener(sEventType,fnHandle,false);
}
else if(oTarget.detachEvent)
{
oTarget.detachEvent("on"+sEventType,fnHandle);
}
else
oTarget["on"+sEventType] = null;
}
/*
* 格式化event对象
* 一种对付IE和DOM中的event对象之间区别的最佳手段是,调整它们使之尽可能地表现相似
* 因为有更多的浏览器使用的是DOM事件模型,所以这里将IE的事件模型调整为接近DOM
*/
EventUtil.formatEvent = function(oEvent)
{
//这个函数的主要目的是修复只存在于Windows上的IE中的问题
if(isIE && isWin)
{
/*
* 用户按某个字符键的时候,会按如下顺序发生事件:
* 1.keydown
* 2.keypress
* 3.keyup
* 用户按某个非字符键(shift,ctrl,alt)的时候,会按如下顺序发生事件:
* 1.keydown
* 2.keyup
*/
oEvent.charCode = (oEvent.type == "keypress") ? oEvent.keyCode : 0;
oEvent.isChar = (oEvent.charCode>0);
/*
* DOM中才有eventPhase
* 0:捕获阶段
* 1:在目标上
* 2:冒泡阶段
*/
oEvent.eventPhase = 2;
oEvent.preventDefault = function()
{
this.returnValue = 0;
}
/*
* scrollLeft保存窗口在水平方向上卷动的距离
* scrollTop保存窗口在垂直方向上卷动的距离
*/
oEvent.pageX = oEvent.clientX + document.body.scrollLeft;
oEvent.pageY = oEvent.clientY + document.body.scrollTop;
if(oEvent.type == "mouseout")
{
oEvent.relatedTarget = oEvent.toElement;
}else if(oEvent.type == "mouseover")
{
oEvent.relatedTarget = oEvent.fromElement;
}
oEvent.stopPropagation = function()
{
this.cancelBubble = true;
}
oEvent.target = oEvent.srcElement;
oEvent.time = (new Date()).getTime();
}
return oEvent;
}
/*
* 获取事件对象
* IE中通过在事件处理函数中引用window.event获区事件对象
* DOM中则是通过事件监听函数的第一个参数 argument[0]
*/
/*
* 该方法可以在事件处理函数中使用:
* oDiv.onclick = function()
* {
* var oEvent = EventUtil.getEvent();
* };
*/
EventUtil.getEvent = function()
{
if(window.event)
{
return this.formatEvent(window.event);
}
else
{
/*
* 每个函数都有一个caller属性,它包含了指向调用它的方法的引用
* 例如,如果funcA()调用了funcB(),那么funcB.caller就等于funcA
*/
return EventUtil.getEvent.caller.arguments[0];
}
}
相关文章推荐
- JavaScript高级程序设计学习笔记--事件(二)(事件对象--DOM中的事件对象/IE中的事件对象/跨浏览器的事件对象)
- JavaScript高级程序设计学习笔记--事件(一)(事件流、事件处理程序/事件侦听器)
- JavaScript高级程序设计零碎知识点 事件与处理脚本
- javascript事件小结(事件处理程序方式)--javascript高级程序设计笔记
- javascript高级程序设计第二版第十二章事件要点总结(常用的跨浏览器检测方法)
- JavaScript高级程序设计 DOM事件处理 读书笔记
- JavaScript高级程序设计学习笔记--事件(一)(事件流、事件处理程序/事件侦听器)
- js高级程序设计之跨浏览器事件处理
- JavaScript高级程序设计11--事件
- javascript 跨浏览器事件处理
- JavaScript跨浏览器事件处理
- 跨浏览器的事件处理方法(Professional JavaScript for Web Developers)
- JavaScript高级程序设计 阅读笔记(十七) js事件
- javascript高级程序设计(二)navigator.plugin浏览器插件检测
- javascript打造跨浏览器事件处理机制[Blue-Dream出品]
- JavaScript高级程序设计(第3版)学习笔记14——浏览器对象模型BOM
- Javascript跨浏览器事件处理
- Javascript跨浏览器处理键盘事件keydown,keypress,keyup
- Javascript高级程序设计第十三章(事件)