JS基础-事件

作者: 壹枕星河 | 来源:发表于2019-02-22 17:38 被阅读6次

事件

用户的行为:onclick、ondblclick、onfocus、onblur、window.onload
是用户跟页面的交互,当用户跟页面进行一些“交流”的时候,页面通过js就会触发一些事件,比如鼠标点击的时候就会触发onclick事件,给这个事件绑定一个函数,那么这个时候函数就会被调用,代码就会被执行。

事件类型:

鼠标事件:click,dbclick,mousedown,mouseup,mouseover,
    mouseout,mouseenter(鼠标穿过元素)、mouseleave(鼠标离开元素)、
    mousemove、scroll(适用于所有可以滚动的元素和window对象)、mousewheel
    鼠标滚轮、contextmenu  鼠标右键(上下文菜单:在不同环境下右键菜单不一样)

    其中
    mouseover:鼠标在元素身上移动穿过子元素的时候会被反复触发
    mouseenter:只是在进入元素的时候触发

键盘事件:keydown,keyup,keypress
事件举例:
<div id="box">box</div>
        <script>
            var box = document.getElementById("box");
            //绑定事件
            box.onclick = function(){
                alert("click");
            }
            
            function foo(){
                alert("foo");
            }
            
            box.onmouseover = foo;
            
        </script>

表单事件:对表单元素操作之后会触发的事件

  单选框、多选框、下拉菜单 状态改变的时候会触发  onchange 事件。
  表单提交的时候会触发 onsubmit   触发在<form>元素身上。
表单事件举例:
<form id="form">
            <input type="text" id="num">
            <select id="sel">
                <option>成都</option>
                <option>北京</option>
                <option>上海</option>
            </select>
            <input type="checkbox" id="check">
            
            <button type="button">按钮</button>
            <input type="submit" value="提交" id="btn">
        </form>
        <script>
            var input = document.getElementById("num");
            input.onfocus = function(){
                console.log("获得焦点");
            
            }
            input.onblur = function(){
                console.log("失去焦点");
                //console.log(input.value);
                var value = this.value;
                //是否大于6位
                if(value.length > 6){
                    console.log("满足要求");
                    
                }else{
                    console.log("请输入大于6位");
                }
            }
            
            var sel = document.getElementById("sel");
            //重新选择的时候,触发onchange事件
            sel.onchange = function(){
                console.log(this.value);
            }
            
            var check = document.getElementById("check");
            check.onchange = function(){
                console.log(this.checked); //是否选中的状态(true\false)
            }
            
            var form = document.getElementById('form');
            console.log(btn);
            form.onsubmit = function(e){
                //表单提交事件
                console.log("提交");
                e.preventDefault();
                return false;
            }
        </script>

this关键字:事件函数里面的this指的是事件触发对象。
事件的原理和hover类似。可以做到:hover做不到的事,:hover只能操作当前的元素,但是事件绑定之后可以选择任何元素。

事件触发三要素:通过谁触发? 通过什么触发?触发后要做什么?
事件的写法:

w3c标准:事件写在行内,但是因为结构和行为要分离,所以我们一般情况下用JavaScript的方法来绑定事件,只有再极少数情况下,才将事件写在行内,事件的绑定方法:

浏览器中的节点(对象).on+事件句柄 = function( ){
要干什么?(放在浏览器中,不执行,当事件发生的时候再执行。)
}

oDiv.onclick=function(){     

 alert(1)

}
事件总结:事件是给浏览器定义一个预处理函数,当事件触发的时候,执行函数,这就是事件。
事件对象兼容写法: e=e || window.event;


鼠标事件.png

案例:一串div跟着鼠标移动

<style>
            div{height: 20px;width: 20px;background: red;position: absolute;}
        </style>
    </head>
    <body>
        <script>
            var aDiv = [];
            var cache = document.createDocumentFragment();
            for(var i = 1; i <= 20; i++){
                var div = document.createElement("div");
                div.innerHTML = i;
                aDiv.push(div);
                //document.body.appendChild(div);
                cache.appendChild(div);
            }
            document.body.appendChild(cache);
            
            //document绑定mousemove事件
            document.onmousemove = function(e){
                e = e || event;
                var mouseX = e.clientX,
                    mouseY = e.clientY;
                
                /* aDiv[0].style.left = mouseX + "px";
                aDiv[0].style.top = mouseY + "px"; */
                
                //从后往前,一次进一步
                for(var i = aDiv.length-1; i > 0; i--){
                    aDiv[i].style.left = aDiv[i-1].style.left;
                    aDiv[i].style.top = aDiv[i-1].style.top;
                }
                //第0个赋值未当前鼠标坐标
                aDiv[0].style.left = mouseX + "px";
                aDiv[0].style.top = mouseY + "px";
                
            }
        </script>
    </body>

键盘事件:keydown、keyup、keypress

document.onkeydown = function(e){
    console.log(e.keyCode)   
}

键盘上每一个键都有一个唯一的编码,用来识别当前用户正在操作的是键盘上哪一个键.

有兼容问题 兼容写法:e.keyCode || e.which

特殊键码:是否按下alt ctrl 和 shift
e.altKey
e.ctrlKey
e.shiftKey
返回值是布尔值;
可以用来判断组合键

if(e.keyCode==13&&e.altKey){
     alert('同时按下了enter和alt');
}

默认行为(浏览器)

有一些html元素默认的行为,比如说a标签,点击后有跳转动作;form表单中的submit类型的input有一个默认提交跳转事件;reset类型的input有重置表单行为。
但是,有些时候我们是不需要默认事件的,所以就需要阻止默认事件.

方法1.return false;

方法2.
if(e.preventDefault) {
      e.preventDefault();
      }
else {
    window.event.returnValue = false;    
    //return false;
}

