javascript将DOM事件处理程序封装为event.js 出现的低级错误记录

将 DOM 0级事件处理程序和DOM2级事件处理程序 IE事件处理程序封装为eventUtil对象,达到跨浏览器的效果。代码如下:

var eventUtil = {
    // 添加事件句柄
    addEventHandler:function (element,type,handler) {
        if (element.addEventListener) {
            element.addEventListener(type, handler,false);
        }else if(element.attachEvent){
            element.attachEvent("on"+type,handler);
        }else {
            element["on"+type]=handler;
        }
    },
    // 删除事件句柄
    removeEventHandler:function (element,type,handler) {
        if (element.removeEventListener) {
            element.removeEventListener(type, handler,false);
        }else if(element.detachEvent){
            element.detachEvent("on"+type,handler);
        }else {
            element["on"+type]=null;
        }
    },
    // 获取事件对象
    getEvent:function (event) {
        return event?event:window.event;
    },
    // 获取事件的类型
    getType:function (event) {
        return event.type;
    },
    // 获取事件对象目标
    getTarget:function (event) {
        if (event.target) {
            return event.target;
        }else{
            return event.srcElement;
        }
    },
    // 阻止事件冒泡
    stopPropagation:function (event) {
        if (event.stopPropagation) {
            event.stopPropagation();
        }else{
            event.cancelBubble=true;
        }
    },
    // 阻止事件默认行为
    preventDefault:function (event) {
        if (event.preventDefault) {
            event.preventDefault();
        }else{
            event.returnValue=false;
        }
    }
}

在练习代码的时候,自己出现了几个错误的地方,导致运行出错,记录一下,加深记忆。

① 添加句柄是混淆参数的位置:首先是addEventHandler(element,type,handler)的参数分别表示,为哪个元素element添加事件,事件的类型type,事件处理函数handler。自己容易把handler和后面addEventLister(type,handler,false)中的false(表示冒泡阶段)的位置混淆。

  导致结果:在写的过程,自己认真想了一下,理解了addEventHandler需要的哪些参数,就知道哪个位置该用哪个参数,最终写对了,未导致错误。

  解决办法:理解并记住。

②在IE事件处理程序判断分支中,对attachEvent和detachEvent拼写错误,少了Event,只写了attach或detach。

  导致结果:虽然没有报错,但是无法使用addEventHandler和removeEventHandler在IE中添加或删除事件。

  解决办法:多练记牢就行。attachEvent 和 detachEvent。

③忘记了在IE事件处理程序attachEvent 和 detachEvent的参数里事件类型是需要加"on"的;写成了attachEvent(type,handler)。其实正确的应该是attachEvent("on"+type,handler),另外忘记了还有DOM0级事件处理的判断分支

  导致结果:同样的,无法兼容IE事件处理。在IE上用封装的方法添加或删除事件不能成功。

  解决办法:也只能记住。还有一点需要注意:DOM0级事件中element["on"+type]这种方式。比如element["on"+"click"]等价于element.onclick。

④最后一个属性的结尾也加逗号,比如在阻止事件默认行为 preventDefault:完成后加逗号,如下面代码片段(注释)

  preventDefault:function (event) {
        if (event.preventDefault) {
            event.preventDefault();
        }else{
            event.returnValue=false;
        }
    },//最后一个属性preventDefault完成后加了逗号,会出错
}

  导致结果:在IE中运行时报错(其中event.js的54行是最后逗号的下一行,实际上就是逗号导致的;test.html的第10行则是因为调用了event.js中的eventUtil.addEventHandler方法)

  解决办法:毫无疑问,去掉最后的逗号即可。

⑤还是拼写错误,IE中阻止事件冒泡的属性cancelBubble,写多了一个s,写成了cancelBubbles。

  导致结果:没有报错,但是无法阻止IE中的事件冒泡。

  解决办法:改回来

时间: 2024-08-09 09:23:17

javascript将DOM事件处理程序封装为event.js 出现的低级错误记录的相关文章

JavaScript&jQuery.DOM事件

