资讯专栏INFORMATION COLUMN

javaScriptDOM事件学习

张利勇 / 729人阅读

摘要:不加入布尔值的原因是只支持事件冒泡跨浏览器解决添加事件移除事件获取事件对象阻止事件冒泡阻止事件默认行为事件对象在触发上的事件都会产生一个对象。

什么是事件

事件流——描述的是从页面中接受事件的顺序。
事件冒泡:由具体的元素接收逐级传递到最不具体的那一个节点。
事件捕获:由不太具体的节点应该更早接收到事件,而最具体的节点最后接收到事件

使用事件处理程序

html事件处理程序。缺点:html代码和js代码紧密耦合。

DOM0级事件处理程序。

DOM2级事件处理程序。

DOM2级事件处理程序定义了两个方法:用于处理指定和删除事件处理程序。
addEventListener()和removeEventListener()

接收三个参数:要处理的事件名,作为事件处理程序的函数和布尔值

//btn3.addEventListener("click",message,false);  

IE事件处理程序

attachEvent()添加事件, detachEvent()删除事件
接收相同的两个参数:事件处理程序的名称和时间处理程序的函数。不加入布尔值的原因是IE8只支持事件冒泡

跨浏览器解决

var eventUtil = {
            //添加事件
            addHandler:function(element, type, handler){
                if(element.addEventListener){
                    element.addEventListener(type,handler,false);
                }
                else if(element.attachEvent){
                    element.attachEvent("on"+type,handler);
                }
                else{
                    element["on"+type] = handler;
                }
            },
            //移除事件
            removeHandler:function(element, type, handler){
                if(element.removeEventListener){
                    element.removeEventListener(type,handler,false);
                }
                else if(element.detachEvent){
                    element.detachEvent("on"+type,handler);
                }
                else{
                    element["on"+type] = handler;
                }
            }
            //获取事件对象
            getEvent:function(event){
                return event?event:window.event;
            },
            getType:function(event){
                return event.type;
            },
            getTarget:function(event){
                if(event.target){
                    return event.target;
                }
                else{
                    return event.srcElement;
                }
            },
            //阻止事件冒泡
            getStopPropagetion:function(event){
                if(event.stopPropagation){
                    return event.stopPropagation();
                }
                else{
                    return event.cancelBubble=true;
                }
            },
            //阻止事件默认行为
            getPreventDefault:function(event){
                if(event.preventDefault){
                    return event.preventDefault();
                }
                else{
                    return event.returnValue=false;
                }
            }
        }
        eventUtil.addHandler(btn3,"click", message);
        eventUtil.removeHandler(btn3,"click", message);   
事件对象

在触发DOM上的事件都会产生一个对象。
事件对象event

DOM中的事件对象。

(1)type属性,获取事件类型。event.type
(2)target属性,获取事件目标。
(3)stopPropagation()方法,用于阻止事件冒泡。
(4)preventDefault()方法,阻止事件的默认行为。

2.IE中的事件对象

(1)type属性,获取事件对象
(2)srcElement属性,获取事件对象
(3)cancelBubble=true方法,用于阻止事件冒泡
(4)returnValue=false ,阻止事件的默认行为。

事件类型

鼠标事件
MouseEvent对象

属性 //鼠标事件发生时,鼠标的位置
    -clientX,clientY //和页面的距离
    -screntX,screntY //和屏幕的距离
    -ctrlKey,shiftKey,altKey,metaKey //当事件触发是,键盘是按下的,则为true
    -button(0,1,2) 

触发顺序


//一个窗口拖动的例子
//封装一个获取元素的方法,防止出现IE不兼容等问题
function getByClass(clsName,parent){
    var oParent = parent? document.getElementById(parent):document,
    eles = [],
    elements = oParent.getElementsByTagName("*");

    for(var i = 0, l = elements.length; i < l; i++){
        if(elements[i].className == clsName){
            eles.push(elements[i]);
        }
    }
    return eles;
}

window.onload = drag;


//在标题区按下
function drag(){
    var oTitile = getByClass("login_logo_webqq","loginPanel")[0];
    //移动
    oTitile.onmousedown = fnDown;
    //关闭窗口
    var oClose = document.getElementById("ui_boxyClose");
    oClose.onclick = function(){
        document.getElementById("loginPanel").style.display="none";
    }

}

