“绑定事件”是UI开发中最常用到的操作之一,这里介绍几种方法,供大家选择:
1、html内嵌法
顾名思义,就是在html代码里节点代码里绑定事件。如下面代码
<html>
<head>
<script type="text/javascript">
function test(){
alert("bang");
}
</script>
</head>
<body>
<input type="button" οnclick="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" οnclick="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()有两个参数
- 第一个是事件名称
- 第二个是需执行的函数;
addEventListener()有三个参数
- 第一个是事件名称,但与IE事件不同的是,事件不带"on",比如"onsubmit"在这里应为"submit"
- 第二个是需执行的函数
- 第三个参数为布尔值,表示该事件的响应顺序(useCapture),userCapture若为true,则浏览器采用Capture,若为false则采用bubbing方式。
html代码
<div id="div_test"> <input type="button" id="btn_test" value="se4.cn技术基地" /> </div>
js代码
window.οnlοad=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 οnlοad="init()">
<div id="button_container"></div>
</body>
</html>
点击按钮后,事件执行的顺序是 test1-->test2。
因为IE和Firefox绑定事件的方法不一样,所以需要判断浏览器类型。具体方法参见:浏览器类型判别。