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

一:跨平台事件

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

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

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

DOM属性和方法 IE属性和方法
charcode keycode
preventDefault returnValue=false
relatedTarget fromobj|toobj
stopPropation cancelBuble=true
target srcobj
   

我们用一个小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区别

  DOM IE
获取目标 event.target event.srcElement
获取字符代码 event.charCode event.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;
}
时间: 2024-10-25 04:04:23

js中容易被忽视的事件问题总结的相关文章

js事件、Js中的for循环和事件的关系、this

一.js事件  1.事件 用户在网页中所触发的行为 鼠标滑动种类很多,键盘.表单特列: 点击:onclick 鼠标进入:onmouseenter 鼠标离开:onmouseleave 鼠标悬浮:onmouseover  鼠标移除:onmouseout 鼠标按下:onmousedown 鼠标抬起:onmouseup 鼠标移动:onmousemove 表单聚焦:onfocus 表单失去焦点:onblur 浏览器加载完成:onload js事件是一直存在的,可以绑定方法,也可以不绑定,如果没有绑定,事件

JS中的DOM操作和事件

[DOM树节点] DOM节点分为三大类: 元素节点. 属性节点. 文本节点: 文本节点.属性节点属于元素节点的子节点.操作时,均需要先取到元素节点,再操作子节点: 可以使用getElement系列方法,取到元素节点. [查看元素节点] 1.getElementById:通过id取到唯一节点.如果ID重名,只能取到第一个. getElementsByName(): 通过name属性   getElementsByTagName(): 通过标签名   getElementsByClassName()

js中如何实现滚屏事件

在前端工作中使用JS来实现整屏的上下滚动,下面是JS代码: /**** * 函数:判断滚轮滚动方向 * 参数:event *返回: 方向 上 还是下 ***/ var i =0; var $screen = $("#jq_banner"); var len = $("#jq_banner ul li").length-1; var _h; _h = $screen.height(); var init =function init(){ _h = $screen.h

JS中BOM的加载事件

BOM--->Browser Object Model 浏览器对象模型,操作浏览器的. 浏览器中有个顶级对象:window 页面中顶级对象:document 页面中所有的内容都是属于浏览器的,页面中的内容也都是window的,变量是window的 要使用变量或者方法时候,window可以省略 因为页面中的所有内容都是window的,window是可以省略的. 加载事件 window.onload---只要页面加载完毕,这个事件就会触发 window.onunload--页面关闭后才触发的事件 w

js中阻止冒泡与默认事件

在一些情况下,我们必须阻止冒泡,或者是要阻止浏览器的默认事件,方便操作,简单代码如下: 阻止冒泡: function stopBubble(ev) { if(ev&&ev.stopPropagation);//非IE下,DOM2 { e.stopPropagation(); } else { window.event.cancelBubble=true;//IE下 } } 阻止默认事件: function stopDefault(ev) { if(ev&&ev.preven

笔记-[6]-js中事件绑定方法的总结

js中的两种对象事件绑定方法: 1:常用的如:div.onclick=function(){...}; 2:通过系统方法绑定事件: 非IE:addEventListener('事件名[不加on]',function(){},false[或者true]) IE:attachEvent('事件名[加on]',function(){}); 通过系统方法绑定事件可以让对象可以绑定相同的事件并且执行不同的操作,如果使用第一种方法绑定多个相同的事件,最后一个事件会覆盖前面所有的事件. 在addEventLi

js中的事件,内置对象,正则表达式

[JS中的事件分类] 1.鼠标事件: click/dbclick/mouseover/mouseout/mousemove/mousedown/mouseup 2.键盘事件: keydown: 键盘按下去触发 keypress: 键盘按下并松开的瞬间触发 keyup: 键盘抬起时触发 [注意事项:(了解)] ① 执行顺序: keydown--keypress--keyup ② 长按时,会循环不断的执行keydown-keypress ③ 有keydown事件,不一定有keyup事件(事件触发过程

js中事件(自定义事件)

今天闲的蛋疼,我们来聊一聊web前端中的事件机制和自定义事件.灵感来自jQuery,在此感谢jQuery作者. 首先,最开始. <button id="button" type="button" onclick="alert('hello')">你好</button> 这是我们在使用html写页面的时候最原生的事件触发方式.上面那行代码会生成一个按钮,当我们点击这个按钮的时候就会弹出一个原生的弹窗,内容是hello. 随着

js中的事件:

事件驱动: 1.事件:js捕获用户的操作或页面中的一些行为 2.事件源:触发事件的对象 鼠标事件: onclick ondblclick onmousedown onmouseup onmousemove onmouseover onmouseout 页面事件,撤销加载: onbeforeunload 添加,删除事件具有兼容性: 在IE中: 添加: obj.attachEvent("on事件","处理程序") 删除: obj.detachEvent("on