//在页面中移动
//释放鼠标时停止移动
function fnDown(){
    var oDrag =  document.getElementById("loginPanel");

    document.onmousemove = function(event){
        event = event || window.event;//浏览器兼容
        oDrag.style.left = event.clientX + "px";
        oDrag.style.top = event.clientY + "px";
    }
    //释放鼠标
    document.onmouseup = function(){
        document.onmousemove = null;
        document.onmouseup - null;
    }

}

键盘事件

事件代理

事件代理在JS世界中一个非常有用也很有趣的功能。当我们需要对很多元素添加事件的时候,可以通过将事件添加到它们的父节点而将事件委托给父节点来触发处理函数。这主要得益于浏览器的事件冒泡机制

例子
//html
  • item1
  • item2
  • item3
  • item4
//js window.onload=function(){ var ulNode=document.getElementById("list"); ulNode.addEventListener("click",function(e){ if(e.target&&e.target.nodeName.toUpperCase()=="LI"){/*判断目标事件是否为li*/ alert(e.target.innerHTML); } },false); }

为父节点添加一个click事件,当子节点被点击的时候,click事件会从子节点开始向上冒泡。父节点捕获到事件之后,通过判断e.target.nodeName来判断是否为我们需要处理的节点。并且通过e.target拿到了被点击的Li节点。从而可以获取到相应的信息,并作处理

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/80686.html

相关文章

  • 前端技术 博客文章、书籍 积累

    摘要:好多编辑器例如等都支持这样的语法来快速的编写代码如何优雅地使用把标签放在结束标签之后结束标签之前的差别什么是响应式设计怎样进行 书籍 《JavaScriptDOM编程艺术》《JavaScript高级程序设计》《JavaScript框架设计》《JavaScript专家编程》《JavaScript Ninjia》《JavaScript语言精粹(修订版)》《JavaScript设计模式》《J...

    LiangJ 评论0 收藏0
  • 前端技术 博客文章、书籍 积累

    摘要:好多编辑器例如等都支持这样的语法来快速的编写代码如何优雅地使用把标签放在结束标签之后结束标签之前的差别什么是响应式设计怎样进行 书籍 《JavaScriptDOM编程艺术》《JavaScript高级程序设计》《JavaScript框架设计》《JavaScript专家编程》《JavaScript Ninjia》《JavaScript语言精粹(修订版)》《JavaScript设计模式》《J...

    codercao 评论0 收藏0
  • 前端技术 博客文章、书籍 积累

    摘要:好多编辑器例如等都支持这样的语法来快速的编写代码如何优雅地使用把标签放在结束标签之后结束标签之前的差别什么是响应式设计怎样进行 书籍 《JavaScriptDOM编程艺术》《JavaScript高级程序设计》《JavaScript框架设计》《JavaScript专家编程》《JavaScript Ninjia》《JavaScript语言精粹(修订版)》《JavaScript设计模式》《J...

    huayeluoliuhen 评论0 收藏0
  • JavaScript学习总结(九)事件详解

    摘要:布尔值表示捕获阶段调用事件处理程序,表示冒泡阶段通过对象的方法,也可以定义事件的回调函数。对象会被作为第一个参数传递给事件监听的回调函数。布尔默认值是,当设置成时用以取消事件的默认行为与中的相同。 其实这篇文章挺早之前就写了,但是由于sf保存方面的bug,所以当时写了一大堆,结果没保存,觉得这个没写完是个不小的遗憾,今天正好有空,就给补充下了,也正好给我的javascript学习总结做...

    LiveVideoStack 评论0 收藏0
  • AI遇见SIEM,白山ATD革新企业安全大脑

    摘要:然而在中国,还处于比较初级的阶段,很多企业对自身安全问题并没有系统性的管理。年整个中国市场只有亿人民币的规模,这个数字相比中国经济对全球经济的占比是不相符的。 showImg(https://segmentfault.com/img/bV9xRN?w=865&h=950);作者简介: 丛磊,白山合伙人兼工程副总裁2016年加入白山,主要负责云聚合产品的研发管理和云链产品体系构建等。20...

    gself 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<