当前位置: 首页 > news >正文

js中容易被忽视的事件问题总结

一:跨平台事件

  什么叫跨平台事件?即在不同的浏览器上执行同一事件,所使用的方法不同。

  什么是EventUtil对象?有什么作用?即将所有与事件相关的函数,融合在一起的一个容器,方便管理事件对象,它没有属性。主要处理DOM事件和IE事件的磨合,使其尽可能的相似。

  下面我们来看一下DOM和IE之间的对象属性和方法做个对比(这里只指出两者之间不同的属性和方法),主要有以下五大点:

DOM属性和方法IE属性和方法
charcodekeycode
preventDefaultreturnValue=false
relatedTargetfromobj|toobj
stopPropationcancelBuble=true
targetsrcobj
  

 我们用一个小demo看一下,能够很好的解决事件跨平台的兼容问题:

<html>
<head>
    <title>eventUtil</title>
    <script eventType="text/javascript">
        var eventUtil = {
//监听事件 addListener:
function(obj, eventType, fn) { if (obj.addEventListener) { obj.addEventListener(eventType, fn, false); } else if (obj.attachEvent) { obj.attachEvent('on' + eventType, fn); } else { obj['on' + eventType] = fn; } }, //返回event对象 getEvent: function(event) { return event || window.event; //return event ? event : window.event; }, //返回目标事件对象 getTarget: function(event) { return event.target || event.srcobj; }, preventDefault: function(event) { if (event.preventDefault) { event.preventDefault(); } else { event.returnValue = false; } }, removeListener: function(obj, eventType, fn) { if (obj.removeEventListener) { obj.removeEventListener(eventType, fn, false); } else if (obj.deattachEvent) { obj.detachEvent(eventType, fn); } else { obj['on' + eventType] = null; } }, stopPropagation: function(event) { if (event.stopPropagation) { event.stopPropagation(); } else { event.cancelBubble = true; } } }; </script> </head> <body> <input eventType="button" value="click me" id="btn" /> <p>event</p> <a>Hello word!</a> <script eventType="text/javascript"> function addBtnListen(event) { var event = eventUtil.getEvent(event); var target = eventUtil.getTarget(event); alert("my name is kock"); alert(event.eventType); alert(target); eventUtil.stopPropagation(event); } function getBodyListen(event) { alert("click body"); } function getLinkListen(event) { alert("prevent default event"); var event = eventUtil.getEvent(event); eventUtil.preventDefault(event); } window.onload=function() { var btn = document.getobjById("btn"); var link = document.getobjsByTagName("a")[0]; eventUtil.addListener(btn, "click", addBtnListen); eventUtil.addListener(document.body, "click", getBodyListen); eventUtil.addListener(link, "click",getLinkListen); } </script> </body> </html>

     上面的方法能够解决事件跨平台问题,接下来,我们看下charCode的属性。

     首先给eventUtil定义一个新方法,formatEvent,接受一个参数,即Event对象。

eventUtil.formatEvent=function(event)
{
if(isIE&&isWin)---检测浏览器的问题,如有不清楚,见我上篇文章:http://www.cnblogs.com/jtjds/p/5461152.html
{
event.charCode=(event.type=="keypress")?event.keycode:0;
event.eventphase=2;--表示冒泡阶段,IE仅支持冒泡阶段
}
return event;
}

 二:关于冒泡中的target和currentTarget

      target在事件流的目标阶段;currentTarget在事件流的捕获,目标及冒泡阶段。只有当事件流处在目标阶段的时候,两个的指向才是一样的, 而当处于捕获和冒泡阶段的时候,target指向被单击的对象而currentTarget指向当前事件的父级。

<div id="outer" style="background:#099">  
           <p>我是目标div</p>   ----点击这部分,输出:e.target.tagName : P || e.currentTarget.tagName : DIV
           <p id="inner" style="background:#9C0">我是目标p</p> ----点击这部分,输出:e.target.tagName : P || e.currentTarget.tagName : DIV

<br> ----点击这部分,输出:e.target.tagName : DIV || e.currentTarget.tagName : DIV

</div>

//看下第二个变列:
<div id="outer" style="background:#099"> <div>我是目标div</div> ----点击这部分,输出:e.target.tagName : DIV || e.currentTarget.tagName : DIV
 
  
           <p id="inner" style="background:#9C0">我是目标p</p> ----点击这部分,输出:e.target.tagName : P || e.currentTarget.tagName : DIV

<br> ----点击这部分,输出:e.target.tagName : DIV || e.currentTarget.tagName : DIV

</div>
function  getObj(id)
{  
   return document.getElementById(id);      
}  
function addEvent(obj, event, fn)
{  
   if(window.attachEvent)
   {  
      obj.attachEvent("on" + event, fn);  
   }
   else if(window.addEventListener)
   {   
      obj.addEventListener(event, fn, false);  
   }  
}  
function test(e)
{  
    alert("e.target.tagName : " + e.target.tagName + "\n e.currentTarget.tagName : " + e.currentTarget.tagName);  
 }  
     var outer = getObj("outer");  
     var inner = getObj("inner");  
     //addEvent(inner, "click", test);  
     addEvent(outer, "click", test);  

 三:IE和DOM区别

 DOMIE
获取目标event.targetevent.srcElement
获取字符代码event.charCodeevent.keyCode
阻止默认行为event.prevetDefault()event.returnvalue=false
冒泡event.stopPropagation()event.cancelBubble=true

 关于阻止默认行为,比如,当用户右击鼠标时,如果你不想菜单弹出,则可以使用阻止默认行为:

document.body.oncontextmenu=function(event)
{
if(isIE)
{
var oEvent=window.event;
oEvent.returnValue=false; //也可以直接是return false;阻止默认行为
}
else
{
oEvent.preventDefault();
}
}

 四:鼠标事件

 

<p>use your mouse to click and double click the red square</p>
<div style="width:100px;height:100px;background:red"
        onmouseover="handleEvent(event)"
        onmouseout="handleEvent(event)"
        onmousedown="handleEvent(event)"  
        onmouseup="handleEvent(event)"   
        onclick="handleEvent(event)"  
        ondblclick="handleEvent(event)" id="div1"
     >             
</div>
<p><textarea id="txt1" rows="5" cols="45"></textarea></p>
<!--检测键盘事件-->
<p><input type="text" id="textbox" 
           onkeydown="handle(event)"
           onkeypress="handle(event)"
           onkeyup="handle(event)"
          ></p>
<p><textarea id="txt2" rows="10" cols="45"></textarea></p>

 

js文件如下:

function handleEvent(event)
{
    var oText=document.getElementById('txt1');
    oText.value+= "\n"+event.type;
    oText.value+= "\n target is "+(event.srcElement||event.target).id;
    oText.value+="\n at ("+event.clientX+","+event.clientY+")in the client";
    oText.value+="\n at ("+event.screenX+","+event.screenY+")in the client";
    oText.value+="\n button down is"+event.button;
    var arrKeys=[];
    oText.value+="\n relatedTarget is"+event.relatedTarget.tagName;
    //event.relatedTarget.tagName可以判断鼠标的来源和出处
}
function handle(event)
{
   var oText2=document.getElementById('txt2');
   oText2.value+="\n"+event.type;
   var arrKeys=[];
  if(event.shiftKey){arrKeys.push("Shift");}
  if(event.ctrlKey){arrKeys.push("Ctrl");}
  if(event.altKey){arrKeys.push("Alt");}
   oText2.value+="\n keydown is  "+arrKeys;
}

 


 

 作者:向婷风

 出处:http://www.cnblogs.com/jtjds/p/5492375.html

 如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!欢迎各位转载,但是未经作者

本人同意 转载文章之后必须在 文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利。

 

 

 

 

  

 

转载于:https://www.cnblogs.com/jtjds/p/5492375.html

相关文章:

  • Web Service 接口安全与解决方案
  • B树、B-树、B+树、B*树的定义和区分
  • 史上最全大数据学习资源整理(1)
  • Hive操作表部分总结
  • 电邮欺诈需重视 TurboMail邮件系统保护您
  • IOS-利用AFNetworking监听网络状态
  • WCF学习之旅—WCF服务部署到应用程序(十)
  • 第三节课作业——指针
  • AngularJS 应用身份认证的技巧
  • UDP数据报
  • 实时预测用户对物品偏好 阿里云推荐引擎帮助你更好的提升业务
  • PHPer书单
  • 【译】使用newInstance()来实例化fragment
  • Android 2.3 r1 中文API (78)—— ViewAnimator
  • 构建之法阅读笔记06
  • 0x05 Python数据分析,Anaconda八斩刀
  • E-HPC支持多队列管理和自动伸缩
  • javascript 哈希表
  • python docx文档转html页面
  • weex踩坑之旅第一弹 ~ 搭建具有入口文件的weex脚手架
  • Zepto.js源码学习之二
  • 闭包--闭包之tab栏切换(四)
  • 彻底搞懂浏览器Event-loop
  • 大整数乘法-表格法
  • 聊聊flink的TableFactory
  • 你不可错过的前端面试题(一)
  • 如何在 Tornado 中实现 Middleware
  • 软件开发学习的5大技巧,你知道吗?
  • 十年未变!安全,谁之责?(下)
  • 使用Swoole加速Laravel(正式环境中)
  • 一个完整Java Web项目背后的密码
  • #我与Java虚拟机的故事#连载19:等我技术变强了,我会去看你的 ​
  • (2)(2.10) LTM telemetry
  • (2)关于RabbitMq 的 Topic Exchange 主题交换机
  • (4) openssl rsa/pkey(查看私钥、从私钥中提取公钥、查看公钥)
  • (Redis使用系列) SpringBoot中Redis的RedisConfig 二
  • (差分)胡桃爱原石
  • (分享)自己整理的一些简单awk实用语句
  • (四) 虚拟摄像头vivi体验
  • (四)docker:为mysql和java jar运行环境创建同一网络,容器互联
  • (转)GCC在C语言中内嵌汇编 asm __volatile__
  • (轉貼) 寄發紅帖基本原則(教育部禮儀司頒布) (雜項)
  • ... 是什么 ?... 有什么用处?
  • @DateTimeFormat 和 @JsonFormat 注解详解
  • [ C++ ] STL---string类的使用指南
  • []常用AT命令解释()
  • [2008][note]腔内级联拉曼发射的,二极管泵浦多频调Q laser——
  • [AHOI2009]中国象棋 DP,递推,组合数
  • [C# 网络编程系列]专题六:UDP编程
  • [CC-FNCS]Chef and Churu
  • [hadoop读书笔记] 第十五章 sqoop1.4.6小实验 - 将mysq数据导入HBASE
  • [HCTF 2018]WarmUp (代码审计)
  • [hdu 3746] Cyclic Nacklace [kmp]
  • [hive小技巧]同一份数据多种处理
  • [HTML]Web前端开发技术6(HTML5、CSS3、JavaScript )DIV与SPAN,盒模型,Overflow——喵喵画网页