JavaScript之事件处理程序

一.原生JavaScript事件处理程序

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <script src="EvenUtil.js" charset="UTF-8"></script>
    <script src="demo1.js" charset="UTF-8"></script>
    <!--<script src="eventDemo.js" charset="UTF-8"></script>-->
    <title>example</title>
</head>
<body>
    <button id="myBtn">Click</button>
    <a href="http://www.baidu.com" title="跳转到百度" target="_blank" name="baiduLink">点我链接到百度首页</a>
    <!-- 不添加http://的话,默认会在当前domain下查找该资源文件-->
    <!--<a href="www.baidu.com" title="跳转到百度">点我链接到百度首页</a>-->
    <input type="button" value="Echo Username" name="Echo Username">
</body>
</html>

 

    //DOM 0级指定的事件处理程序,被认为是元素的方法(在元素的作用域中运行,即this引用当前元素)
    document.getElementsByName("Echo Username")[0].onclick = function () {
        alert(this.value);
    }
    document.getElementsByName("Echo Username")[0].onclick = null;//删除绑定事件

    //Dom 2级事件处理程序,可以实现添加多个点击事件现,第三个参数若为true:捕获阶段调用事件处理程序,false:冒泡阶段调用事件处理程序
    var Btn = document.getElementById("myBtn");
    Btn.addEventListener("click",function(){
        alert(this.id);
    },false);
    Btn.addEventListener("click",function(){
        alert("My id is Btn!");
    },false);
    //删除绑定事件要使用removeEventListener,并传入要移除的事件处理函数引用,所以这会导致匿名函数无法移除!
    //removeEventListener("click",handler,false);

二.兼容性问题

    //兼容性问题:IE的实现方式为:attachEvent和detachEvent,attachEvent("onclick",handler)/detachEvent("onclick",handler)
    //而且IE更丧心病狂的是,事件处理函数在全局作用域中运行,即this == window
    var Btn = document.getElementById("myBtn");
    Btn.attachEvent("onclick",function(){
        $this = Btn;
        alert($this.id);//myBtn
        alert(this.id);//undefined
    });

三.封装对象解决该兼容性问题

var EvenUtil = {
    addHandler:function(element,evenType,handler){
        if(element.addEventListener){
            element.addEventListener(evenType,handler,false);
        }else if(element.attachEvent){
            element.attachEvent("on"+evenType,handler);
        }else{
            element["on"+evenType]=handler;
        }
    },
    removeHandler:function(element,evenType,handler){
        if(element.removeEventListener){
            element.removeEventListener(evenType,handler,false);
        }else if(element.detachEvent){
            element.detachEvent("on"+evenType,handler);
        }else{
            element["on"+evenType]=null;
        }
    }

}

四.事件对象

常用的事件对象的属性/方法:

    //事件对象的currentTarget、target属性
    var Btn = document.getElementById("myBtn");
    EvenUtil.addHandler(document.body,"click",function(event){
        console.log(this == document.body);
        console.log(event.currentTarget == this);//currentTarget指代程序当前正在处理事件的那个元素.必定等同于this
        console.log("target is Btn ? "+(event.target == Btn));//target指代你点击的那个元素.当你点击Btn时,该属性就是Btn
    });

    //事件对象的type属性
    var handler = function(event){
        switch (event.type){
            case "click" :
                alert("click");
                break;
            case "mouseover" :
                event.target.style.backgroundColor = "red";
                break;
            case "mouseout" :
                event.target.style.backgroundColor = "";
                break;
        }
    };
    EvenUtil.addHandler(Btn,"click",handler);
    EvenUtil.addHandler(Btn,"mouseover",handler);
    EvenUtil.addHandler(Btn,"mouseout",handler);
};

 

    //事件对象的stopPropagation方法:阻止冒泡
    var bubbleDemo = (function(element){
        document.body.onclick = function(){
            alert("body click!");
        }
        element.onclick = function(){
            alert(element.id+" click!");
        }
        return {
            stopClickBubble:function(){
                EvenUtil.addHandler(element,"click",function(event){
                    alert("Is can use stopProgatation ? "+event.bubbles)
                    if(event.bubbles){
                        event.stopPropagation();
                    }
                });
            }
        };
    })(document.getElementById("myBtn"));

    //阻止myBtn的onclick事件冒泡
    bubbleDemo.stopClickBubble();

 

    //事件对象的preventDefault方法:阻止默认元素默认行为
    var baiduLink = document.getElementsByName("baiduLink")[0];
    var defaultDemo = (function(element){
        element.onclick = function(){
            alert("hello baidu?");
        }
        return{
            stopDefaultAction:function(){
                EvenUtil.addHandler(element,"click",function(event){
                    if(event.cancelable){
                        event.preventDefault();
                    }
                });
            }
        }
    })(baiduLink);

    //阻止默认行为:不让其进行百度搜索首页的跳转
    defaultDemo.stopDefaultAction();
时间: 2024-11-08 22:38:33

JavaScript之事件处理程序的相关文章

[转]javascript指定事件处理程序包括三种方式:

