指定事件处理程序的几种方式

通过指定事件处理程序可以侦听事件的发生并对其作出响应,已达到某种交互目的。那么指定事件处理程序的方式有哪些呢?

比如有以下代码:

<input id="btn" type="button" value="click me" />

要求为按钮指定一个单击事件处理程序,即单击按钮时输出相应信息。

1.HTML事件处理程序

某个元素支持的每种事件,都可以使用一个与相应事件处理程序同名的HTML特性来指定。特性的值可以是能够执行的js代码。

<input id="btn" value="click me" onclick="alert(‘clicked‘)" />

也可以调用在页面其他地方定义的脚本。

<script type="text/javascript">   function showMessage(){   alert("clicked"); } </script><input id="btn" value="click me" onclick="showMessage()" />

showMessage()这个函数可以向以上方式定义,也可以被包含在一个外部文件中。事件处理程序中的代码在执行时,有权访问全局作用域中的任何代码。

缺点:

  • 时差问题:因为需要触发事件处理程序时条件不具备。解决方法是将HTML事件处理程序封装在一个try-catch块中,以便错误不浮出水面。
<input type="button" value="click me" onclick="try{showMessage();}catch(ex){}"/>
  • 作用域链:由于不同浏览器的JavaScript引擎遵循的标识符解析规则裸游差异,可能会导致扩展事件处理程序的作用域链有不同结果。
  • HTML与JavaScript代码紧密耦合:如果想要更换事件处理程序,需要同时修改两个地方。

2.DOM0级事件处理程序

通过JavaScript指定处理程序的传统方式,将一个函数赋值给一个事件处理程序属性。每个元素(包括document和window)都有自己的事件处理程序属性,这些属性通常全部小写,如onclick。

var btn = document.getElementById("btn");
//指定事件处理程序
btn.onclick = function(){
   alert("Clicked");
};

//想要取消事件处理程序的话,只需将事件处理程序属性设为null即可
btn.onclick = null;

这种方式下指定的事件处理程序被认为是元素的方法,所以其作用域为元素的作用域。即程序中的this引用当前元素。如:

btn.onclick=function(){
  alert(this.id);//btn
}

另外以这种方式添加的事件处理程序会在事件流的冒泡阶段被处理

3.DOM2级事件处理程序

“DOM2级事件”定义了两个方法,用于处理指定和删除事件处理程序的操作:addEventListener()和removeEventListener()。所有的DOM节点都包含着两个方法,并且它们都接受三个参数:要处理的事件名、事件处理程序的函数和一个布尔值。其中布尔值为true表示在捕获阶段调用事件处理程序,为false表示在冒泡阶段调用事件处理程序。

//指定事件处理程序
btn.addEventListener("click",fucntion(){alert("clicked");},false);
//取消事件处理程序
btn.removeEventListener("click",function(){alert("clicked");},false);//无效
//指定和取消的参数必须完全相同才有效。而匿名函数是两个不同的函数,所以无效
//所以为了能够取消,最好函数采用命名函数
var handler = function(){
   alert("clicked");
};
//添加事件处理程序
btn.addEventListener("click",handler,false);
//取消事件处理程序
btn.removeEventListener("click",handler,false);//有效

作用域与DOM0级事件指定事件处理程序的作用域相同,也是元素的作用域。但与DOM0不同的是,DOM2可以指定多个事件处理程序
事件处理程序的触发顺序是按照添加事件处理程序的顺序来的。

支持DOM2级事件处理程序的浏览器有IE9+、Firefox、Safari、Chrome和Opera。

4.IE事件处理程序

IE实现了与DOM类似的两种方法:attachEvent()和detachEvent()。接受两个参数:事件处理程序名与事件处理程序函数。IE8-只支持事件冒泡,所以通过attachEvent()添加的事件处理程序被添加到事件冒泡阶段。

//添加事件处理程序
btn.attachEvent("onclick",handler);
//取消事件处理程序
btn.detachEvent("onclick",handler);
//取消参数必须与添加完全相同,所以事件处理程序函数(同DOM2级事件中的分析一样)不要是匿名函数。

IE事件处理程序与DOM事件处理程序的最大区别:DOM0/2级事件处理程序的作用域是元素作用域;而IE事件处理程序是全局作用域,即this等于widow。

IE也可以指定多个事件处理程序,我运行了相关代码发现:触发顺序同添加顺序(IE9);而《JavaScript高级程序设计》中说触发顺序应该同添加顺序相反。到底是哪个,暂时不清楚。。

