事件是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>

  chrome下有个getEventListeners可以获取元素绑定事件, 从小钗哪里抄的,代码如下:

<html xmlns="http://www.w3.org/1999/xhtml">

<head>

  <title></title>

</head>

<body>

<div id="d">ddssdsd</div>

  <script type="text/javascript">

    var node = document.getElementsByTagName('*');

    var d = document.getElementById('d');

    d.addEventListener('click', function () {

      alert();

    }, false);

    d.addEventListener('click', function () {

      alert('我是第二次');

    }, false);

    d.onclick = function () {

      alert('不规范的绑定');

    }

    d.addEventListener('click', function () {

      alert();

    }, true);

    d.addEventListener('mousedown', function () {

      console.log('mousedown');

    }, true);

    var evets = typeof getEventListeners == 'function' && getEventListeners(d);

    getEventListeners(d)

  </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;

DOM0,DOM2,DOM3 事件基础知识的更多相关文章

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

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

  2. DOM0 DOM2 DOM3

    DOM0  DOM2  DOM3 DOM是什么 W3C 文档对象模型 (DOM) 是中立于平台和语言的接口,它允许程序和脚本动态地访问和更新文档的内容.结构和样式. DOM 定义了访问 HTML 和 ...

  3. javascript中DOM0,DOM2,DOM3级事件模型解析

    DOM 即 文档对象模型. 文档对象模型是一种与编程语言及平台无关的API(Application programming Interface),借助于它,程序能够动态地访问和修改文档内容.结构或显示 ...

  4. JavaScript事件基础知识总结【思维导图】

    另外附上来自Nicholas C.Zakas<JavaScript高级程序设计 第3版>中的跨浏览器兼容EventUtil对象. var EventUtil = { //注册事件 addH ...

  5. dom0、dom2、dom3事件

    https://www.jianshu.com/p/3acdf5f71d5b addEventListener():可以为元素添加多个事件处理程序,触发时会按照添加顺序依次调用. removeEven ...

  6. JS中的事件类型和事件属性的基础知识

    周末无聊, 这几天又复习了下JS搞基程序设计3, 想着好记性不如浪笔头哇, 要么把这些东西写下来, 这样基础才能更加扎实么么哒, 知道的同学也可以直接过一下,当做复习,  小姨子再也不用担心我的学习啦 ...

  7. dom0级事件和dom2级事件

    dom0级事件 <a href="#" id="hash" onclick="fn();fn1();"> <button ...

  8. 测试DOM0级事件和DOM2级事件的堆叠

    1. 问题 如果大家看过北风网CJ讲师的Javascript视频教程,就可以看到其封装了一个很强的事件添加和删除函数,如下所示 function addEvent(obj, evtype, fn) { ...

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

    DOM0级事件处理程序: 通过将元素的事件处理程序属性(如onclick)的值设置为一个函数来指定事件处理程序的方法称为DOM0级方法,它被认为是元素的方法,这时候的事件处理程序是在元素的作用域中运行 ...

随机推荐

  1. Java 加解密技术系列文章

    Java 加解密技术系列之 总结 Java 加解密技术系列之 DH Java 加解密技术系列之 RSA Java 加解密技术系列之 PBE Java 加解密技术系列之 AES Java 加解密技术系列 ...

  2. 【js】初入AJAX

    AJAX即“Asynchronous Javascript And XML”(异步JavaScript和XML),是指一种创建交互式网页应用的网页开发技术. AJAX = 异步 JavaScript和 ...

  3. [No0000AD]7z源码完全移植至Visual Studio 2015

    今天在上次的基础上(原文地址:[No0000AB]用Visual Studio 2015在 WIN10 64bit 上编译7-zip (32 bit)),将7Z的源码完全移植到了vs2015开发环境下 ...

  4. Android开发用过的十大框架

    http://blog.csdn.net/u011200604/article/details/51695096 本文系多方综合与转载整合,意在Android开发中能够知道和使用一些好用的第三方支持, ...

  5. [LeetCode] Number of Segments in a String 字符串中的分段数量

    Count the number of segments in a string, where a segment is defined to be a contiguous sequence of ...

  6. [LeetCode] N-Queens II N皇后问题之二

    Follow up for N-Queens problem. Now, instead outputting board configurations, return the total numbe ...

  7. sql server 公共表达式的简单应用(cte)

    一.前言 现在做项目数据访问基本都会选择一种orm框架,它以面向对象的形式屏蔽底层的数据访问形式,让开发人员更集中在业务处理上,而不是和数据库的交互上,帮助我们提高开发效率:例如一些简单的insert ...

  8. 《MySQL 必知必会》读书总结

    这是 <MySQL 必知必会> 的读书总结.也是自己整理的常用操作的参考手册. 使用 MySQL 连接到 MySQL shell>mysql -u root -p Enter pas ...

  9. Codeforces Round #383(div 2)

    A.快速幂 B. 题意:求ai^aj=x的数对个数,x和a[]给定 分析:a^b=c,则a^c=b,所以求ai^x=aj的个数,枚举一遍即可 C. 题意:给你一个有向图,每个点的出边只有一条,求最小的 ...

  10. 俄罗斯方块C#版

    using System; using System.Windows.Forms; using System.Drawing; using System.Media; class me : Form ...