javascript事件处理模型实例说明


Posted in Javascript onMay 31, 2016

事件(Event)是JavaScript应用跳动的心脏 ,也是把所有东西粘在一起的胶水。当我们与浏览器中 Web 页面进行某些类型的交互时,事件就发生了。事件可能是用户在某些内容上的点击、鼠标经过某个特定元素或按下键盘上的某些按键。事件还可能是 Web 浏览器中发生的事情,比如说某个 Web 页面加载完成,或者是用户滚动窗口或改变窗口大小。

通过使用 JavaScript ,你可以监听特定事件的发生,并规定让某些事件发生以对这些事件做出响应。

一、添加事件监听

IE:

attachEvent("onclick",function(){...}) //添加

detachEvent("onclick",function(){...}) //删除

FF:

addEventListener("click",function(){...},false)

//可以跟一个对象添加多个事件监听,跟默认的对象事件不同

removeEventListenner("click",function(){...},false)

二、得到事件对象

IE:

op.onClick=function(){

    ver oevent = window.event; //作为window的一个属性

}

FF:

op.onClick=function(oevent){

    ....  //通过传入参数来控制

}

通用:

op.onClick=function(oevent){

    if(window.event){

        oevent=window.event;

    }

}

//即时得到了通用的,但是他们返回对象的属性和方法也不尽一致,但可以使用通过EventUtil来解决!

var EventUtil = new Object;
/**//*
  此方法用来给特定对象添加事件,oTarget是指定对象,sEventType是事件类型,如click、keydown等,   fnHandler是事件回调函数
*/
EventUtil.addEventHandler = function (oTarget, sEventType, fnHandler) {
   //firefox情况下
   if (oTarget.addEventListener) {
     oTarget.addEventListener(sEventType, fnHandler, false);
   }
   //IE下
   else if (oTarget.attachEvent) {
     oTarget.attachEvent("on" + sEventType, fnHandler);
   }
   else {
     oTarget["on" + sEventType] = fnHandler;
   }
};
/*
  此方法用来移除特定对象的特定事件,oTarget是指定对象,sEventType是事件类型,如click、keydown等,fnHandler是事件回调函数
*/   
EventUtil.removeEventHandler = function (oTarget, sEventType, fnHandler) {
   if (oTarget.removeEventListener) {
     oTarget.removeEventListener(sEventType, fnHandler, false);
   } else if (oTarget.detachEvent) {
     oTarget.detachEvent("on" + sEventType, fnHandler);
   } else {
     oTarget["on" + sEventType] = null;
   }
};

/*
格式化事件,因为IE和其他浏览器下获取事件的方式不同并且事件的属性也不尽相同,通过此方法提供一个一致的事件
*/
EventUtil.formatEvent = function (oEvent) {
   //isIE和isWin引用到一个js文件,判断浏览器和操作系统类型
   if (isIE && isWin) {
     oEvent.charCode = (oEvent.type == "keypress") ? oEvent.keyCode : 0;
     //IE只支持冒泡,不支持捕获
     oEvent.eventPhase = 2;
     oEvent.isChar = (oEvent.charCode > 0);
     oEvent.pageX = oEvent.clientX + document.body.scrollLeft;
     oEvent.pageY = oEvent.clientY + document.body.scrollTop;
     //阻止事件的默认行为
     oEvent.preventDefault = function () {
       this.returnValue = false;
     };

      //将toElement,fromElement转化为标准的relatedTarget
     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;
     //添加事件发生时间属性,IE没有
     oEvent.time = (new Date).getTime();
   }
   return oEvent;
};

EventUtil.getEvent = function() {
   if (window.event) {
     //格式化IE的事件
     return this.formatEvent(window.event);
   } else {
     return EventUtil.getEvent.caller.arguments[0];
   }
};
/*
*附带上一个判断浏览器和系统类型的js文件,通过引入一些名字显而易见的全局变量作为判断的结果,使用时需要小心变量名称冲突:
*/
var sUserAgent = navigator.userAgent;
var fAppVersion = parseFloat(navigator.appVersion);