DOM事件 在JavaScript中常见的事件有: UI事件,当与浏览器UI本身(而不是网页)交互时发生的事件. 鼠标事件,当用户操作鼠标.触控板.或触摸屏幕时发生. 键盘事件,当用户操作键盘时发生. 焦点事件,当一个元素(比如链接或表单)得到或失去焦点时发生. 表单事件,当用户与表单元素进行交互时发生. 变动事件,当用户修改了DOM结构(添加或删除元素节点)后发生. DOM事件如何触发javaScript代码 对象有属性.方法.事件 本质上他们是同一个东西:属性=方法=事件. 事件->方法->

JavaScript:关于事件处理程序何时可以直接访问元素的属性

指定在元素的的事件处理程序中指定 <input type="button" value="click me" onclick="alert(this.value)"/> 这段代码可以正确工作,点击之后会弹出 click me字符串: 如果把该代码改为: <script> function clickMe(){ alert(value); } </script> <input type="butt

DOM事件处理程序-事件对象-键盘事件

事件流: 事件流--描述的是从页面中接受事件的顺序 IE  ---事件冒泡流:即事件最开始由最具体的元素(文档中嵌套层次最深的那个节点)接收,然后逐级向上传播至最不具体的那个节点(文档). Netscape  ---事件捕获流:不太具体的节点应该更早接收到事件,而最具体的节点最后接收到事件. 使用事件处理程序: 1. HTML事件处理程序 <input type="button" value="按钮" id="btn" onclick=&q

JavaScript基础—dom,事件

Js基础-DOM 1:dom:文档对象模型 Dom就是html页面的模型,将每个标签都作为一个对象,js通过调用dom中的属性,方法就可以对网页中的文本框,层等元素进行编程控制.Dom就是一些让javascript能操作html页面控件的类,函数. 这就是文档对象模型.按照xml文档的理解就可以. à页面中的属性,标签要是没有注明给那个对象,则统一时给window的,我们都可以通过window点击出来,进行操作,这个js中理解的一样.但是我们现在通过document.getElementById

DOM事件处理程序

addEventListener() 和 removeEventListener(), 所有 DOM 节点中都包含这两个方法,并且它们都接受 3 个参数: 要处 理的事件名. 作为事件处理程序的函数 一个布尔值.最后这个布尔值参数如果是 true,表示在捕获 阶段调用事件处理程序:如果是 false,表示在冒泡阶段调用事件处理程序. var btn = document.getElementById("myBtn"); var handler = function(){ alert(t

JavaScript&amp;jQuery.DOM事件监听器

DOM是事件监听器 DOM事件监听器予许一个事件触发多个方法,在实际工作中应用比较多. <!DOCTYPE html><html> <head> <title>DOM事件监听器1</title> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0&q

JavaScript添加IE事件处理程序

IE和其他主流的浏览器之间有很多的不兼容,有一些其他浏览器支持的方法在IE中并不能完美的支持,首先哪些支持呢? 1.直接在HTML代码的元素属性的位置为事件绑定处理程序: 2.使用JavaScript的 node.onclick=function(){} IE8及之前的版本不支持addEventListener和removeEventListener,支持的是attachEvent()和detachEvent() attachEvent()和detachEvent()都需要两个参数: 第一个参数

JavaScript HTML DOM 事件

对事件做出反应 我们可以在事件发生时执行 JavaScript,比如当用户在 HTML 元素上点击时. 如需在用户点击某个元素时执行代码,请向一个 HTML 事件属性添加 JavaScript 代码: onclick=JavaScript HTML 事件的例子: 当用户点击鼠标时 当网页已加载时 当图像已加载时 当鼠标移动到元素上时 当输入字段被改变时 当提交 HTML 表单时 当用户触发按键时 例子 1 在本例中,当用户在 <h1> 元素上点击时,会改变其内容: <h1 onclick

JavaScript HTML DOM事件

HTML DOM 使javaScript有能力对HTML事件作出反应. HTML事件的例子: 当用户点击鼠标时 当网页已加载时 当图像已加载时 当鼠标移动到元素上时 当输入字段被改变时 当提交HTML表单时 当用户触发按键时 HTML事件属性为HTML事件分配事件 <button onclick="displayDate()">点击这里</button> 使用HTML DOM 来分配事件 1 <script> 2 document.getElemen