zoukankan      html  css  js  c++  java
  • js-web-api

     

    DOM Document Object Model文档对象模型

    DOM本质:js对象

    dom树是由各种各样的节点构成,获取的元素其实是DOM树中一个元素节点。

    在 HTML DOM (Document Object Model) 中,

    每一个元素都是 节点对象(Node object)。所有html标签元素称为元素节点对象(简称元素节点);所有html标签上的属性成为属性节点对象。

    JavaScript中的所有节点都继承JS内部实现的Node基类。

    区分节点的方法。nodeType 元素节点nodeType=1;属性节点nodeType=2;文本节点nodeType=3

     

    DOM常见操作

    获取元素节点

    document.getElementById;element.getElementByTagName();element.getElementByClassName();element.querySeletor(selector);element.querySeletorAll(selector)

     DOM查找元素:getElementById getElementsByTagName getElementsByClassName
          getElementById
          根据id找元素,如果有多个相同id,只会找到第一个。如果找不大id,返回null
          getElementById是document才可以调用的方法。
          getElementsByTagName getElementsByClassName 根据html标签名或者类名查找元素
          返回是HTMLCollection类数组对象,可以通过下标索引取值
          HTML DOM 中的 HTMLCollection 是即时更新的(live);当其所包含的文档结构发生改变时,它会自动更新。
          element.querySelector(selectors) element.querySelectorAll(selectors)
          querySelector返回css选择器(html标签,class id都可以)第一个元素。找不到返回null
          querySelectorAll 返回NodeList类数组对象集合,找不到返回NodeList []
          在其他情况下,NodeList 是一个静态元素集合,也就意味着随后对文档对象模型的任何改动都不会影响集合的内容
    View Code

     设置和读取元素节点属性

     innerHTML innerText outerHTML className  style

    Element.innerHTML 可读可写;读:获取当前元素下所有的子元素;写:替换当前元素下所有的子元素。写入的是html超文本(大白话:会解析html标签)
    Element.innerText 可读可写;读:获取当前元素下所有的子元素的文本内容;写:替换当前元素下所有的子元素。写入的是文本(大白话:不会解析html标签,直接渲染输出到页面)
    Element.outerHTML可读可写;读:获取当前元素下所有内容(自己+子元素);写:替换当前元素下所有的子元素。但是自己还在
    Element.className 可读可写;读:获取当前元素节点的class ;写:设置当前元素节点的class类名。string类型
    Element.style 可读可写;读:获取当前元素节点的行内样式 ;写:设置当前元素节点的行内样式值
     
    Element.setAttribute 设置指定元素上的某个属
     const fa = document.querySelector('.fa')
        const son = document.querySelector('.son')
        const a = document.querySelector('a')
        son.addEventListener('click', clickSon, false)
        fa.addEventListener('click', clickFa, false)
    
        function clickSon(event) {
          event = event || window.event
          event.stoppropagation ? event.stoppropagation() : event.cancelBubble = true
    
          console.log('son');
        }
    
        function clickFa(event) {
          event = event || window.event
          console.log('fa');
        }
    View Code
     

    attributes property

    节点操作(增删改查)

    增加节点并添加DOM中 

    createElement  appendChild
       const wrapper = document.querySelector("#wrapper");
          const newDiv = document.createElement("div"); //createElement是document特有方法 产生一个Node js对象
          newDiv.innerHTML = "我是新加的元素";
          const divStr = "<div>append</div>";
          wrapper.appendChild(newDiv);
    View Code

    插入parentElement.insertBefore(newElement,oldElement)

     const wrapper = document.querySelector("#wrapper"); //父节点
          const demo = document.getElementById("demo"); //已经存在的子节点
    
          const newDiv = document.createElement("div");
          newDiv.innerHTML = "i am new";
          wrapper.insertBefore(newDiv, demo); //parentElement.insertBefore(newElement,oldElement)
    View Code

    注意没有insertAfter方法。如果要需要自己实现

    用新节点替换已有节点replaceChild

     const wrapper = document.querySelector("#wrapper"); //父节点
          const demo = document.getElementById("demo"); //已经存在的子节点
    
          const newDiv = document.createElement("div");
          newDiv.innerHTML = `<p>i am new</p>`;
          wrapper.replaceChild(newDiv, demo);
    View Code

    cloneNode(fasle|true) 克隆节点 默认是false.表示不克隆子节点

    const wrapper = document.querySelector("#wrapper"); //父节点
          const cloneWrapper = wrapper.cloneNode(true);
          document.body.appendChild(cloneWrapper);
    View Code

    删除节点

    remove removeChild

      const wrapper = document.querySelector("#wrapper"); //父节点
          const demo = document.querySelector("#demo");
          wrapper.removeChild(demo); //父亲来杀
          demo.remove(); //自杀
    View Code

    文档碎片document.createDocumentFragment()

    提升DOM操作性能。只需要插入文档对象一次。并且文档对象是dom  js元素存在内存中。追加到页面中,文档碎片被其所有的子元素代替。也就是文档碎片不会出现在DOM中

     const arr = [100, 200, 300];
          const wrapper = document.getElementById("wrapper");
          const frag = document.createDocumentFragment();
          arr.forEach((item) => {
            const newP = document.createElement("p");
            newP.innerHTML = item;
            frag.appendChild(newP);
          });
          wrapper.appendChild(frag);
    View Code

    事件

    事件是DOM元素天生自带的行为属性,我们操作元素就会触发对应事件行为。那为什么不触发效果?是因为没有给事件绑定方法

    事件绑定:给dom元素天生自带的事件行为绑定方法。当事件触发就把绑定的方法执行。

    常见元素天生自带的事件(名):鼠标事件 键盘事件 焦点事件

    鼠标事件:click mousedown 

    键盘事件:keydown  keypress keyup

    焦点事件:blur  focus(获取焦点)

    事件绑定

    DOM0级事件绑定:

      element.onxxx=function(e){}

      element.onxxx=null (解绑)

    DOM2级事件绑定:

      element.addEventListener(事件名,函数,boolean) boolean默认是false 表示在冒泡阶段执行函数

      element.removeEventListener(事件名,函数,boolean) 解绑事件

    DOM2和DOM0区别

    DOM2可以绑定多个事件(事件名可以相同或者不同),依次执行,不会覆盖

     通用型事件绑定和解绑(考虑兼容)

     function bind(element, type, fn) {
          // DOM2级别事件绑定
          if (element.addEventListener) {
            return element.addEventListener(type, fn, false)
          }
          // IEDOM2级别事件绑定
          if (element.attachEvent) {
            return element.attachEvent('on' + type, fn)
          }
          // DOM0事件绑定
          element['on' + type] = fn
        }
    
        function unbind(element, type, fn) {
          if (element.removeEventListener) return element.removeEventListener(type, fn, false)
          if (element.detachEvent) return element.detachEvent('on' + type, fn) //DOM2级别IE解绑
          element['on' + type] = null // DOM0事件解绑
        }
    View Code

    事件默认行为preventDefault

    事件是元素天生自带的行为,有些事件触发了即使没有绑定方法,也会默认触发一些效果行为,这个就是默认行为

    比如点击超链接会跳转

     function handleClick(e) {
          e = e || window.event;
          e.preventDefault ? e.preventDefault() : e.returnValue = false
    
          e.preventDefault()
        }
        a.addEventListener('click', handleClick, false)
    View Code

    事件传播

    事件传播机制(事件流):包括三个阶段:事件捕获阶段->目标事件阶段->事件冒泡阶段
     事件捕获阶段:
     目标事件阶段:执行事件源的相关事件(如果绑定事件)
     事件冒泡阶段:不仅会触发当前元素事件,也会触发祖先元素相关事件。
      (比如说儿子本身的点击事件被触发,儿子的祖先元素点击事件也会触发,如果祖先元素绑定了事件,就会执行事件逻辑,如果没绑定事件,那么什么都不做)
     

    阻止事件冒泡stoppropagation

     const fa = document.querySelector('.fa')
        const son = document.querySelector('.son')
        const a = document.querySelector('a')
        son.addEventListener('click', clickSon, false)
        fa.addEventListener('click', clickFa, false)
    
        function clickSon(event) {
          event = event || window.event
          event.stoppropagation ? event.stoppropagation() : event.cancelBubble = true
    
          console.log('son');
        }
    
        function clickFa(event) {
          event = event || window.event
          console.log('fa');
        }
    View Code

    事件委托

    利用事件冒泡的机制,把事件绑定到父节点元素身上,从而管理子节点元素某一类事件

    好处:1只需要给父节点元素绑定一个函数,就可以管理子元素节点某一类事件。显著减少内存消耗,提升性能。2动态增加的子元素节点自动注册事件

    e.currentTarget: 当前正在处理事件的那个元素。同this指定的元素对象

    e.target :事件源(也就是目标阶段的元素)

    例子

    点击ul下任意的一个li  变红色
      // 点击任意的一个li  变红色
        const ul = document.querySelector('ul')
        ul.addEventListener('click', changeSonColor, false);
    
        function changeSonColor(e) {
          e = e || window.event
          const li = e.target
          li.style.color = 'red'
    
        }
    View Code

     无线下拉的图片列表,如何监听每隔图片的点击? 还是事件代理。e.target e.nodeName="img"

     
  • 相关阅读:
    JUC学习笔记--从阿里Java开发手册学习线程池的正确创建方法
    1.初识Python
    学会 Debug
    如何找出nginx配置文件的所在位置?
    一个技术人,如何做到比别人更突出
    生产环境如何快速跟踪、分析、定位问题-Java
    如何优化代码中大量的if/else,switch/case?
    UML类图几种关系的总结
    DateUtils常用方法
    如何存储和表示数字—二进制(一)
  • 原文地址:https://www.cnblogs.com/xiaoliziaaa/p/13803659.html
Copyright © 2011-2022 走看看