zoukankan      html  css  js  c++  java
  • JavaScript 事件

    事件的绑定

    • 兼容性很好,但是一个元素的同一事件只能绑定一个,基本等同于写在HTML行间上
    div.onclick = function ()
    • IE9以下不兼容,可以为一个事件绑定多个处理函数,不能同一个函数绑定多次 this指向div
    div.addEventListener("click", function () {
               console.log("a");
    }, false);
    
    • ie9用的,可以绑定多个处理函数,或多个相同的处理函数 this指向window
    div.attachEvent("onclick",function(){
       console.log("a");
    });
    

    绑定事件兼容性封装

    /**
     * 给任意元素绑定事件
     * @param {任意元素} elem 
     * @param {事件类型} type 
     * @param {处理函数} handle 
     */
    function addEvent(elem, type, handle) {
        if (elem.addEventListener) {
            elem.addEventListener(type, handle, false);
        } else if (elem.attachEvent) {
    
            elem.attachEvent('on' + type, function () {
                //为了把this指向的window,改成this指向elem
                handle.call(elem);
            })
        } else {
            elem['on' + type] = handle;
        }
    }
    

    事件的解除

    • 直接赋值方法
    div.onclick=null;
    • 方法解除
    div.removeEventListener('click',函数写到外面可以清除,false);
    • ie9的解除
    div.detachEvent('onclick',fn);
    

    事件解除的封装

    /**
     * 删除事件
     * @param {*} elem 
     * @param {*} type 
     * @param {*} handle 
     */
    function removeEvent(elem, type, handle) {
        if (elem.removeEventListener) {
            elem.removeEventListener(type, handle, false);
        } else if (elem.detachEvent) {
            elem.detachEvent("on" + type, handle);
        } else {
            elem["on" + type] = null;
        }
    }
    

    事件处理模型

    • 事件冒泡:结构上(非视觉上)嵌套关系的元素,会存在冒泡的功能,即同一事件,自子元素冒向父元素   focus blur change submit reset select没有冒泡
    <div class="wrapper">
            <div class="content">
                <div class="box"></div>
            </div>
    </div>
    

      

    wrapper.addEventListener("click",function(){
                console.log("wrapper");
    },false);
    content.addEventListener("click",function(){
                console.log("content");
    },false);
    box.addEventListener("click",function(){
                console.log("box");
    },false);
    • 事件捕获:结构上(非视觉上)嵌套关系的元素,会存在事件捕获事件,子父元素捕获至子元素 ie没有事件捕获
    wrapper.addEventListener("click",function(){
                console.log("wrapper");
    },true);
    content.addEventListener("click",function(){
                console.log("content");
    },true);
    box.addEventListener("click",function(){
                console.log("box");
    },true);

    触发顺寻 先捕获后冒泡 当前点击的为事件执行按照绑定顺序执行

    取消事件冒泡

    • w3c:e.stopPropagation();
    • ie:e.cancelBubble=true;

    默认事件

    • 右键菜单事件
    document.oncontextmenu=function(e){
           // 禁止右键菜单事件
                1、return false;
                2、e.preventDefault(); //w3c标准
    }
    
    • a href="javascript:void(0)" 相当于return false 禁止默认事件

    事件源兼容性获取方法

    事件兼容性写法 var event= e|| window.event;
    事件源兼容性写法 var target = event.target || event.srcElement

    事件委托机制

    var ul = document.getElementsByTagName("ul")[0];  //事件委托机制   性能高
    ul.onclick = function (e) {
    var event = e || window.event;
    var target = event.target || event.srcElement;
        console.log(target.innerText);
    }
    

    拖拽事件封装  

    /**
     * 拖拽实现
     * @param {需要拖拽的元素} elem 
     */
    function drag(elem) {
        var disX,
            disY;
        addEvent(elem, 'mousedown', function (e) {
            var event = e || window.event;
            disX = event.clientX - parseInt(getStyle(elem, 'left'));
            disY = event.clientY - parseInt(getStyle(elem, 'top'));
            addEvent(document, 'mousemove', mouseMove);
            addEvent(document, 'mouseup', mouseUp);
            stopBubble(event);
            cancelHandler(event);
        });
    
        function mouseMove(e) {
            var event = e || window.event;
            elem.style.left = event.clientX - disX + "px";
            elem.style.top = event.clientY - disY + "px";
        }
    
        function mouseUp(e) {
            var event = e || window.event;
            removeEvent(document, 'mousemove', mouseMove);
            removeEvent(document, 'mouseup', mouseUp);
        }
    }

    鼠标事件

    click、mousedown、mouseup
    click = mousedown+mouseup
     
    mouseover、mouseout //进入区域 离开区域
    mouseenter、mouseleave //进入区域 离开区域
     
    区分左右键 mousedown mouseup e.button ==2 right e.button==0 left
     
    dom3 click只监听左键

    键盘事件

    keydown、keyup、keypress
    keydown > keypress > keyup
    keydown 可以监测所有键
    keypress 只返回有asii表的按键, (String.fromCharCode(e.charCode))

    文本框事件

    input 里面有变化就会触发
    change 聚焦和失去焦点 变化触发
    focus
    blur

    window事件

    load

    1、 浏览器渲染 过程 先domtree csstree rendertree
    2、load 渲染过程完成执行 所有下载完成 尤其有大的图片下载的时候,load效率会很低   主程序不可以放load里面
  • 相关阅读:
    一些想说的事
    化学离子平衡作业偷懒神器
    solution
    SGU 刷题记
    INT128
    # 字典树的指针写法 1.
    CSP-S2 游记
    Tarjan 【整理】
    HGOI 20191106
    20191101
  • 原文地址:https://www.cnblogs.com/FashionDoo/p/10932620.html
Copyright © 2011-2022 走看看