function compareVersions(sVersion1, sVersion2) {

  var aVersion1 = sVersion1.split(".");
  var aVersion2 = sVersion2.split(".");
  
  if (aVersion1.length > aVersion2.length) {
    for (var i=0; i < aVersion1.length - aVersion2.length; i++) {
      aVersion2.push("0");
    }
  } else if (aVersion1.length < aVersion2.length) {
    for (var i=0; i < aVersion2.length - aVersion1.length; i++) {
      aVersion1.push("0");
    }  
  }
  
  for (var i=0; i < aVersion1.length; i++) {
 
    if (aVersion1[i] < aVersion2[i]) {
      return -1;
    } else if (aVersion1[i] > aVersion2[i]) {
      return 1;
    }  
  }
  
  return 0;

}

var isOpera = sUserAgent.indexOf("Opera") > -1;
var isMinOpera4 = isMinOpera5 = isMinOpera6 = isMinOpera7 = isMinOpera7_5 = false;

if (isOpera) {
  var fOperaVersion;
  if(navigator.appName == "Opera") {
    fOperaVersion = fAppVersion;
  } else {
    var reOperaVersion = new RegExp("Opera (//d+//.//d+)");
    reOperaVersion.test(sUserAgent);
    fOperaVersion = parseFloat(RegExp["$1"]);
  }

  isMinOpera4 = fOperaVersion >= 4;
  isMinOpera5 = fOperaVersion >= 5;
  isMinOpera6 = fOperaVersion >= 6;
  isMinOpera7 = fOperaVersion >= 7;
  isMinOpera7_5 = fOperaVersion >= 7.5;
}

var isKHTML = sUserAgent.indexOf("KHTML") > -1 
       || sUserAgent.indexOf("Konqueror") > -1 
       || sUserAgent.indexOf("AppleWebKit") > -1; 
       
var isMinSafari1 = isMinSafari1_2 = false;
var isMinKonq2_2 = isMinKonq3 = isMinKonq3_1 = isMinKonq3_2 = false;

if (isKHTML) {
  isSafari = sUserAgent.indexOf("AppleWebKit") > -1;
  isKonq = sUserAgent.indexOf("Konqueror") > -1;

  if (isSafari) {
    var reAppleWebKit = new RegExp("AppleWebKit///(//d+(?://.//d*)?)");
    reAppleWebKit.test(sUserAgent);
    var fAppleWebKitVersion = parseFloat(RegExp["$1"]);

    isMinSafari1 = fAppleWebKitVersion >= 85;
    isMinSafari1_2 = fAppleWebKitVersion >= 124;
  } else if (isKonq) {

    var reKonq = new RegExp("Konqueror///(//d+(?://.//d+(?://.//d)?)?)");
    reKonq.test(sUserAgent);
    isMinKonq2_2 = compareVersions(RegExp["$1"], "2.2") >= 0;
    isMinKonq3 = compareVersions(RegExp["$1"], "3.0") >= 0;
    isMinKonq3_1 = compareVersions(RegExp["$1"], "3.1") >= 0;
    isMinKonq3_2 = compareVersions(RegExp["$1"], "3.2") >= 0;
  } 
  
}

var isIE = sUserAgent.indexOf("compatible") > -1 
      && sUserAgent.indexOf("MSIE") > -1
      && !isOpera;
      
var isMinIE4 = isMinIE5 = isMinIE5_5 = isMinIE6 = false;

if (isIE) {
  var reIE = new RegExp("MSIE (//d+//.//d+);");
  reIE.test(sUserAgent);
  var fIEVersion = parseFloat(RegExp["$1"]);

  isMinIE4 = fIEVersion >= 4;
  isMinIE5 = fIEVersion >= 5;
  isMinIE5_5 = fIEVersion >= 5.5;
  isMinIE6 = fIEVersion >= 6.0;
}

