Web全栈20201128-js的dom操作1

  1. 在后边做程序 必须使用dom元素操作,dom的全名称document object model(文本对象模型),整个页面浏览器上所有元素统称为dom
    dom树: window html(元素标签) location history
    在这里插入图片描述
  2. 怎么使用dom: 操作dom:
    2-1.dom元素获取
    2-2.dom元素属性操作(常规属性操作)
    2-3.dom元素节点操作(子父节点之类的)
    2-4.dom元素的事件(行为)
    2-5.dom元素的方法操作
  3. dom元素的八个方案:
    == js里面dom元素操作不支持隐式迭代(js操作dom不能直接操作一堆,只能单个操作)==
    3-1.两个固定获取(静态获取)
    3-1-1类似css元素选择器获取:querySelector 获取之后返回的对象为单个对象;querySelectorAll 返回的是多个对象 集合类型NodeList。返回的是一个集合 这个集合至少有一个子集。
    == queryselect为什么只获取第一个,因为第一个已经拿到了就不拿第二个了==
    3-1-2静态获取 指的是获取页面现有的元素,通过代码添加元素 获取不到
    3-2.四个动态获取
    3-2-1 //id 获取返回是单个对象id要先有才能获取
    var btnid=document.getElementById(“btninfo”);
    console.log(btnid);
    id获取特殊用法
    id dom获取特殊用法:
    //不用获取 可以直接使用
    console.log(btninfo); //id是唯一的 可以直接使用做为当前dom
    3-2-2 //class获取返回的是 HTMLCollection 集合类型 按照单个对象的用法来用 key:value
    var btnclass=document.getElementsByClassName(“btn”);
    console.log(btnclass[0]);
    console.log(btnclass[1]);
    3-2-3 //通过元素标签名称 获取的返回HTMLCollection 集合使用同class
    var btnTagName=document.getElementsByTagName(“button”);
    console.log(btnTagName[0]);
    console.log(btnTagName[1]);
    3-2-4//通过Name属性获取 返回NodeList 集合 用法同上
    var btnName=document.getElementsByName(“but”);
    console.log(btnName[0]);
    console.log(btnName[1]);
    3-3. 两个特殊获取
    3-3-1//body
    var body=document.body;
    console.log(body);
    3-3-2//html
    var html=document.documentElement;
    console.log(html);
  4. dom元素属性操作(常规属性操作是属性获取或者设置)
    操作dom属性和方法
    4-1操作类名称
console.log(btnlist.className);
    console.log(btnlist.name);
    console.log(btnlist.id);
    console.log(btnlist.style);
    console.log(btnlist.style.width);
    console.log(btnlist.style.height);

4-2设置属性和设置类

btnlist.className="btn pink";
btnlist.classList.add("data");//类添加
    console.log(btnlist.classList.contains("pink"));//检测元素是否具有某个类  true false
    console.log(btnlist.classList.length);//输出元素类几个
    btnlist.classList.remove("data");//移除类
    //toggle  参数2  boolean  true  添加   false  移除   可以不写
    btnlist.classList.toggle("pink",false);//类别的切换

4-3style的设置 原生js可以单独设置元素的行内样式

  btnlist.style.width="200px";
    btnlist.style.backgroundPosition="0px 0px";
    btnlist.style.border="1px solid red";
    btnlist.style="width:120px;height:30px; color:blue;";

