zoukankan      html  css  js  c++  java
  • 事件(没有尽头的待完善)

    事件:

    •   用户在浏览器操作的时候,在某种条件成立时而触发(事件、事务)的一种交互行为
    •   每个元素自身就有事件,只不过默认为null,当某个事件绑定了一个函数之后,用户在操作浏览器的时候,触发了这个事件,那么就执行事件函数。
    •   用户操作浏览器的时候会触发很多的事件,只有绑定了事件函数的事件才会对用户有响应,但没有响应的事件并不是没触发,只是没有事件函数而已
    •     某个元素有这个事件,事件值默认为null,如果没有这个事件,事件值为undefined(访问了某个对象一个没有设置的属性而已)

    事件绑定:

      在传统事件中,同一个元素绑定多个同一个事件,那么后面的事件函数会把前面的事件函数覆盖。在DOM2事件绑定中,可以让同一个元素,绑多次同一个事件。

    DOM 0 级 事件: 

      on开头的

      解除事件:

        ele.onxxx = null

    DOM 1 级 事件:

      DOM级别1于1998年10月1日成为W3C推荐标准。

      1级DOM标准中并没有定义事件相关的内容,所以没有所谓的1级DOM事件模型。

    DOM 2 级 事件:

      在2级DOM中除了定义了一些DOM相关的操作之外还定义了一个 事件模型 。这个标准下的事件模型就是我们所说的2级DOM事件模型。

      在DOM2事件绑定中,可以让同一个元素,绑多次同一个事件

      addEventListener  添加事件绑定(监听)

      removeEventListener  解除事件绑定

      ele.addEventListener("不带on的事件名",事件函数,布尔值(默认不捕获))//事件函数要起个名字,以便在解除的时候拿到同一个函数地址

      ele.removeEventListener("不带on的事件名",事件名(和绑定事件的函数为同一个地址),布尔值)

      在开发移动端的时候,就要用DOM2,不然有些浏览器不会触发手机端事件

    IE低版本用:

      绑定:box.attachEvent(“带 on 的事件名”,function(){} )

      解除:box.detachEvent("带 on 的事件名",function(){} )

    例子:

        box.addEventListener('click',fn);//给box绑定click事件
    
        function fn(){
            alert(1);
        }
    
        btn.addEventListener('click',function(){
            box.removeEventListener('click',fn);
        })//点击btn的时候移除box的click事件函数

    事件模型:捕获 -> 目标 -> 冒泡

       1. 先捕获,再冒泡。2.同一元素有多个捕获或者多个冒泡的时候,执行同一阶段的时候会按照 这个阶段的 代码(事件绑定)的先后顺序执行。

      冒泡:

        从目标点由下而上直到window的过程叫冒泡。

        如果目标元素和祖先元素绑定了同一种事件,那么在执行完目标元素的事件之后,同样会调用祖先级的事件函数

        祖先元素:在css中的结构中,标签套标签,外层的标签是内层标签的父级或者祖先级

      捕获:

        从window起,自上而下,直到目标点的过程叫捕获。

        DOM 0 是检测不到捕获的,只能用DOM2来检测捕获的过程。

        DOM2绑定中的最后一个参数,是否捕获(true要捕获,false不捕获(冒泡))。 默认为false,不捕获。

      事件流(事件模型):

        当一个事件触发的时候,一般会经历3个过程,第一个为 捕获 阶段, 第二个为 目标 阶段,第三个为 冒泡 阶段。 这三个阶段就叫做事件流(事件模型)

      目标阶段:

        事件触发到目标元素的时候,会按照 代码(事件绑定)的先后顺序执行,不再是先捕获后冒泡。

    例子:

        <div id="div2">
            <button id="btn">点击</button>
        </div>
    <script>
        div2.addEventListener('click',function(){
            alert('捕获_div');
        },true)
        div2.addEventListener('click',function(){
             alert('冒泡_div');
         },false);
        btn.addEventListener('click',function(){
            alert('目标按钮_a');
        },false)
        btn.addEventListener('click',function(){
            alert('目标按钮_b');
        },true)
        btn.addEventListener('click',function(){
            alert('目标按钮_c');
        },false)
    </script>
    /*  点击btn时的弹框顺序:(1捕获阶段) 捕获_div => (2目标阶段) 目标按钮_a =>目标按钮_b => 目标按钮_c  =>(3冒泡阶段)  冒泡_div  */

    事件对象: MouseEvent

      当用户触发了某个事件的时候,那个事件函数的第一个参数就为事件对象,这个对象是记录了用户操作浏览器或者元素时的相关细节信息。

      低版本 IE 中的事件对象不在事件函数中,在window上,有个event属性。

      FF(火狐浏览器)下事件对象只有在事件函数的第一个参数中才有,window上是没有的。如果在FF下直接访问event就会报错(因为没有这个变量)

        解决:var ev = window.event || ev

      Chrome(谷歌浏览器) 中 window有,事件函数中的第一个参数也有

    事件源(事件监听):target

      事件对象其中有一个属性叫 target,能够捕获到事件触发时的源头是哪个元素。可以节省性能

      注意:只有嵌套关系,才能获得准确的事件源

    例子(冒泡的优点):

    <body>
        <ul id="ul">
            <li>1</li>
            <li>2</li>
            <li>3</li>
            <li>4</li>
            <li>5</li>
        </ul>
    <script>
    
        ul.onclick = function(ev){
            // console.dir(window.event);
            var ev = window.event || ev//兼容火狐和IE低版本
            console.log(ev.target);//可以输出点击的是谁(找到事件源)
            if(ev.target.nodeName === 'LI'){
                ev.target.style.background = 'green';
            }//如果事件源是 li 就让 它变绿
        }
    //把onclick绑在 ul 上,利用 冒泡 原理,改变 li 的样式,就不用通过循环 li 并绑定事件的方法来达到效果,优化性能。
    </script>
    </body>   

    阻止冒泡:(注意:取消冒泡 一定要 在事件源上阻止冒泡,能解决父级执行的问题)

      ev.cancelBubble = true // 阻止冒泡

      ev.cancelBubble  不是标准属性,但是所有浏览器都能兼容

      ev.stopPropagation()  这个是标准,但是低版本浏览器不兼容

    注意:

      在开发的过程中,如果2个元素时嵌套关系,就要小心,事件冒泡(2个事件尽量不要重名)

    例子(冒泡的缺点与解决办法):

        btn.onclick = function(ev){
            alert(1) 
            // ev.stopPropagation();
            ev.cancelBubble = true; //阻止了btn的onclick的事件不往上面冒泡。
        }

     事件默认行为:

      当用户触发某个事件的时候,某种行为不是我们主动写的而是浏览器默认可以做的,就叫事件默认行为。

    阻止默认行为:

      DOM 0中:在事件函数中,写 return  false

      DOM 2中:ev.preventDefault()

     例子:

        // document.onmousedown = function(){
        //     console.log('按下');
        //     return false;//DOM 0 中阻止默认行为
        // }
    
        document.addEventListener('mousedown',function(ev){
            //console.log('按下');
            ev.preventDefault();//DOM2中阻止默认行为
        });
    //如果在document下有一张图片,鼠标按下的时候可以触发事件默认的拖动行为,在阻止了默认行为的之后,就不能再触发拖动行为。

    常见的事件

    点击事件是由2个事件组合在一起的形成的新事件

    按下:onmousedown

    抬起:onmouseup 

    onclick  点击时触发

    ondblclick  双击事件

    onscroll  鼠标中键,带动滚动条滚动时触发。(滚动条发生位移,可视区变化时触发。(window.onscroll = function( ){ }   ))

    oncontextmenu  鼠标右键菜单

    onmousemove  鼠标移动事件

    onmouseover  鼠标移入时触发

    onmouseout   鼠标移出时触发

    onmouseenter  不会冒泡 ,也不会穿透  移入  

    onmouseleave  不会冒泡,也不会穿透   移出

    (不穿透:移入嵌套关系的子元素时,不会触发父元素的移出事件。不冒泡:移入嵌套关系的子元素时,不会触发父元素的移入事件。)

    ev.clientX / ev.clientY  鼠标到可视区(基于可视区)的 x、y 轴

    ev.pageX / ev.pageY  鼠标到可视区(基于页面)的 x、y 轴

    css中的 cursor,可以改变鼠标的样式

    例子:

    document.onmousemove = function(ev){
            //console.log(ev.pageY,ev.clientY);
            box.style.left = ev.clientX - box.offsetWidth/2 + 'px';
            // box.style.top = ev.clientY - box.clientHeight/2 + window.pageYOffset +'px';
            box.style.top = ev.pageY - box.clientHeight/2 + 'px';
        } //鼠标移动事件,让box跟着鼠标走
    鼠标移动的XY轴的小应用

    onresize  当页面缩放时触发

    onscroll   当滚动时触发

    onerror 事件在加载外部文件(文档或图像)发生错误时触发。(不支持冒泡,不能取消,语法上网查)

    onload  静态资源加载完成之后执行(window.onload)

    oninput  输入时触发,可动态获取内容

    onchange  表单元素的内容改变,失去焦点的时候触发

    onblur()  失焦时触发

    onfocus()  聚焦时触发

    select()  选中(选中表单内容,方便剪切复制,在没有内容的时候,也可以看做 聚焦)

    ele.focus()  自动聚焦   (css 中用 autofocus ,一个页面只有一个焦点元素会被激活,一开始,页面中有一个焦点,当按了tab键或者直接激活之后焦点会从页面(window,document)中移到焦点元素身上)

    ele.blur()  自动失焦

    window.onhashchange  当hash值发生变化时触发。语法:window.onhashchange = function (){ ‘放要执行的内容’ }


    按事件类型分类

    鼠标事件

    click 当用户点击某个对象时调用的事件句柄。 
    contextmenu 在用户点击鼠标右键打开上下文菜单时触发 
    dblclick 当用户双击某个对象时调用的事件句柄。 
    mousedown 鼠标按钮被按下。 
    mouseenter 当鼠标指针移动到元素上时触发。 
    mouseleave 当鼠标指针移出元素时触发 
    mousemove 鼠标被移动。 
    mouseover 鼠标移到某元素之上。 
    mouseout 鼠标从某元素移开。 
    mouseup 鼠标按键被松开。

    键盘事件

    属性 描述 DOM 
    keydown 某个键盘按键被按下。 
    keypress 某个键盘按键被按下并松开。 
    keyup 某个键盘按键被松开。

    键盘事件

    属性 描述 DOM 
    keydown 某个键盘按键被按下。 
    keypress 某个键盘按键被按下并松开。 
    keyup 某个键盘按键被松开。

    框架/对象(Frame/Object)事件

    abort 图像的加载被中断。 ( ) 
    beforeunload 该事件在即将离开页面(刷新或关闭)时触发 
    error 在加载文档或图像时发生错误。 ( , 和 ) 
    hashchange 该事件在当前 URL 的锚部分发生修改时触发。 
    load 一张页面或一幅图像完成加载。 
    pageshow 该事件在用户访问页面时触发 
    pagehide 该事件在用户离开当前网页跳转到另外一个页面时触发 
    resize 窗口或框架被重新调整大小。 
    scroll 当文档被滚动时发生的事件。 
    unload 用户退出页面。 ( 和 )

    表单事件

    blur 元素失去焦点时触发 
    change 该事件在表单元素的内容改变时触发( , , , 和 ) 
    focus 元素获取焦点时触发 
    focusin 元素即将获取焦点是触发 
    focusout 元素即将失去焦点是触发 
    input 元素获取用户输入是触发 
    reset 表单重置时触发 
    search 用户向搜索域输入文本时触发 (

    剪贴板事件

    copy 该事件在用户拷贝元素内容时触发 
    cut 该事件在用户剪切元素内容时触发 
    paste 该事件在用户粘贴元素内容时触发

    打印事件

    afterprint 该事件在页面已经开始打印,或者打印窗口已经关闭时触发 
    beforeprint 该事件在页面即将开始打印时触发

    拖动事件

    drag 该事件在元素正在拖动时触发 
    dragend 该事件在用户完成元素的拖动时触发 
    dragenter 该事件在拖动的元素进入放置目标时触发 
    dragleave 该事件在拖动元素离开放置目标时触发 
    dragover 该事件在拖动元素在放置目标上时触发 
    dragstart 该事件在用户开始拖动元素时触发 
    drop 该事件在拖动元素放置在目标区域时触发

    多媒体(Media)事件

    abort 事件在视频/音频(audio/video)终止加载时触发。 
    canplay 事件在用户可以开始播放视频/音频(audio/video)时触发。 
    canplaythrough 事件在视频/音频(audio/video)可以正常播放且无需停顿和缓冲时触发。 
    durationchange 事件在视频/音频(audio/video)的时长发生变化时触发。 
    emptied The event occurs when the current playlist is empty 
    ended 事件在视频/音频(audio/video)播放结束时触发。 
    error 事件在视频/音频(audio/video)数据加载期间发生错误时触发。 
    loadeddata 事件在浏览器加载视频/音频(audio/video)当前帧时触发触发。 
    loadedmetadata 事件在指定视频/音频(audio/video)的元数据加载后触发。 
    loadstart 事件在浏览器开始寻找指定视频/音频(audio/video)触发。 
    pause 事件在视频/音频(audio/video)暂停时触发。 
    play 事件在视频/音频(audio/video)开始播放时触发。 
    playing 事件在视频/音频(audio/video)暂停或者在缓冲后准备重新开始播放时触发。 
    progress 事件在浏览器下载指定的视频/音频(audio/video)时触发。 
    ratechange 事件在视频/音频(audio/video)的播放速度发送改变时触发。 
    seeked 事件在用户重新定位视频/音频(audio/video)的播放位置后触发。 
    seeking 事件在用户开始重新定位视频/音频(audio/video)时触发。 
    stalled 事件在浏览器获取媒体数据,但媒体数据不可用时触发。 
    suspend 事件在浏览器读取媒体数据中止时触发。 
    timeupdate 事件在当前的播放位置发送改变时触发。 
    volumechange 事件在音量发生改变时触发。 
    waiting 事件在视频由于要播放下一帧而需要缓冲时触发。

    动画事件

    animationend 该事件在 CSS 动画结束播放时触发 
    animationiteration 该事件在 CSS 动画重复播放时触发 
    animationstart 该事件在 CSS 动画开始播放时触发

    过渡事件

    transitionend 该事件在 CSS 完成过渡后触发。

    其他事件

    message 该事件通过或者从对象(WebSocket, Web Worker, Event Source 或者子 frame 或父窗口)接收到消息时触发 
    online 该事件在浏览器开始在线工作时触发。 
    offline 该事件在浏览器开始离线工作时触发。 
    popstate 该事件在窗口的浏览历史(history 对象)发生改变时触发。 event occurs when the window’s history changes 
    show 该事件当

    元素在上下文菜单显示时触发 

    storage 该事件在 Web Storage(HTML 5 Web 存储)更新时触发
    toggle 该事件在用户打开或关闭 元素时触发
    wheel 该事件在鼠标滚轮在元素上下滚动时触发

    课件:2018/11/16

  • 相关阅读:
    前端了解即可:postman(接口测试)的使用
    ES6——TDZ(暂时性死区)
    Centos自动安装openssh及openssl脚本并隐藏版本号
    ELK学习链接
    Centos7 中使用搭建devpi并且使用Supervisor守护进程
    ansible系列
    iperf3网络测试工具
    Centos6.9下PXE安装centos 7
    CentOS 6.9下PXE+Kickstart无人值守安装操作系统
    django学习篇
  • 原文地址:https://www.cnblogs.com/MrZhujl/p/9966248.html
Copyright © 2011-2022 走看看