?“绑定事件”是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()有两个参数
?
- 第一个是事件名称
- 第二个是需执行的函数;
?? ?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.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绑定事件的方法不一样,所以需要判断浏览器类型。具体方法参见:浏览器类型判别。
?
?
?
?
?
?
?
?
?