var isMoz = sUserAgent.indexOf("Gecko") > -1
      && !isKHTML;

var isMinMoz1 = sMinMoz1_4 = isMinMoz1_5 = false;

if (isMoz) {
  var reMoz = new RegExp("rv:(//d+//.//d+(?://.//d+)?)");
  reMoz.test(sUserAgent);
  isMinMoz1 = compareVersions(RegExp["$1"], "1.0") >= 0;
  isMinMoz1_4 = compareVersions(RegExp["$1"], "1.4") >= 0;
  isMinMoz1_5 = compareVersions(RegExp["$1"], "1.5") >= 0;
}

var isNS4 = !isIE && !isOpera && !isMoz && !isKHTML 
      && (sUserAgent.indexOf("Mozilla") == 0) 
      && (navigator.appName == "Netscape") 
      && (fAppVersion >= 4.0 && fAppVersion < 5.0);

var isMinNS4 = isMinNS4_5 = isMinNS4_7 = isMinNS4_8 = false;

if (isNS4) {
  isMinNS4 = true;
  isMinNS4_5 = fAppVersion >= 4.5;
  isMinNS4_7 = fAppVersion >= 4.7;
  isMinNS4_8 = fAppVersion >= 4.8;
}

var isWin = (navigator.platform == "Win32") || (navigator.platform == "Windows");
var isMac = (navigator.platform == "Mac68K") || (navigator.platform == "MacPPC") 
      || (navigator.platform == "Macintosh");

var isUnix = (navigator.platform == "X11") && !isWin && !isMac;

var isWin95 = isWin98 = isWinNT4 = isWin2K = isWinME = isWinXP = false;
var isMac68K = isMacPPC = false;
var isSunOS = isMinSunOS4 = isMinSunOS5 = isMinSunOS5_5 = false;

if (isWin) {
  isWin95 = sUserAgent.indexOf("Win95") > -1 
       || sUserAgent.indexOf("Windows 95") > -1;
  isWin98 = sUserAgent.indexOf("Win98") > -1 
       || sUserAgent.indexOf("Windows 98") > -1;
  isWinME = sUserAgent.indexOf("Win 9x 4.90") > -1 
       || sUserAgent.indexOf("Windows ME") > -1;
  isWin2K = sUserAgent.indexOf("Windows NT 5.0") > -1 
       || sUserAgent.indexOf("Windows 2000") > -1;
  isWinXP = sUserAgent.indexOf("Windows NT 5.1") > -1 
       || sUserAgent.indexOf("Windows XP") > -1;
  isWinNT4 = sUserAgent.indexOf("WinNT") > -1 
       || sUserAgent.indexOf("Windows NT") > -1 
       || sUserAgent.indexOf("WinNT4.0") > -1 
       || sUserAgent.indexOf("Windows NT 4.0") > -1 
       && (!isWinME && !isWin2K && !isWinXP);
} 

if (isMac) {
  isMac68K = sUserAgent.indexOf("Mac_68000") > -1 
        || sUserAgent.indexOf("68K") > -1;
  isMacPPC = sUserAgent.indexOf("Mac_PowerPC") > -1 
        || sUserAgent.indexOf("PPC") > -1; 
}

if (isUnix) {
  isSunOS = sUserAgent.indexOf("SunOS") > -1;

  if (isSunOS) {
    var reSunOS = new RegExp("SunOS (//d+//.//d+(?://.//d+)?)");
    reSunOS.test(sUserAgent);
    isMinSunOS4 = compareVersions(RegExp["$1"], "4.0") >= 0;
    isMinSunOS5 = compareVersions(RegExp["$1"], "5.0") >= 0;
    isMinSunOS5_5 = compareVersions(RegExp["$1"], "5.5") >= 0;
  }
}

