zoukankan      html  css  js  c++  java
  • DOM笔记

    事件委托

    利用事件冒泡机制,委托事件给父级元素,比监听每个子元素的事件性能好。

    html

    <div style="height: 100px;">
      <ul>
        <li>1</li>
        <li>2</li>
      </ul>
    </div>
    

    js

    function foo(e) {
        if (e.target.nodeName.toLowerCase() === 'li') {
            e.target.style.background = '#000';
        }
    }
    document.querySelector('div').addEventListener('click', foo)
    

      

    监听div内容修改

    1.DOM2级中的mutation(变动事件)里的 DOMSubtreeModified 可以监听div内容修改

    document.querySelector('.element').addEventListener('DOMSubtreeModified', function(){
        alert(this);
    });
    

      

    2.MutationObserver构造函数可以监听div内容修改

    //兼容性
    var MutationObserver = window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver;
    var node = document.getElementById('node');
    
    //配置信息
    var config = {
        subtree: true,        //监听目标节点包括后代节点
        childList: true,      //监听目标节点的子节点是否增加或者移除
        attributes: true,     //监听目标节点的attributes属性的增删改
        characterData: true   //如果监听的目标节点是文本节点,同时监听节点的文本内容
    }
    
    //回调函数
    var func = function(re) {
        alert("success");
        console.log(re);
    }
    
    //生成实例
    var server = new MutationObserver(func);
    
    //调用配置信息和回调函数
    server.observe(node, config);
    

    事件监听会传入一个event对象。

    1.当事件绑定在触发的元素上,触发元素时,event.currentTarget 和 event.target 和 this 都指向这个元素。
    例:

    var btn = document.getElementById("nowBtn");
    btn.onclick = function(e) {
        console.log(e.currentTarget === this);   //true
        console.log(e.target === this);          //true
    }
    

      

    如果绑定在当前元素的父级元素,触发元素时,event.currentTarget 和 this 都指向这个父级元素。 event.target 则指向触发的元素。
    例:

    document.body.onclick = function(e) {
        console.log(event.currentTarget === document.body);                     //true
        console.log(this === document.body);                                    //true
        console.log(event.target === document.getElementById("nowBtn"));        //true
    }
    

      

    2.需要绑定多个事件时,可以利用event.type属性

    var btn = document.getElementById('myBtn');
    var handler = function(e) {
        switch(e.type) {
            case "click":
                console.log("click");
                break;
            case "mouseover": 
                event.target.style.backgroundColor = "#333";
                break;
            case "mouseout":
                event.target.style.backgroundColor = "#000";
                break;            
        }
    }
    btn.onclick = handler;
    btn.addEventListener("mouseover",handler);
    btn.onmouseover = handler;

    3.event.preventDefault()可以阻止元素的默认行为。

    如<a>元素默认行为是导航到href的URL,用事件处理就可以取消它(需要event.cancelable为true,默认为true)。

    var link = document.getElementById('myLink');
    link.onclick = function(e) {
        e.preventDefault();
    };


    4.event.stopPropagation()用来阻止捕获及冒泡。

    var btn = document.getElementById('myBtn');
    btn.onclick = function(e) {
        console.log("click");
        event.stopPropagation();    //执行完后阻止冒泡到body的click事件
    };
    
    document.body.onclick = function(e) {
        console.log('body click');
    };


    keyCode可以直接转换成大写字母和数字

    回车等特殊键无法转换,符号转换错误。

    var key;
    document.getElementById('element').addEventListener('keydown', function(e){
        key = e.keyCode;
    })
    key = String.fromCharCode(key);
    

      


    HTML5事件

    1.监听contextmenu事件用preventDefault()方法阻止冒泡后,可以阻止右键弹出的上下文菜单。这个事件是冒泡事件,监听document可以阻止所有元素的contextmenu事件。

    2. haschange事件可以监听URL参数变化(主要用于Ajax),这个事件只能添加给window对象。此时的 event 会多出 oldURL 和 newURL,例:

    window.addEventListener('haschange',function(e){
        console.log(e.oldURL);
        console.log(e.newURL);
    })
    

      

  • 相关阅读:
    .NET的SqlHelper应用代码
    .NET获取客户端的操作系统、IP地址、浏览器版本
    Codevs 3981 动态最大子段和
    洛谷 P3373 【模板】线段树 2
    一些笔记【杂】
    洛谷 P1432 倒水问题
    洛谷 P2324 [SCOI2005]骑士精神
    Codevs 1010 过河卒
    POJ 3278 Catch That Cow
    洛谷P2184 贪婪大陆
  • 原文地址:https://www.cnblogs.com/NKnife/p/6089273.html
Copyright © 2011-2022 走看看