4-4元素的自定义属性的设置和获取
4-4-1设置自定义属性:btnlist.setAttribute("cls-tag","自定义");
4-4-2获取自定义属性:console.log(btnlist.getAttribute("cls-tag"));
4-5获取当前元素的非行内样式方法:console.log(window.getComputedStyle(btnlist).backgroundColor);
(下面这个是报错的,只能获取非行内样式,不能设置,因为 read-only 只读的
//window.getComputedStyle(btnlist).width=“200px”;)

  1. dom元素子父节点操作
    5-1获取当前元素的同胞兄弟元素
    nextElementSibling 下一个元素
    previousElementSibling 前一个元素
    nextSibling 获取的是下一个节点 (节点包含 符号 文本 元素)
    previousSibling 获取的是上一个节点 (节点包含 符号 文本 元素)
    var btn=document.querySelector("#btn");
     console.log(btn.nextElementSibling);
    console.log(btn.nextSibling);
    console.log(btn.previousElementSibling);
    console.log(btn.previousSibling);

5-2获取元素的子元素或者子节点
childElementCount 获取子元素的个数
children 获取的是子元素的集合
childNodes 获取的是子节点集合

   console.log(menu.childElementCount);
    console.log(menu.children);

5-3 获取元素的父元素或者父节点

console.log(liinfo.parentElement);
 console.log(liinfo.parentNode);

5-4对子元素进行遍历

for (var i = 0; i < menu.children.length; i++) {
    
    
        console.log(menu.children[i]);
    }
 console.log(menu.childNodes);

5-5对子节点进行遍历:子节点包含 文本符号,元素
节点属性
nodeName 节点名称
nodeType 节点类型由数字表示: 1 元素 3 符号等
nodeValue 节点值

for (var i = 0; i < menu.childNodes.length; i++) {
    
    
 console.log(menu.childNodes[i]);
 console.log(menu.childNodes[i].nodeType);
  console.log(menu.childNodes[i].nodeValue);
  if (menu.childNodes[i].nodeName.toLowerCase() == "li") {
    
    
        console.log(menu.childNodes[i].childNodes[0].nodeValue);
    }
}

5-6获取子节点最后一个和第一个
firstChild 获取元素里面的第一个子节点
firstElementChild 获取第一个子元素
lastChild 获取元素的最后一个子节点
lastElementChild 获取最后一个元素

console.log(menu.firstChild);
console.log(menu.firstElementChild);
console.log(menu.lastChild);
console.log(menu.lastElementChild);

5-7动态创建dom元素
5-7-1追加到页面元素

var ipt = document.createElement("input");
    ipt.type = "button";
    ipt.value = "按钮";
    console.log(ipt); 

5-7-2子元素追加方法:appendChild (追加到当前元素的内容之后):document.body.appendChild(ipt);
5-8追加:
5-8-1insertBefore 将插入的节点 添加已有的节点之前
5-8-2insertAfter由 原生js不存在, 实现insertAfter的功能 插入到一个节点之后

document.body.insertBefore(ipt, userName);
    Node.prototype.insertAfter = function (newchild, refchild) {
    
    
        console.log(this);
        this.insertBefore(newchild, refchild.nextElementSibling);
    }
 document.body.insertAfter(ipt, userName);

5-9克隆节点:cloneNode 赋值节点 参数true 克隆子节点:document.body.appendChild(ipt.cloneNode());
5-9dom元素节点移除:document.getElementsByTagName("h1")[0].remove();

扫描二维码关注公众号,回复: 13119537 查看本文章
  1. dom元素事件处理机制(dom元素事件流)
    原生js事件全部带on
    dom元素事件:
    window事件:onload onresize onreload onerror oncontentmenu onscroll
    鼠标事件: onmouseenter onmouseleave(水平离开) onmouseout(垂直+水平离开) onmouseup
    onmousdown onclick ondbclick onmousewheel onmouseover onmousemove
    键盘事件:onkeydown onkeyup onkeypress
    表单事件:onfocus onblur onsubmit onreset

  2. jsdom元素如何添加事件
    7-1.直接在元素行内直接操作事件绑定, this指针指向当前事件的执行对象
    7-7-1

 function fun1() {
    
    
        //直接在元素上添加事件
        //函数不传递this  函数内部的this  指window
        //如果传递this  函数内部的参数  指当前的对象
        console.log("你点我", this);
    }
    function fun2() {
    
    
        console.log("你悬停我");
    }
    but.click();

7-1-2获取元素的属性

console.log(but.attributes);
 but.attributes.removeNamedItem("onmouseover");
 console.log(but.attributes.getNamedItem("onmouseover"));

7-1-3 设置属性

  var args=document.createAttribute("onmousemove");
     args.nodeValue="fun2()";
     but.attributes.setNamedItem(args);
but.setAttribute("onmousemove",'fun2()');

7- 2.获取dom元素动态绑定事件:this指针指向当前事件的执行对象

btn.onclick = function () {
    
    
        console.log("你点我", this);
        this.onclick = null;
    }
    btn.click();

自动触发涉及事件的闭包 需要手动释放内存

var btnlist = document.getElementsByClassName("btn");
 for (var i = 0; i < btnlist.length; i++) {
    
    
        /*  btnlist[i].onclick = function () {
         console.log("事件", this);
         }*/
        btnlist[i].onclick = method;
        function method() {
    
    
            console.log("事件", this);
        }
    }
    //手动释放  内存
    btnlist = null;

7-3.事件监听
7-3-1使用事件监听添加
addEventListener 参数1:事件类型(不带on) 参数2 事件执行的回调函数 参数3:boolean类型值 捕获 true 还是冒泡 false
addEventListener 是给同一个对象相同的事件 添加1个或多个执行行函数
addEventListener 里面匿名函数种的this指向的是当前的执行对象

 btndata.addEventListener("click",function (){
    
    
     console.log("事件执行函数");
     });
     btndata.addEventListener("click",function (){
    
    
     console.log("事件执行函数");
     console.log(this)
     }

7-3-2事件监听移除 需要函数的名称

function m2() {
    
    
    console.log("事件执行函数");
    //事件监听移除事件执行函数");
    console.log(this);
    //removeEventListener
    this.removeEventListener("click", m2);
}
  1. 字符串大小写转化:
    8-1 .toLowerCase() 转化为小写字符串;toLocaleLowerCase() 转化为当地表示方法的小写字符串;toUpperCase() 转化为大写字符串;toLocaleUpperCase()转化为当地大写字符串;
    8-2转化为字符串(钱的表示方法)
 var a = 1000000000000;
console.log(a.toLocaleString());//类似同String
  1. 事件冒泡机制(由里向外执行该事件)
    单机事件冒泡机制,子父元素具有click 执行的时候会冒泡执行
    处理事件冒泡
    return false; 原生js里面不能阻止事件冒泡
    需要通过事件执行参数 event 来解决
    e.stopPropagation(); 处理事件冒泡
    e.cancelBubble=true; 处理事件冒泡
  2. 事件的捕获 冒泡
 block.addEventListener("click", function () {
    
    
        console.log("div的事件");
    }, true);
    block_btn.addEventListener("click", function () {
    
    
        console.log("button的事件");
    }, false);
  1. 事件的委托:自身事件 委托给其他元素来执行
var nav = document.querySelector(".nav");
    nav.onclick = function (e) {
    
    
        //将事件委托给子元素来执行
        if (e.target.nodeName.toLowerCase() == "li") {
    
    
            console.log("事件执行");
        }
    }

总结:1. 在进行dom元素获取的时候要注意获取的元素是否已经初始化(需要考虑获取的元素存在还是不存在)(根据页面的加载顺序来考虑)
2.原生js操作样式 ,只能操作元素的行内样式
3.切换的意思是有的就删除,没有的话就加上
4.非行内样式只能获取,不能设置
5. 元素不包含文本回车,节点包含,nextelementsibling
6. 打console.log时直接打括号里面的内容,然后再.log
7.元素没有节点值,输出为null就是空格
8. 怎么同时打三行一样的内容

猜你喜欢

转载自blog.csdn.net/lcywan/article/details/110492289