DOM0,DOM2,DOM3事件

  事件是javascript和HTML交互基础, 任何文档或者浏览器窗口发生的交互, 都要通过绑定事件进行交互;
  事件有DOM0, DOM2和DOM3的区分(别问我怎么少了一个DOM1, 也没找到DOM1的信息啊,);

  DOM0就是直接通过 onclick写在html里面的事件, 比如:

<input onclick="alert(1)" />

  DOM2是通过addEventListener绑定的事件, 还有IE下的DOM2事件通过attachEvent绑定;
  DOM3是一些新的事件, 区别DOM3和DOM2的方法我感觉是DOM3事件有分大小写的,DOM2没有;

  事件流(现在很流行偷图么么哒)
  
  IE的事件流是冒泡, 从里面往上面冒, netscape是从外部元素往内部元素捕获;
  而DOM2级的事件规定了事件流包含三个阶段包括: 1:事件捕获, 2:处于目标阶段, 3:事件冒泡阶段(IE8以及更早版本不支持DOM事件流);

  DOM0事件
  

<input onclick="alert(event)" />
<form>
<input name="hehe" value="hehe" />
<input onclick="alert(hehe.value)">所有DOM0的事件作用域被扩展了哇;
</form>

  DOM0的事件具有极好的跨浏览器优势, 会以最快的速度绑定, 如果你通过DOM2绑定要等到JS运行, DOM0不用, 因为DOM0是写在元素上面的哇;

  DOM2事件

  DOM2事件的冒泡和捕获

  

        <html xmlns="http://www.w3.org/1999/xhtml">
        <head>
            <title></title>
            <meta charset="utf-8" />
            <style type="text/css">
                #p { width: 300px; height: 300px; padding: 10px;  border: 1px solid black; }
                #c { width: 100px; height: 100px; border: 1px solid red; }
            </style>
        </head>
        <body>
        <div id="p">
            parent
            <div id="c">
                child
            </div>
        </div>
        <script type="text/javascript">
            var p = document.getElementById(‘p‘),
                    c = document.getElementById(‘c‘);
            c.addEventListener(‘click‘, function () {
                alert(‘子节点捕获‘)
            }, true);

            c.addEventListener(‘click‘, function (e) {
                alert(‘子节点冒泡‘)
            }, false);

            p.addEventListener(‘click‘, function () {
                alert(‘父节点捕获‘)
            }, true);

            p.addEventListener(‘click‘, function () {
                alert(‘父节点冒泡‘)
            }, false);
        </script>
        </body>
        </html>

  这个依次会打出父节点捕获,子节点捕获,子节点冒泡和父节点冒泡,(注意:如果你改变绑定事件的顺序, 这些事件可能就不按照捕获的顺序来了, 这个有解决方法,参考:) ==>>(叶小钗的东东)http://www.cnblogs.com/yexiaochai/p/3567597.html );
  说实话啊,事件捕获没啥用处么么哒;

  还有一点要注意的是:元素点击里面的this有问题哦, 在IE8和和IE8以前, 通过attachEvent绑定的事件里面的this是window;

        <html xmlns="http://www.w3.org/1999/xhtml">
        <head>
            <title></title>
            <meta charset="utf-8" />
            <style type="text/css">
                #p { width: 300px; height: 300px; padding: 10px;  border: 1px solid black; }
            </style>
        </head>
        <body>
        <div id="p">
            p
        </div>
        <script type="text/javascript">
            var p = document.getElementById(‘p‘);
            p.attachEvent("onclick",function(){
                alert(this);
            })
            //在IE5678这个弹出的是window哦,这个要主要, 要让this 指向这个元素通过apply或者call改变上下文
        </script>
        </body>
        </html>

  这个兼容问题常见的解决方法,一般来说够用了:

    <script>
     var eventUtil = {
        add : function(el, type, handler) {
            if(el.addEventListener) {
                el.addEventListener(type, handler, false);
            }else if( el.attachEvent ) {
                el.attachEvent("on"+type, handler);
            }else{
                el["on"+type] = handler;
            }
        },
        off : function(el, type, handler) {
            if( el.removeEventListener ) {
                el.removeEventListener(type, handler, false)
            }else if( el.detachEvent ) {
                el.detachEvent(type, handler);
            }else{
                el["on"+type] = null;
            }
        }
     };
    </script>

  事件对象

  无论在DOM0还是DOM2还是DOM3中都会在事件函数中传入事件对象;

  

    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <title></title>
        <meta charset="utf-8" />
        <style type="text/css">
            #p { width: 300px; height: 300px; padding: 10px;  border: 1px solid black; }
        </style>
    </head>
    <body>
    <div id="p">
        p
    </div>
    <script type="text/javascript">
        var p = document.getElementById(‘p‘);
        p.addEventListener("click",function(){
            console.log(arguments[0]);
        })
    </script>
    </body>
    </html>

  事件对象event下的属性和方法:

    因为各个浏览器的事件对象不一样, 把主要的时间对象的属性和方法列出来;
    bubble :    表明事件是否冒泡
    cancelable :  表明是否可以取消冒泡
    currentTarget : 当前时间程序正在处理的元素, 和this一样的;
    defaultPrevented: false ,如果调用了preventDefualt这个就为真了;
    detail: 与事件有关的信息(滚动事件等等)
    eventPhase: 如果值为1表示处于捕获阶段, 值为2表示处于目标阶段,值为三表示在冒泡阶段
    target || srcElement: 事件的目标
    trusted: 为ture是浏览器生成的,为false是开发人员创建的(DOM3)
    type : 事件的类型
    view : 与元素关联的window, 我们可能跨iframe;
    preventDefault()    取消默认事件;
    stopPropagation() 取消冒泡或者捕获;
    stopImmediatePropagation() (DOM3)阻止任何事件的运行;
    //stopImmediatePropagation阻止 绑定在事件触发元素的 其他同类事件的callback的运行

    IE下的事件对象是在window下的,而标准应该作为一个参数, 传为函数第一个参数;
    IE的事件对象定义的属性跟标准的不同,如:
    cancelBubble 默认为false, 如果为true就是取消事件冒泡;
    returnValue 默认是true,如果为false就取消默认事件;
    srcElement, 这个指的是target, Firefox下的也是srcElement;

  