以上就是js事件处理,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jquery怎样实现ajax联动框(二)
Mar 08 Javascript
深入理解JavaScript系列(17):面向对象编程之概论详细介绍
Mar 04 Javascript
javascript遇到html5的一些表单属性
Jul 05 Javascript
JS实现的3D拖拽翻页效果代码
Oct 31 Javascript
在JavaScript中模拟类(class)及类的继承关系
May 20 Javascript
利用jQuery实现CheckBox全选/全不选/反选的简单代码
May 31 Javascript
微信小程序获取用户openId的实现方法
May 23 Javascript
node.js操作mysql简单实例
May 25 Javascript
浅谈Vue初学之props的驼峰命名
Jul 19 Javascript
Angular刷新当前页面的实现方法
Nov 21 Javascript
在SSM框架下用laypage和ajax实现分页和数据交互的方法
Sep 27 Javascript
JavaScript实现PC端横向轮播图
Feb 07 Javascript
jQuery基础知识点总结(必看)
May 31 #Javascript
浅谈JavaScript中小数和大整数的精度丢失
May 31 #Javascript
javascript小数精度丢失的完美解决方法
May 31 #Javascript
javascript解决小数的加减乘除精度丢失的方案
May 31 #Javascript
javascript基本语法
May 31 #Javascript
jquery 无限极下拉菜单的简单实例(精简浓缩版)
May 31 #Javascript
通用无限极下拉菜单的实现代码
May 31 #Javascript
You might like
php获取当月最后一天函数分享
2015/02/02 PHP
以实例全面讲解PHP中多进程编程的相关函数的使用
2015/08/18 PHP
PHP实现路由映射到指定控制器
2016/08/13 PHP
PHP获取用户客户端真实IP的解决方案
2016/10/10 PHP
Mac系统下安装PHP Xdebug
2018/03/30 PHP
PDO::commit讲解
2019/01/27 PHP
laravel5.5添加echarts实现画图功能的方法
2019/10/09 PHP
dojo 之基础篇(三)之向服务器发送数据
2007/03/24 Javascript
javascript 读取XML数据,在页面中展现、编辑、保存的实现
2009/10/27 Javascript
JavaScript面向对象知识串结(读JavaScript高级程序设计(第三版))
2012/07/17 Javascript
jQuery JSON实现无刷新三级联动实例探讨
2013/05/28 Javascript
JavaScript判断浏览器对CSS3属性是否支持的多种方法
2016/11/13 Javascript
微信小程序的日期选择器的实例详解
2017/09/29 Javascript
深入理解Vue.js轻量高效的前端组件化方案
2018/12/10 Javascript
vue项目中极验验证的使用代码示例
2019/12/03 Javascript
请求时token过期自动刷新token操作
2020/09/11 Javascript
用python实现的可以拷贝或剪切一个文件列表中的所有文件
2009/04/30 Python
python使用reportlab画图示例(含中文汉字)
2013/12/03 Python
Python中的FTP通信模块ftplib的用法整理
2016/07/08 Python
Python模拟用户登录验证
2017/09/11 Python
python 按照固定长度分割字符串的方法小结
2018/04/30 Python
Scrapy框架使用的基本知识
2018/10/21 Python
Python unittest 简单实现参数化的方法
2018/11/30 Python
Django REST framework视图的用法
2019/01/16 Python
浅析PyTorch中nn.Linear的使用
2019/08/18 Python
解决windows下python3使用multiprocessing.Pool出现的问题
2020/04/08 Python
Python数据正态性检验实现过程
2020/04/18 Python
城野医生官方海外旗舰店:风靡亚洲毛孔收敛水
2018/04/26 全球购物
巴西化妆品商店:Lojas Rede
2019/07/26 全球购物
人力资源主管的岗位职责
2014/03/15 职场文书
销售员岗位职责
2014/06/09 职场文书
志愿者宣传口号
2014/06/17 职场文书
2014年店长工作总结
2014/11/17 职场文书
2015年全国保险公众宣传日活动方案
2015/05/06 职场文书
Python使用OpenCV和K-Means聚类对毕业照进行图像分割
2021/06/11 Python
为什么MySQL选择Repeatable Read作为默认隔离级别
2021/07/26 MySQL