一个完整事件包含 捕获阶段 ---> 目标阶段 --->冒泡阶段
子元素的事件被触发时,父级也会被触发(冒泡)

<body>
        <div id="yeye">
            <div id="baba">
                <div id="erzi"></div>
            </div>
        </div>
        <script>
            yeye.onclick = function(){
                console.log("yeye");
            }
            baba.onclick = function(e){
                console.log("baba");
                //阻止冒泡
                e.stopPropagation();
                e.cancelBubble=true;//兼容IE
            }
            erzi.onclick = function(){
                console.log("erzi");
            }
        </script>
    </body>

冒泡是可以阻止的

 e.stopPropagation( );
 e.cancelBubble=true;//兼容IE
事件监听

DOM2级事件处理是所有DOM节点中的方法,可以重复绑定,但是浏览器兼容存在问题;

 //DOM2级
if(window.attachEvent){
    oDiv.attachEvent("onclick", function(){ ... });  // IE只有冒泡阶段,所以没有第三个参数,而且需要加on;
}else{
    oDiv.addEventListener( "click", function(){ ... },false);  // false指冒泡阶段
}
/* 监听事件
     * @param obj DOMObj 监听事件的对象
     * @param type string 事件句柄
     * @param fn   function 事件处理函数 
     * @param [isCapture] boolean false代表冒泡,true代表捕获 默认值是false
     */
    on : function(obj, type, fn, isCapture){
        if(isCapture === undefined) isCapture = false;
        if(obj.attachEvent){
            //IE只能再冒泡阶段处理事件
            obj.attachEvent("on"+type, fn);
        }else{
            obj.addEventListener(type, fn, isCapture);
        }
    },
<body>
        <div id="yeye">
            <div id="baba">
                <div id="erzi"></div>
            </div>
        </div>
        <script>
            //绑定只能绑一个,后面覆盖前面
            /* yeye.onclick = function(){
                console.log("yeye");
            }
            yeye.onclick = function(){
                console.log("yeye2222");
            } */

            //监听事件,可以同时监听多个
            //第三个参数传false代表不捕获(再冒泡阶段处理事件)
            //第三个参数传true代表捕获(再冒捕获段处理事件)
//          yeye.addEventListener("click", function(){
//              console.log("yeye");
//          },true);
//          
//          yeye.addEventListener("click", function(){
//              console.log("yeye222");
//          },true);
//          
//          baba.addEventListener("click", function(){
//              console.log("baba");
//          },true);
//          
//          erzi.addEventListener("click", function(){
//              console.log("erzi");
//          },true);

            tools.on(yeye, "click", function(){
                console.log("yeye");
            })
        </script>
    </body>

移除事件监听,第二个参数为必须,移除的事件处理函数

oDiv.removeEventListener( "click",fn)

oDiv.detachEvent("onclick",fn)
事件委托(事件代理)委派

事件委托就是利用事件冒泡,只指定一个事件处理程序,就可以处理某一类型的所有事件

使用场景主要用于事件源不确定的情况,可以把事件委托给父级
判断事件源:
e.target || e.srcElement

<body>
        <ul>
            <li>item1</li>
            <li>item2</li>
            <li>item3</li>
            <li>item4</li>
        </ul>
        <button>按钮</button>
        <script>
            var ul = document.querySelector("ul");
            /* var aLi = document.querySelectorAll("li");
            aLi = Array.from(aLi);
            console.log(aLi);
            aLi.forEach(function(li, index){
                li.onclick = function(){
                    console.log(this.innerHTML);
                }
            }) */
            
            //事件委托
            ul.onclick = function(e){
                e = e || event;
                //获取事件源
                var target = e.srcElement || e.target;
                if(target.nodeName === "LI")
                    console.log(target.innerHTML);
                
                //this
            }
            
            document.querySelector("button").onclick = function(){
                var li = document.createElement("li");
                li.innerHTML = "wgrf";
                ul.appendChild(li);
            }
            
        </script>
    </body>

相关文章

  • Node.js快刀篇

    Node.js概览 - Node.js大俗话,环境的安装和开发环境布署。 Node.js基础 - 事件机制和事件环...

  • js基础-事件

    注册/移除事件的三种方式 1. on的方式 事件源.on+事件类型 = 事件处理程序 缺点:只可以注册一次同类型的...

  • JS基础-事件

    事件 用户的行为:onclick、ondblclick、onfocus、onblur、window.onload是...

  • Node.js 的 events 模块

    Node.js 没有浏览器的事件冒泡、事件捕获机制。 events 模块是 Node.js 基础及重要的模块, 只...

  • 学习总结目录

    javascript基础 js数据类型面向对象继承js的this指向自己实现call,apply,bindjs事件...

  • JS异步那些事 一 (基础知识)

    JS异步那些事 一 (基础知识)JS异步那些事 二 (分布式事件)JS异步那些事 三 (Promise)JS异步那...

  • JS异步那些事 三 (Promise)

    JS异步那些事 一 (基础知识)JS异步那些事 二 (分布式事件)JS异步那些事 三 (Promise)JS异步那...

  • JS异步那些事 四(HTML 5 Web Workers)

    JS异步那些事 一 (基础知识)JS异步那些事 二 (分布式事件)JS异步那些事 三 (Promise)JS异步那...

  • JS异步那些事 二 (分布式事件)

    JS异步那些事 一 (基础知识)JS异步那些事 二 (分布式事件)JS异步那些事 三 (Promise)JS异步那...

  • JS异步那些事 五 (异步脚本加载)

    JS异步那些事 一 (基础知识)JS异步那些事 二 (分布式事件)JS异步那些事 三 (Promise)JS异步那...

网友评论

    本文标题:JS基础-事件

    本文链接:https://www.haomeiwen.com/subject/npaeyqtx.html