javascript指定事件处理程序包括三种方式: (1):DOM0级事件处理程序 如: 代码如下: var btn=document.getElementById("mybtn"); //取得该按钮的引用 btn.onclick=function(){ alert('clicked'); alert(this.id); // mybtn 以这种方式添加的事件处理程序会在事件流的冒泡阶段被处理. 删除DOM0级方法指定的事件处理程序: btn.onclick=null; // 删除事件

跨浏览器的事件处理程序——事件处理程序、事件对象差异

为了以跨浏览器的方式处理事件,不少开发人员会使用能够隔离浏览器差异的javascript库,本文从事件处理程序.事件对象差异出发,演示开发最适合的事件处理方法 基本名词解析: 事件 用户或浏览器自身执行的某种动作 事件流 从页面中接收事件的顺序,,IE的事件流指的是事件冒泡流,而Netscape Communicator的事件流是事件捕获流 事件冒泡 事件开始时由最具体的元素(文档中嵌套层次最深的那个节点)接收,然后逐级向上传播到较为不具体的节点(文档) 事件捕获 不太具体的节点应该更早接收到事

js事件流、事件处理程序/事件侦听器

1.事件流 事件冒泡 IE的事件流叫做事件冒泡(event bubbling),即事件开始时由最具体的元素(文档中嵌套层次最深的那个节点)接收,然后逐级向上传播到较为不具体的节点(文档). 事件捕获 事件捕获的思想是不太具体的节点应该更早的接收到事件,而最具体的节点应该在最后接收到节点.事件捕获的用意在于事件到达预定目标之前捕获它. DOM事件流 “DOM2级事件流”规定的事件流包括三个阶段:事件捕获阶段.处于目标阶段和冒泡阶段.首先发生的是事件捕获,为截获事件提供了机会.然后是实际的目标接收到

深入理解DOM事件机制系列第二篇——事件处理程序

× 目录 [1]HTML [2]DOM0级 [3]DOM2级[4]IE[5]总结 前面的话 事件处理程序又叫事件侦听器,实际上就是事件的绑定函数.事件发生时会执行函数中相应代码.事件处理程序有HTML事件处理程序.DOM0级事件处理程序.DOM2级事件处理程序和IE事件处理程序四类,下面将详细介绍该部分内容 HTML事件处理程序 某个元素支持的每种事件,都可以使用一个与相应事件处理程序同名的HTML特性来指定.这个特性的值应该是能够执行的JavaScript代码 在事件处理程序函数内部,this

js学习笔记:事件——事件流、事件处理程序、事件对象

Javascript与HTML之间的交互是通过事件实现的. 事件,就是文档或浏览器窗口中发生的一些特定的交互瞬间. 可以使用侦听器来预定事件,以便事件发生时执行相应代码. 事件流 事件流描述的是从页面中接受事件的顺序. 事件冒泡 IE的事件流叫做事件冒泡,即事件开始是由最具体的元素接收,然后逐级向上传播到较为不具体的节点(文档). 如果点击了页面中的一个div元素,那么这个click事件可能会按照如下顺序传播: < div> < body> < html> docume

js事件处理程序学习与总结

(1)html事件处理程序,使用一个与相应事件处理程序同名的HTML特性来指定,可以定义事件处理程序是可以包含要执行的具体动作,也可以调用页面其他地方定义的脚本函数,但这种方法就是把javascript与html混写,一般开发,不建议使用,比如: <input type="button" value="提交" onsumit="alert(提交了?)"> (2)javascript指定事件处理程序 这种方法,必须先取得一个操作对象的引

JavaScript系列----事件机制

1.事件流 1.1.标准事件流 所谓的标准事件流指的的:EMCAScript标准规定事件流包含三个阶段,分别为事件捕获阶段,处于目标阶段,事件冒泡阶段. 下面是一段html代码,根据代码来说明标准事件流. <!DOCTYPE HTML> <html> <body> <div> <button>click</button> </div> </body> </html> 在上面的代码中,如果点击按钮bu

探究JavaScript中的五种事件处理程序

我们知道JavaScript与HTML之间的交互是通过事件实现的.事件最早是在IE3和Netscape Navigator 2中出现的,当时是作为分担服务器运算负载的一种手段. 通俗地理解,事件就是用户或浏览器自身执行的某种操作.而事件处理程序即为响应某个事件的函数.抽出主干,即事件处理程序为函数.  我们又把事件处理程序称为事件侦听器.  事件处理程序是以"on"开头的,因此对于事件on的时间处理程序即为onclick.时间处理程序在JavaScript中大致有五种,下面会根据这五种

JavaScript事件对象与事件处理程序

在学习之前建议请看一下事件流.事件冒泡.事件捕获 一.事件对象 事件对象:在DOM触发事件时,会产生一个事件对象event,这个事件对象包含着所有与事件相关的信息.既然event是事件对象,那么它必然存在属性 ①DOM中的事件对象event属性   (1).type属性用于获取事件类型   (2).target.srcElement<兼容IE事件>属性用于获取事件目标    (3).stopPropagation()方法 用于阻止事件冒泡   (4).preventDefault() 方法 阻