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>

  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;
时间: 2024-10-10 05:35:26

DOM0,DOM2,DOM3事件,事件基础知识入门的相关文章

足彩基础知识入门(4)赛事数据库与预测平台基础概念介绍(一)

在足球赛事数据库以及统计分析预测平台中,有很多概念,如果不搞懂,很难进行下一步的工作.所以为了配合团队人员的学习和任务进行,特意编写这篇文章.如果有其他问题和不懂的,请留言,将根据情况进行更新. 本文原文地址:足彩基础知识入门(4)赛事数据库与预测平台基础概念介绍(一) 1.指数1/2/3.... 我在 足彩基础知识入门(3)足彩赔率的本质 一文中介绍了赔率的概念,那么指数的概念和赔率以及结果是相关的.我们举个例子: 如上图的比赛,前面是竞彩非让球的赔率:1.74-3.25-4.15,也就是说

脱壳基础知识入门

现在加解密发展己形成2个分支了,一个就是传统的算法,另一个就是加密壳.越来越多的软件采用了密码学相关算法,现在要做出一个软件注册机己不象前几年那 么容易,这就要求解密者必须要有一定的数学功底和密码学知识,而这些在短时间内是不容易掌握的.除了密码学的应用,越来越多的软件加壳了,因此要求解密者 必须掌握一些脱壳技术,这就使得壳成了解密必须迈过的一个门槛.壳发展到今天,强度越来越高了,将许多人挡在门外,使得大家望壳兴叹.另外,论坛现在两极 分化比较严重,高手讨论的脱壳技术新手看不懂,很多人想学脱壳,但

Linux基础知识入门

[Linux基础]Linux基础知识入门及常见命令. 前言:最近刚安装了Linux系统, 所以学了一些最基本的操作, 在这里把自己总结的笔记记录在这里. 1,V8:192.168.40.10V1:192.168.40.11Linux ip:192.168.40.128 2,Linux是一个操作系统, 与windows的区别:Linux:图形化界面简单,性能很快,在企业中当做服务器来使用.Windows:图形化界面很炫,性能相对差,大众用户.windows的服务器: windows2003,win

DOM0,DOM2,DOM3事件

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

Docker 基础知识-入门篇

1. Docker简介和KVM区别 1.1 docker的三大理念 构建 运输 运行 ps:有点类似于java代码,一次构建到处运行 1.2 docker结构 相关说明:image: 和虚拟机的镜像类似container: 用镜像创建的实例repository: 类似于yum仓库docker client: 命令行输入的docker命令docker server: 启动的docker进程 1.3 docker和kvm的区别 1.虚拟机需要hypervisor这个中间层来进行支持,上面跑的每一个虚

事件流,事件捕获与事件冒泡-基础知识总结------彭记(018)

事件流: -事件流包括三个阶段-事件捕获阶段.处于目标阶段和事件冒泡阶段. -首先发生的是事件捕获,为截获事件提供了机会,然后是实际的目标接收到事件,最后一个阶段是冒泡阶段,可以在这个阶段对事件做出响应. 事件冒泡: -事件开始时由最具体的元素接收,然后逐级向上传播到较为不具体的节点(文档). <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8">

AngularJS实用基础知识---入门必备

前言 今天来和大家学习一下AngularJS-- AngularJS 通过新的属性和表达式扩展了 HTML. AngularJS 可以构建一个单一页面应用程序. AngularJS 学习起来非常简单. 一.AngularJS指令与表达式 [AngularJS常用指令]1.ng-app:声明Angular所管辖的区域,一般写在body或HTML上,原则上一个页面只有一个.2.ng-model:把元素值(比如输入域的值)绑定到应用程序的变量中.eg:<input type="text"

XHTML &amp; CSS 基础知识入门

查看一个网页的源代码只需要右击空白处点击查看网页源代码或者ctrl+U即可. 下载text editor文档编辑器 学习html和css前,我们需要一个text editor文档编辑器,计算机自带的notepad 可以写html文件,但是用文本文档写出来的文件可阅读性不强.我们可以下载notepad++来写html (notepad++也可以用来写很多其他语言的文件)且是免费试用的,很方便.[Notepad++官方下载地址] 下载安装好Notepad后我们就可以开始写html文件了. HTML里

外挂基础知识入门

http://www.cnblogs.com/gamesky/archive/2013/02/05/2893281.html 转:http://bbs.gameres.com/thread_142398_1_1.html 某些白痴菜鸟加本人QQ,扯了几天几夜.我确实累了...爱谁谁吧... 爱用C++的用C++,爱用delphi用delphi,爱用易语言的用易语言...想怎么用你们就用什么... 别扯这么多... 骗子教程,专门骗钱没什么真技术.五代科技    www.5dai.com天下无挂