果一:

从结果可以看出:
①第一种方法事件处理程序中this指向这个元素本身;
实例二:
? ?
? ? test
? ?
? ? div1
? ? <script type="text/java script">
? ? ? ? var div1 = document.getElementById('div1');
? ? ? ? div1.onclick = function(){
? ? ? ? ? ? console.log('div1.onclick:');
? ? ? ? ? ? console.log(this);
? ? ? ? };
? ?
结果二:

从结果可以看出:
①第二种方法事件处理程序中this也指向这个元素本身;
②存在第二种方法时,它会覆盖第一种方法注册的事件处理程序;
实例三:
? ?
? ? test
? ?
? ? div1
? ? <script type="text/java script">
? ? ? ? var div1 = document.getElementById('div1');
? ? ? ? div1.onclick = function(){
? ? ? ? ? ? console.log('div1.onclick:');
? ? ? ? ? ? console.log(this);
? ? ? ? };
? ? ? ? div1.addEventListener('click', function(){
? ? ? ? ? ? console.log('div1.addEventListener:');
? ? ? ? ? ? console.log(this);
? ? ? ? }, false);
? ?
结果三:

从结果可以看出:
①第三种方法事件处理程序中this也指向这个元素本身;
②第三种方法并不会覆盖第一种或第二种方法注册的事件处理程序;
实例四:
? ?
? ? test
? ?
? ? div1
? ? <script type="text/java script">
? ? ? ? var div1 = document.getElementById('div1');
? ? ? ? div1.onclick = function(){
? ? ? ? ? ? console.log('div1.onclick:');
? ? ? ? ? ? console.log(this);
? ? ? ? };
? ? ? ? div1.attachEvent('onclick', function(){
? ? ? ? ? ? console.log('div1.attachEvent:');
? ? ? ? ? ? console.log(this === window);
? ? ? ? });
? ? ? ?
? ?
结果四:

从结果可以看出:
①第四种方法事件处理程序中this指向全局对象Window;
②第四种方法也不会覆盖第一种或第二种方法注册的事件处理程序;
3.事件处理程序的调用顺序:多个事件处理程序调用规则如下:
①通过HTML属性注册的处理程序和通过设置对象属性的处理程序一直优先调用;
②使用addEventListener()注册的处理程序按照它们的注册顺序依次调用;
③使用attachEvent()注册的处理程序可能按照任何顺序调用,所以代码不应该依赖于调用顺序;
4.事件取消:
①取消事件的浏览器默认操作(比如点击超链接元素会自动发生页面跳转的默认操作):如果使用前两种方法注册事件处理程序,可以在处理程序中添加返回值false来取消事件的浏览器默认操作。在支持addEventListener()的浏览器中,也可以通过调用事件对象的preventDefault()方法取消事件的默认操作。至于IE8及其之前的浏览器可以通过设置事件对象的returnValue属性为false来取消事件的默认操作。参考代码:
function cancelHandler(event){
? ? var event = event || window.event;
? ? if(event.preventDefault){
? ? ? ? event.preventDefault();
? ? }
? ? if(event.returnValue){
? ? ? ? event.returnValue = false;
? ? }
? ? return false;
}
②取消事件传播:在支持addEventListener()的浏览器中,可以调用事件对象的一个stopPropagation()方法阻止事件的继续传播,它能工作在事件传播期间的任何阶段(捕获期阶段、事件目标本身、冒泡阶段);但是在IE8以及其之前版本的浏览器中并不支持stopPropagation()方法,而且这些浏览器也不支持事件传播的捕获阶段,相应的,IE事件对象有一个cancelBubble属性,设置这个属性为true能阻止事件进一步传播(即阻止其冒泡)。参考代码(阻止发生在div3区域的点击事件冒泡到div2和div1):
? ?
? ? test
? ?
? ? div1
? ? ? ?
div2
? ? ? ? ? ?
div3
? ? ? ? ? ?
? ? ? ?
? ?
? ? <script type="text/java script">
? ? ? ? var div1 = document.getElementById('div1');
? ? ? ? var div2 = document.getElementById('div2');
? ? ? ? var div3 = document.getElementById('div3');
? ? div1.onclick = function(){
? ? ? ? ? ? console.log('div1');
? ? };
? ? div2.onclick = function(){
? ? ? ? ? ? console.log('div2');
? ? };
? ? div3.onclick = function(event){
? ? ? ? ? ? stopEventPropagation(event);
? ? ? ? ? ? console.log('div3');
? ? };
? ?
? ? ? ? function stopEventPropagation(event){
? ? ? ? ? ? var event = event || window.event;
? ? ? ? ? ? if(event.stopPropagation){
? ? ? ? ? ? ? ? event.stopPropagation();
? ? ? ? ? ? }else{
? ? ? ? ? ? ? ? event.cancelBubble = true;
? ? ? ? ? ? }
? ? ? ? }
? ?