支持IE事件处理程序的浏览器有IE和Opera。

5.跨浏览器的事件处理程序

        //跨浏览器的事件处理程序 恰当的使用能力检测即可实现
        //要保证事件的代码能在大多数浏览器下一致地运行,只需关注冒泡阶段
        //第一个要创建的方法是addHandler(),职责是视情况分别使用DOM0级方法、DOM2级方法
        //或IE方法来添加事件。这个方法属于一个名叫EventUtil的对象。
        //接受三个参数:要操作的元素、事件名称和事件处理程序函数
        //removeHandler() 也接受相同的参数。职责是移除之前添加的事件处理程序-无论该事件采取什么方式添加到元素中的,如果其他方法无效,默认采用DOM0级方法

        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] = null;
                }
            }

        };
        var handler = function(){
            alert("Clicked");
        };
        //指定
        EventUtil.addHandler(btn,"click",handler);
        //移除事件处理程序
        EventUtil.removeHandler(btn,"click",handler);

        //注意 以上的addHandler()和removeHandler()没有考虑到所有的浏览器问题,例如IE中的作用域问题
        //不过,使用它们添加和移除事件处理程序还是足够了。此外还要注意,DOM0级对每个事件支持一个事件处理程序。
        //好在,只支持DOM0级的浏览器已经没那么多了。
时间: 2024-08-23 23:02:37

指定事件处理程序的几种方式的相关文章

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

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

Javascript事件处理程序的3种方式

既然产生了事件,我们就要去处理它,据我了解Javascript事件处理程序主要有3种方式: 1.HTML事件处理程序 即我们直接在HTML代码中添加事件处理程序,如下面这段代码: <input id="btn1" value="按钮" type="button" onclick="showmsg();"> <script>    function showmsg(){        alert(&quo

事件绑定的几种方式

(一)事件绑定的几种方式 javascript给DOM绑定事件处理函数总的来说有2种方式:在html文档中绑定.在js代码中绑定.下面的方式1.方式2属于在html中绑定事件,方式3.方式4和方式5属于在js代码中绑定事件,其中方法5是最推荐的做法. 方式1: HTML的DOM元素支持onclick.onblur等以on开头属性,我们可以直接在这些属性值中编写javascript代码.当点击div的时候,下面的代码会弹出div的ID: [html] view plain copy <div id

JS中事件绑定的三种方式

以下是搜集的在JS中事件绑定的三种方式. 1. HTML onclick attribute <button type="button" id="upload" onclick="upload_file();"> 原文: http://www.w3school.com.cn/jsref/jsref_events.asp 2. jQuery .on() $(node).on("change", function(e)

JS事件绑定的三种方式比较

js事件 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <style> body{ width:100%; height:100%; } input{ display: block; margin-bottom:10px; } .active{ color:

JS事件绑定和JQ的事件绑定的几种方式

JS事件绑定的方式: 1.内嵌法: <input type="button" onclick="test()" value="click me"/> 或者是多事件绑定:<input type="button" onclick="javascript:test();test1();" value="click me"/> 2.动态绑定 直接为对象赋值 documen

临界区、互斥量、事件、信号量四种方式

临界区(Critical Section).互斥量(Mutex).信号量(Semaphore).事件(Event)的区别 1.临界区:通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问.在任意时刻只允许一个线程对共享资源进行访问,如果有多个线程试图访问公共资源,那么在有一个线程进入后,其他试图访问公共资源的线程将被挂起,并一直等到进入临界区的线程离开,临界区在被释放后,其他线程才可以抢占. 2.互斥量:采用互斥对象机制. 只有拥有互斥对象的线程才有访问公共资源的权限,因为互斥

JS 事件绑定的几种方式 小笔记

第一种 var test=document.getElementById('add'); add.onclick=function(){ alert('1'); } 直接在对象上注册事件 缺点:如果我想给add再加onchange 就会覆盖掉前面的onclick 优点:简单方便明了 第二种 var test=document.getElementById('add'); add.addEventListener('click',eve,false); function eve(){ alert(

js中的事件绑定的三种方式

1 直接在html标签中绑定 <button onclick = "show()"></button> 注意当你引用的js代码是包裹在window.onload中的形式的时候,show()是会报没有定义的错误,原因在于window.onload是在 页面全部加载完之后再去解析加载里面的内容.而button的点击事件在解析button的时候没有被定义. 2 用js的对象进行绑定事件 <body> <buttonid="btn1"