时间: 2024-10-11 22:00:39

DOM0,DOM2,DOM3事件的相关文章

DOM0,DOM2,DOM3事件,事件基础知识入门

事件是javascript和HTML交互基础, 任何文档或者浏览器窗口发生的交互, 都要通过绑定事件进行交互; 事件有DOM0, DOM2和DOM3的区分(别问我怎么少了一个DOM1, 也没找到DOM1的信息啊,); DOM0就是直接通过 onclick写在html里面的事件, 比如: <input onclick="alert(1)" /> DOM2是通过addEventListener绑定的事件, 还有IE下的DOM2事件通过attachEvent绑定; DOM3是一些

IE中DOM0级事件处理程序跟DOM2级事件处理程序中作用域(this)的区别

一:在布局中直接添加事件处理 <div id="div1" onclick="fOne();"></div> <script> var oDiv1 = document.getElementById("div1"); function fOne(){ alert(this===window);//true } </script> 弹出true,是因为在布局中调用的时候省略了window,全面的应该是

JS:Html事件处理程序 vs DOM0级事件处理程序 vs DOM2级事件处理程序

1.HTML事件处理程序 某个元素支持的某种事件,可以通过一个与相应事件处理程序同名的HTML特性指定.这个特性的值应该是能够执行的JS代码.例如:按钮单击是要执行一些js代码,可以像下面: <input type="button" value="click me" onclick="showMessage()" /> 在js中就可以像下面一样处理: <script> function showMessage(){ ale

DOM0、DOM2级事件

JavaScript DOM0.DOM2级事件 1.DOM0级事件:on+事件类型 在html行内直接绑定,也就是通过行内js绑定的例如<span onclick="alert('1')">第一项</span> 在js中绑定例如://<span onclick="alert('2')">第一项</span> var Ospan=document.getElementsByTagName('span')[0];Ospan

Dom0级事件和Dom2级事件

1.Dom0级事件: 注册obj.onclick=function () {}; (1.使用简单,2.跨浏览器): 删除obj.onclick=null; 2.Dom2级事件(比0级优点:多个处理函数不会被覆盖): 成员 -> addEventListener注册事件   removeEventListener移出事件: 三个参数 -> 1事件名(都不能带on),2处理函数,3布尔值涉及嵌套元素的事件触发顺序(true按捕获流的顺序调用,false按事件冒泡流的顺序调用): (IE下用atta

【20190226】JavaScript-知识点记录:dom0级事件,dom2级事件

DOM0级事件处理程序: 通过将元素的事件处理程序属性(如onclick)的值设置为一个函数来指定事件处理程序的方法称为DOM0级方法,它被认为是元素的方法,这时候的事件处理程序是在元素的作用域中运行(也就是this引用当前元素): 1 var btn = document.getElementById('myBtn'); 2 btn.onclick = function(){ 3 alert(this.id); 4 }; DOM2级事件处理程序: 通过addEventListener()方法和

关于DOM2级事件的事件捕获和事件冒泡

DOM2级事件中addEventListener的执行机制,多个addEventListener同时添加时的执行先后规律: W3C的DOM事件触发分为三个阶段:①.事件捕获阶段,即由最顶层元素(一般是从window元素开始,有的浏览器是从document开始,至于其中的差别我稍后会更新)开始,逐次进入dom内部,最后到达目标元素,依次执行绑定在其上的事件②.处于目标阶段,检测机制到达目标元素,按事件注册顺序执行绑定在目标元素上的事件.③.事件冒泡阶段,从目标元素出发,向外层元素冒泡,最后到达顶层

事件流程以及dom2级事件绑定

事件流程分为三个阶段:捕获阶段.目标阶段.冒泡阶段. 捕获阶段:事件从最顶层元素开始执行,一层层往下,直到精确元素. 目标阶段:事件在精确元素上执行. 冒泡阶段:事件从精确元素开始执行,一层层往上,直到顶层元素(注:高级浏览器的顶层元素是window,ie8以下的浏览器顶层元素是document)  DOM2级事件绑定方式   高级浏览器绑定方式: 元素.addEventListener(type, handler, boolean);             //绑定 type 事件类型字符串

DOM2级事件addEventListener

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" con