关于事件监听/添加事件句柄

IE下:

//添加事件句柄
function(oELement,sEvent,fnHandler){
  oELement.attachEvent('on' + sEvent,fnHandler);

//取消事件句柄
function(oElement,sEvent,fnHandler){
  oElement.detachEvent('on' + sEvent,fnHandler);
}

其他浏览器下(当然,只有IE8及更早的版本不支持,Opera 7.0 及 Opera 更早版本也不支持):

//添加事件句柄
function(oELement,sEvent,fnHandler){
  oElement.addEventListener(sEvent,fnHandler,false);
}

//取消事件句柄
function(oELement,sEvent,fnHandler){
  oElement.removeEventListener(sEvent,fnHandler,false);
}

原因:

事件触发顺序有两种:事件捕获与事件冒泡。
  1.冒泡型事件:事件按照从最特定的事件目标到最不特定的事件目标(document对象)的顺序触发。
  2.捕获型事件(event capturing):事件从最不精确的对象(document 对象)开始触发,然后到最精确(也可以在窗口级别捕获事件,不过必须由开发人员特别指定)。
  Chrome浏览器支持事件捕获与事件冒泡,添加事件句柄时,默认为true,执行事件捕获,设置为false,为事件冒泡。而IE只支持事件冒泡,因此添加事件句柄的方法不同。

兼容性写法:

<script type="text/javascript">
var EventUtil = {
    addHandler: function (oElement, sEvent, fnHandler) {
        oElement.addEventListener ? oElement.addEventListener(sEvent, fnHandler, false) : oElement.attachEvent("on" + sEvent, fnHandler)    
    },
    removeHandler: function (oElement, sEvent, fnHandler) {
        oElement.removeEventListener ? oElement.removeEventListener(sEvent, fnHandler, false) : oElement.detachEvent("on" + sEvent, fnHandler)
    },
    addLoadHandler: function (fnHandler) {
        this.addHandler(window, "load", fnHandler)
    }
}
</script>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容