替节点绑定事件的几种方法

为节点绑定事件的几种方法

 “绑定事件”是UI开发中最常用到的操作之一,这里介绍几种方法,供大家选择:

 

1、html内嵌法

 

  顾名思义,就是在html代码里节点代码里绑定事件。如下面代码

 

 

<html>
<head>
<script type="text/javascript">
  function test(){
    alert("bang");
  }
</script>
</head>
<body>
<input type="button" onclick="test()" value="click me"/>
</body>
</html>
 

 

  需要注意的是,onclick后面的function赋值是需要添加括号的,否则事件无法绑定和触发。

 

  如果onclick需要连续执行多个操作,可以按如下方法绑定事件。

<html>
<head>
<script type="text/javascript">
  function test(){
    alert("bang");
  }

  function test1(){
    alert("bang2");
  }
</script>
</head>
<body>
<input type="button" onclick="javascript:test();test1();" value="click me"/>
</body>
</html>

 

   其中的“JavaScript:”也可以不加,具体原因,待查。

 

   其中关于事件参数的传递和设置请参看 window.event 的介绍。

 

2、动态绑定

 

   在很多时候,我们需要动态的创建节点,然后将某个或某几个事件绑定在该新建对象上。动态绑定又包含两种方式:

   1、直接为对象赋值

 

document.getElementById("xxx").onclick = test;

   2、使用两个重要的Js函数:attachEvent 和 addEventListener。

 

   方法1和2的区别在于,如果连续执行如果执行如下的连续方法1赋值操作,最后的结果是只有test3被绑定给了对象。

 

document.getElementById("xxx").onclick = test1;
document.getElementById("xxx").onclick = test2;
document.getElementById("xxx").onclick = test3;
 

   而方法2如果采用相同的连续赋值方式,则会产生追加的效果,事件触发是的执行顺序,由下至上。

 

   另外对于方法1,我们要注意,赋给“onclick”的值只是一个“引用“,一定不能加括号,否则事件就会被执行,而赋给onclick的就是事件执行的返回结果了。

 

   对于方法2我们来详细了解下。两种js方法,在IE下可用attachEvent,在FF下则要用addEventListener

 

    attachEvent()有两个参数

 

  1. 第一个是事件名称
  2. 第二个是需执行的函数;

    addEventListener()有三个参数

 

  1. 第一个是事件名称,但与IE事件不同的是,事件不带"on",比如"onsubmit"在这里应为"submit"
  2. 第二个是需执行的函数
  3. 第三个参数为布尔值,表示该事件的响应顺序(useCapture),userCapture若为true,则浏览器采用Capture,若为false则采用bubbing方式。

     html代码

<div id="div_test"> <input type="button" id="btn_test" value="se4.cn技术基地" /> </div>

     js代码

window.onload=function(){   document.getElementById("div_test").addEventListener("click",test1,false);   document.getElementById("btn_test").addEventListener("click",test2,false);

        }

        function test1(){ alert("外层div触发") }

        function test2(){ alert("内层input触发") }

     如果userCapture是true则test1先触发,如果userCapture是false则test2先触发。

 

 

    请看如下示例代码。

<html>
<head>
<script type="text/javascript">
  
  function addEventHandler(oTarget, sEventType, fnHandler) {  
    if (oTarget.addEventListener) {  
        oTarget.addEventListener(sEventType, fnHandler, false);  
    } else if (oTarget.attachEvent) {  
        oTarget.attachEvent("on" + sEventType, fnHandler);  
    } else {  
        oTarget["on" + sEventType] = fnHandler;  
    }  
  } 
  
  function test(){
    alert("bang");
  }

  function test1(){
    alert("bang2");
  }

  function init(){
    var input = document.createElement('input');
	input.type = 'button';
	input.value = 'click me';
	addEventHandler(input,'click',test);
	addEventHandler(input,'click',test1);
    
	document.getElementById('button_container').appendChild(input);
    
  }
</script>
</head>
<body onload="init()">
<div id="button_container"></div>
</body>
</html>

 

 

点击按钮后,事件执行的顺序是 test1-->test2。

 

因为IE和Firefox绑定事件的方法不一样,所以需要判断浏览器类型。具体方法参见:浏览器类型判别。