• Element节点


    原文地址:https://wangdoc.com/javascript/
    Element节点对象对应网页的HTML元素。每个HTML元素,在DOM树上会转成一个Element节点对象(以下简称元素节点)。
    元素节点的nodeType属性都是1

    var p = document.querySelector("p");
    p.nodeName // "p"
    p.nodeType // 1
    

    Element继承了Node接口,因此Node的属性和方法在Element对象都存在。此外,不同的HTML元素对应的元素节点不一样的,浏览器使用不同的构造函数,生成不同的元素节点,比如<a>元素节点对象由HTMLAnchorElement构造函数生成。因此,元素节点不是一种对象,而是一组对象,这些对象除了继承Element的属性和方法,还有各自构造函数的属性和方法。

    实例属性

    元素特性的相关属性

    (1)Element.id
    Element.id属性返回指定元素的id属性,该属性可读写。

    // HTML 代码为 <p id="foo">
    var p = document.querySelector("p");
    p.id // "foo"
    

    注意,id属性的值是大小写敏感的。
    (2)Element.tagName
    Element.tagName属性返回指定元素的大写标签名,与nodeName属性的值相等。
    (3)Element.dir
    Element.dir属性用于读写当前元素的文字方向,可能是从左到右("ltr"),也可能是从右到左("rtl")。
    (4)Element.accessKey
    Element.accessKey属性用于读写分配给当前元素的快捷键。

    // HTML 代码如下
    // <button accesskey="h" id="btn">点击</button>
    
    var btn = document.getElementById("btn");
    btn.accessKey // "h"
    

    上面代码中,btn元素的快捷键是h,按下Alt + h就能将焦点转移到它上面。
    (5)Element.draggable
    Element.draggable属性返回一个布尔值,表示当前元素是否可拖动,该属性可读写。
    (6)Element.lang
    Element.lang属性返回当前元素的语言设置。该属性可读写。

    // HTML 代码如下
    // <html lang="en">
    document.documentElement.lang // "en"
    

    (7)Element.tabIndex
    Element.tabIndex属性返回一个整数,表示当前元素在Tab键遍历时的顺序。该属性可读写。
    tabIndex属性值如果是负值(通常是-1),则Tab键不会遍历到该元素。如果是正整数,则按照顺序,从小到大遍历。如果两个元素的tabIndex属性的正整数值相同,则按照出现的顺序遍历。遍历完所有tabIndex为正整数的元素以后,再遍历所有tabIndex等于0、或者属性值是非法值、或者没有tabIndex属性的元素,顺序为它们在网页中出现的顺序。
    (8)Element.title
    Element.title属性用来读写当前元素的HTML属性title。该属性通常用来指定,鼠标悬浮时弹出的文字提示框。

    元素状态的相关属性

    (1)Element.hidden
    Element.hidden属性返回一个布尔值,表示当前元素的hidden属性,用来控制当前元素是否可见。该属性可读写。

    var btn = document.getElementById("btn");
    var myDiv = document.getElementById("mydiv");
    
    btn.addEventListener("click", function () {
        myDiv.hidden = !myDiv.hidden;
    }, false);
    

    注意,该属性与CSS设置是相互独立的。CSS对这个元素可见性的设置,Element.hidden并不能反映出来。也就是说,这个属性不能用来判断当前元素的实际可见性。
    CSS的设置高于Element.hidden。如果CSS指定了该元素不可见(display:none)或可见,那么Element.hidden并不能改变该元素实际的可见性。换言之,这个属性只在CSS没有明确设定当前元素的可见性时才有效。
    (2)Element.contentEditable,Element.isContentEditable
    HTML元素可以设置contentEditable属性,使得元素的内容可以编辑。

    <div contenteditable>123<div>
    

    上面代码中,<div>元素有contenteditable属性,因此用户可以在网页上编辑这个区块的内容。
    Element.contentEditable属性返回一个字符串,表示是否设置了contenteditable属性,有三种可能值。该属性可写。

    • "true":元素内容可编辑
    • "false":元素内容不可编辑
    • "inherit":元素是否可编辑,继承了父元素的设置
      Element.isContentEditable属性返回一个布尔值,同样表示是否设置了contenteditable属性。该属性只读。

    Element.attributes

    Element.attributes属性返回一个类似数组的对象,成员是当前元素节点的所有属性节点,详见《属性的操作》一章。

    var p = document.querySelector("p");
    var attrs = p.attributes;
    
    for (var i = attrs.length - 1; i >= 0; i--) {
        console.log(attrs[i].name + "->" + attrs[i].value);
    }
    

    上面代码遍历p元素所有属性。

    Element.className,Element.classList

    className属性用来读写当前元素节点的class属性。它的值是一个字符串,每个class之间用空格分割。
    classList属性返回一个类似数组的对象,当前元素节点的每个class就是这个对象的一个成员。

    // HTML 代码 <div class="one two three" id="myDiv"></div>
    var div = document.getElementById("myDiv");
    
    div.className
    // "one two three"
    
    div.classList
    // {
    //     0: "one",
    //     1: "two",
    //     2: "three",
    //     length: 3
    // }
    

    上面代码中,className属性返回一个空格分隔的字符串,而classList属性指向一个类似数组的对象,该对象的length属性(只读)返回当前元素的class数量。
    classList对象有下列方法。

    • add():增加一个class
    • remove():移除一个class
    • contains():检查当前元素是否包含某个class
    • toggle():将某个class移入或移出当前元素(如果指定的class存在则移除,不存在则加入)
    • item():返回指定索引位置的class
    • toString():将class的列表转为字符串
      比较一下,classNameclassList在添加和删除某个class时的写法。
    var foo = document.getElementById("foo");
    
    // Add
    foo.className += "bold";
    foo.classList.add("bold");
    
    // remove
    foo.classList.remove("bold");
    foo.className = foo.className.replace(/^bold$/, "");
    

    toggle方法可以接受一个布尔值作为第二个参数。如果为true,则添加该属性;如果为false,则移除该属性。

    Element.dataset

    网页元素可以自定义data-属性,用来添加数据。

    <div data-timestamp="1522907809292"></div>
    

    上面代码中,<div>元素有一个自定义的data-timestamp属性,用来为该元素添加一个时间戳。
    Element.dataset属性返回一个对象,可以从这个对象读写data-属性。
    注意,dataset上面的各个属性返回都是字符串
    HTML代码中,data-属性的属性名,只能包含英文字母、数字、连词线(-)、点(.)、冒号(:和下划线(_)。它们转成JavaScript对应的dataset属性名,规则如下:

    • 开头的data-会省略。
    • 如果连词线后面跟了一个英文字母,那么连词线会取消,该字母变成大写。
    • 其他字符不变
      因此,data-abc-def对应abcDefdata-abc-2对应abc-2
      除了使用dataset读写data-属性,也可以使用Element.getAttribute()Element.setAttribute(),通过完整的属性名读写这些属性。

    Element.innerHTML

    Element.innerHTML返回一个字符串,等同于该元素包含的所有HTML代码。该属性可读写,常用来设置某个节点的内容。它能改写所有元素节点的内容,包括<HTML><body>元素。
    如果就innerHTML属性设为空,等于删除它所有包含的节点。
    注意,读取属性值得时候,如果文本节点包含&、小于号<和大于号>innerHTML会将它们转为实体形式。如果想得到原文,建议使用element.textContent属性。
    写入的时候,如果插入的文本包含HTML标签,会被解析成为节点对象插入DOM。注意,如果文本中含有<script>标签,虽然可以生成script节点,但是插入的代码不会执行。但是,innerHTML还有安全风险,可见上篇。

    Element.outerHTML

    Element.outerHTML属性返回一个字符串,表示当前元素节点的所有HTML代码,包括该元素本身和所有子元素。该属性可读写,对它进行赋值,等于替换掉当前元素。注意,如果一个节点没有父节点,设置outerHTML属性会报错。

    Element.clientHeight,Element.clientWidth

    Element.clientHeight属性返回一个整数值,表示元素节点的CSS高度(单位像素),只对块级元素生效,对行内元素返回0。如果块级元素没有设置CSS高度,则返回实际高度。
    除了元素本身的高度,它还包括padding部分,但是不包括bordermargin。如果有水平滚动条,还要减去滚动条的高度。注意,这个值始终是整数,如果小数会被四舍五入。
    Element.clientWidth属性返回元素节点的CSS高度,同样只对块级元素有效,也是只包括元素本身的宽度和padding,如果有垂直滚动条,还要减去垂直滚动条的宽度。

    Element.clientLeft,Element.clientTop

    Element.clientLeft属性等于元素节点左边框(left border)的宽度(单位像素),不包括左侧的paddingmargin。如果没有设置左边框,或者行内元素(display:inline),该属性总是返回整数值,如果是小数,四舍五入。
    Element.clientTop属性等于网页元素顶部边框的高度,其他特点与clientLeft相同。

    Element.scrollHeight,Element.scrollWidth

    Element.scrollHeight属性返回一个整数值(小数四舍五入),表示当前元素的总高度(单位像素),包括溢出容器、当前不可见的元素。它包括padding,但是不包括bordermargin以及水平滚动条的高度(如果有),还包括伪元素(::before或::after)的高度。
    Element.scrollWidth属性表示当前元素的总宽度(单位像素),其他地方都与scrollHeight属性类似。这两个属性只读。

    Element.scrollLeft,Element.scrollTop

    Element.scrollLeft属性表示当前元素的水平滚动条向右侧滚动的像素数量,Element.scrollTop属性表示当前元素的垂直滚动条向下滚动的像素数量。
    如果要查看整张网页水平和垂直滚动条的滚动距离,是要从document.documentElement元素上读取。

    Element.offsetParent

    Element.offsetParent属性返回最靠近当前元素的、并且CSS的position属性不等于static的上层元素。

    <div style="position: absolute;">
        <p>
            <span>Hello</span>
        </p>
    </div>
    

    上面代码中,span元素的offsetParent属性就是div元素。
    该属性主要用于确定子元素位置偏移的计算基准,Element.offsetTopElement.offsetLeft就是offsetParent元素计算的。
    如果该元素是不可见的(display属性为none),或者位置是固定的(position属性为fixed),则offsetParent属性返回null
    如果某个元素的所有上层节点的position属性都是static,则Element.offsetParent属性指向<body>元素。

    Element.offsetHeight,Element.offsetWidth

    Element.offsetHeight属性返回一个整数,表示元素的CSS垂直高度。包括元素本身的高度、paddingborder,以及水平滚动条的高度。
    Element.offsetWidth属性表示元素的CSS水平宽度。
    这两个属性都是只读属性,只比Element.clientHeightElement.clientWidth多了边框的高度和宽度。

    Element.offsetLeft,Element.offsetTop

    Element.offsetLeft返回当前元素左上角相对于Element.offsetParent节点的水平位移,Element.offsetTop返回垂直位移,单位像素。通常这两个值是指相对于父节点的位移。
    下面的代码可以算出元素左上角相对于整张网页的坐标。

    function getElementPosition(e) {
        var x = 0;
        var y = 0;
        while (e != null) {
            x += e.offsetLeft;
            y += e.offsetTop;
            e = e.offsetParent;
        }
        return {x: x, y: y};
    }
    

    Element.style

    每个元素节点都有style用来读写该元素的行内样式信息,具体介绍参见《CSS操作》一章。

    Element.children,Element.childElementCount

    Element.children属性返回一个类似数组的对象(HTMLCollection实例),包括当前元素节点的所有子元素。如果当前元素没有子元素,则返回的对象包含零个成员。

    if (para.children.length) {
        var children = para.children;
        for (var i = 0; i < children.length; i++) {
            // ...
        }
    }
    

    这个属性与Node.childNodes属性的区别是,它只包括元素类型的子节点,不包括其他类型的子节点。
    Element.childElementCount属性返回当前元素节点包含的子元素节点个数,与Element.children.length的值相同。

    Element.firstElementChild,Element.lastElementChild

    Element.firstElementChild属性返回当前元素的第一个元素子节点,Element.lastElementChild返回最后一个元素子节点。如果没有元素子节点,这两个属性返回null

    Element.nextElementSibling,Element.previousElementSibling

    Element.nextElementSibling属性返回当前元素节点的后一个同级元素节点,如果没有则返回null
    Element.previousElementSibling属性返回当前元素节点的前一个同级元素节点,如果没有则返回null

    实例方法

    属性相关方法

    元素节点提供六个方法,用来操作属性。

    • getAttribute():读取某个属性的值
    • getAttributeNames():返回当前元素的所有属性名
    • setAttribute():写入属性值
    • hasAttribute():某个属性是否存在
    • hasAttributes():当前元素是否有属性
    • removeAttribute():删除属性

    Element.querySelector()

    Element.querySelector方法接受一个CSS选择器作为参数,返回父元素的第一个匹配的子元素。如果没找到匹配的子元素,就返回null。注意这个方法无法选中伪元素。
    需要注意的是,浏览器执行querySelector方法时,是先在全局范围内搜索给定的CSS选择器,返回过滤出哪些属于当前元素的子元素。因此会有一些违反直觉的结果,下面是一段HTML代码。

    <div>
        <blockquote id="outer">
            <p>Hello</p>
            <div id="inner">
                <p>World</p>
            </div>
        </blockquote>
    </div>
    

    那么像下面这样查询的话,实际返回的是一个p元素,而不是第二个。

    var outer = document.getElementById("outer");
    outer.querySelector("div p");
    

    Element.querySelectorAll()

    Element.querySelectorAll方法接受CSS选择器作为参数,返回一个NodeList实例,包含所有匹配的子元素。机制和Element.querySelector相同。如果选择器里面有伪元素的选择器,则总是返回一个空的NodeList实例。

    Element.getElementsByClassName()

    Element.getElementsByClassName方法返回一个HTMLCollection实例,成员是当前元素节点的所有具有指定class的子元素节点。该方法大小写敏感。这个方法使用时,需要注意HTMLCollection实例是一个活的集合。

    Element.getElementsByTagName()

    Element.getElementsByTagName方法返回一个HTMLCollection实例,成员是当前节点的所有匹配指定标签名的子元素节点。该方法大小写不敏感。

    Element.closest()

    Element.closest方法接受一个CSS选择器作为参数,返回匹配改选择器的、最接近当前节点的一个祖先节点(包括当前节点本身)。如果没有任何节点匹配CSS选择器,则返回null

    // HTML 代码如下
    // <article>
    //     <div id="div-01">Here is div-01
    //         <div id="div-02">Here is div-02
    //             <div id="div-03">Here is div-03</div>
    //         </div>
    //     </div>
    // </article>
    
    var div03 = document.getElementById("div-03");
    // div-03 最近的祖先节点
    div03.closest("#div-02") // div-02
    div03.closest("div div") // div-03
    div03.closest("article > div") // div-01
    div03.closest(":not(div)") // article
    

    Element.matches()

    Element.matches方法返回一个布尔值,表示当前元素是否匹配给定的CSS选择器。

    事件相关方法

    以下三个方法与Element节点的事件相关。这些方法都继承自EventTarget接口,详见相关章节。

    • Element.addEventListener():添加事件的回调函数
    • Element.removeEventListener():移除事件监听函数
    • Element.dispatchEvent():触发事件

    Element.scrollIntoView()

    Element.scrollIntoView方法滚动当前元素,进入浏览器的可见区域,类似于设置window.location.hash的效果。

    e1.scrollIntoView(); // e1.scrollIntoView(true)
    e1.scrollIntoView(false);
    

    该方法接受一个布尔值作为参数。如果为true,表示元素的顶部与当前区域的可见部分的顶部对齐(前提是当前区域可滚动);如果为false,表示元素的底部与当前区域的可见部分尾部对齐(前提是当前区域可滚动)。默认为true

    Element.getBoundingClientRect()

    Element.getBoundingClientRect方法返回一个对象,提供当前元素节点的大小、位置等信息。基本上就是CSS盒状模型的所有信息。该方法返回的rect对象具有以下属性(全部只读)。

    • x:元素左上角相对视口的横坐标
    • y:元素左上角相对于视口的纵坐标
    • height:元素高度
    • width:元素宽度
    • left:元素左上角相对于视口的横坐标,与x属性相等
    • right:元素右边界相当于视口的横坐标(等于x + width
    • top:元素顶部相对于视口的纵坐标,与y属性相等
    • bottom:元素底部相对于视口的纵坐标(等于y + height
      注意,getBoundingClientRect方法的所有属性,都把边框(border属性)算作元素的一部分。也就是说,从边框外缘的各个点来计算。

    Element.getClientRects()

    Element.getClientRects返回一个类似数组对象,里面是当前元素在页面上形成的所有矩形。对于盒状元素(比如<div><p>),该方法返回的对象只有该元素一个成员。对于行内元素(比如<span>),该对象返回对象有多少成员取决于该元素在页面上占据多少行。

    Element.insertAdjacentElement()

    Element.insertAdjacentElement方法在相对于当前元素的指定位置插入一个新的节点。该方法返回被插入的节点。如果插入失败,返回null

    element.insertAdjacentElement(position, element);
    

    position取值:

    • beforebegin:当前元素之前
    • afterbegin:当前元素内部的第一个子节点前面
    • beforeend:当前元素内部的最后一个子节点后面
    • afterend:当前元素之后

    注意,beforebeginafterend这两个值,只在当前节点有父节点时才会生效。如果当前节点是由脚本创建的,没有父节点,那么插入会失败。

    Element.insertAdjacentHTML(),Element.insertAdjacentText()

    Element.insertAdjacentHTML方法用于将一个HTML字符串,解析生成DOM结构,插入相对于当前节点的指定位置。

    element.insertAdjacentHTML(position, text);
    

    position取值同上。
    该方法只是在现有的DOM结构里面插入节点,这使得它的执行速度比innerHTML方法快得多。
    注意,该方法不会转义HTML字符串,这导致它不能用来插入用户输入的内容,否则有安全风险
    Element.insertAdjacentText方法在相对于当前节点的指定位置,插入一个文本节点,用法与Element.insertAdjacentHTML方法完全一致。

    Element.remove()

    Element.remove方法继承自ChildNode接口,用于将当前元素节点从它的父节点移除。

    Element.focus(),Element.blur()

    Element.focus方法将当前页面焦点转移到指定元素上。
    该方法接受一个对象作为参数。参数对象的preventScroll属性是一个布尔值,指定是否将当前元素停留在原始位置,而不是滚动到可见区域。

    function getFocus() {
        document.getElementById("btn").focus({preventScroll: false});
    }
    

    Element.blur方法用于将焦点从当前元素移除。

    Element.click()

    Element.click方法用于在当前元素上模拟一次鼠标点击,相当于触发click事件。

  • 相关阅读:
    tp6.0使用EasyWeChat
    vue-admin-template使用
    tp6.0入门
    seo一些细节
    wordpress开发mac
    php加密
    小程序信息授权sessionKey失效问题
    app爬虫(python)开发——抓包工具的使用详细笔记
    app爬虫(python)开发——搭建开发环境(如何抓取app数据?)
    app爬虫(python)开发入门到实战个人笔记(目录)
  • 原文地址:https://www.cnblogs.com/chris-jichen/p/10286693.html
Copyright © 2020-2023  润新知