学习周报
JavaScript dom
获取页面元素
获取页面元素有下面几种方法
- 根据ID获取
- 根据标签名获得
- 通过H5新增的方法获得
- 特殊元素获得
根据ID获得
使用getElementById方法可通过ID获得元素
 此方法的参数为ID(区分大小写)
 返回一个匹配到 ID 的 DOM Element 对象
<body>
    <div id="speicialDiv"></div>
    <script>
        const sDiv=document.getElementById('speicialDiv');
        console.log(sDiv);
        console.dir(sDiv);
    </script>
</body>
这里使用console.dir(sDiv)可以打印出元素对象更好的查看属性和方法
根据标签名获取元素
使用getElementsByTagName()方法可以返回带有指定标签名的对象的集合
 返回值为 元素对象的集合 以伪数组形式存储 无论有没有这个元素都是以伪数组形式返回
 可以使用document.getElementsByTagName()找到同标签名的使用元素
 也可以使用Element.getElementsByTagName()的方式找到对应父元素中的子元素
<body>
    <ol id="ol">
        <li>h</li>
    </ol>
    <ul id="ul">
        <li>uuuu</li>
    </ul>
    <script>
        const ol = document.getElementById('ol');
        console.log(ol.getElementsByTagName('li')[0]);
    </script>
</body>
通过H5新增的方法获得元素
-  getElementsByClassName() 根据类名获得某些元素集合 
 具体用法和getElementsByTagName类似
-  queryselector() 返回指定选择器的第一个元素对象 
 参数可以为.class(类选择器)、#ID(id选择器)、li(标签名),都将返回第一个元素对象
-  querySelectorAl1()返回指定选择器的所有元素对象集合 
获取特殊元素
-  获取body标签 
 通过document.body直接获得
-  获取html元素 
 通过document.documentElement获得
事件基础
事件就是一种可以被JavaScript侦察到的行为
 可以简单理解为:触发—响应机制
 每一个元素都可以触发事件
事件三要素
事件由三部分组成:
- 事件源
 事件被触发的对象,例如:按钮
 我们需要获取这个事件源
var btn = document.getElementById('btn');
-  事件类型 
 指如何触发这个事件,鼠标经过还是鼠标点击(onclick)还是键盘按下
-  事件处理程序 
 通过一个函数赋值的方式完成
<body>
    <button id="btn">唐伯虎</button>
    <script>
        let btn=document.getElementById("btn");
        btn.onclick=function(){
            alert('点蚊香');
        };
    </script>
</body>
执行事件的步骤
- 获取事件源
- 注册事件绑定事件
- 添加事件处理程序(采取函数赋值形式)
例:下面我们需要点击div 然后控制台输出我被选中了
<body>
    <div>233</div>
    <script>
        //点击div 控制台输出 我被选中了
        //1.获取事件源
        const div = document.querySelector('div');
        //2.绑定事件 注册事件
        //3.添加事件处理程序
        div.onclick = function(){
            console.log('点击');
        }
    </script>
</body>
操作元素
JavaScript的DOM操作可以改变网页内容、结构和样式,我们可以利用DOM操作元素来改变元素里面的内容、属性等。注意以下都是属性
改变元素内容
- 改变元素文本内容
- element.innerText
 从起始位置到终止位置的内容,但它去除 html标签,同时空格和换行也会被去掉
- element.innerHTML
 起始位置到终止位置的全部内容,包括html标签,同时保留空格和换行
两者的区别:
 innerText 不识别html标签 非标准 去除空格和换行
 innerHTML 识别html标签 W3C标准 保留空格和换行的
<body>
    <div></div>
    <p>233
        <span>hhh</span>
    </p>
    <script>
        const div = document.querySelector('div');
        const p = document.querySelector('p');
        div.innerText='今天很<strong>无聊</strong>';
        //结果不识别标签原封不动打印出来
        div.innerHTML="今天很<strong>无聊</strong>";
        //识别标签无聊加深
        //读写元素内容
        console.log(p.innerText);
        //空格换行被去除
        console.log(p.innerHTML);
        //空格换行保留
    </script>
</body>
-  改变元素属性 
 type、 value、checked、selected、disabled属性可以被直接获取和修改
 通过element.src、element.href等直接修改元素的属性
-  改变表单属性 
 利用DOM可以操作如下表单元素的属性︰
 type. value、 checked、 selected、 disabled
改变表单里面的文字内容是通过改变表单的vulue值来改变的
 如果想要表单被点击后不能被点击,可以更改表单的disabled
- 修改元素的样式属性
- element.style 获取行内样式操作
 如果需要修改的属性比较少,可直接使用element.style进行单个修改
- element.className 获取类名样式操作
 当需要修改的属性比较多时,我们可以专门在CSS中写一个类change,当修改时将class名写入元素中
  
- 自定义元素操作
- 获取属性:
 直接获取: element.属性,方便但只能获取元素自带的属性
 通过getAttribute(‘属性’):这种方式的特点是能获取自定义属性
- 设置属性值
 element-属性=‘值’设置内置属性值。
 element.setAttribute (‘属性’,‘值’)
- H5自定义属性
 为什么要设置自定义属性:保存并使用数据。有些数据可以保存到页面中而不用保存到数据库中
- 设置H5自定义属性
 H5规定自定义属性data-开头做为属性名并且赋值。比如
<div data-index“1”></div>
或者使用JS设置
element.setAttribute( 'data-index’,2)
- 获取H5自定义属性
 兼容性获取:element.getAttribute( 'data-index’);
 H5新增:element.dataset.index或者element.dataset[ 'index’ ]
 (ie 11才开始支持)
节点操作
为什么要学习节点
获取元素:
- 利用DOM提供的方法获取元素
document.getElementByld()
document.getElementsByTagName)
document.querySelector
//等......
缺点是没有逻辑,让人看不懂元素间的关系
 2. 利用节点层级关系获取元素
 利用父子兄节点关系获取
 元素逻辑性强,但是兼容性稍差心
节点概述
网页中的所有内容都是节点(标签、属性、文本、注释等),在DOM中,节点使用node来表示。
 利用dom树可以把节点分为不同层级
 
一般地,节点至少拥有nodeType(节点类型 ) 、nodeName(节点名称)和nodeValue(节点值)这三个基本属性。
- 元素节点nodeType为1
- 属性节点nodeType为2
- 文本节点nodeType为3(文本节点包含文字、空格、换行等)
节点层级
一般用到的是父子兄关系
- 父级元素
- node.parentNode
- 子节点
- parentNode.childNodes
 获得父节点的所有子节点
 它会把所有节点都包含进去,包含元素节点、文本节点等…
 如果需要只获得某一种节点,要经过特殊处理
<body>
    <ul>
        <li></li>
        <li></li>
        <li></li>
        <li></li>
        <li></li>
    </ul>
    <script>
        let ul = document.querySelector('ul');
        let totalLiList = ul.childNodes;
        let totalLiArr = Array.from(totalLiList);
        let liList = totalLiArr.filter((item)=>
            item.nodeType==1         
        )
        console.log(liList);
    </script>
</body>
因此一般不推荐使用
更好的方法:
- parentNode.children(非标准)
 获取所有的子元素节点
获取第一个节点或最后一个节点:
- firstChild第一个子节点不管是文本节点还是元素节点
- lastChild最后一个子节点不管是文本节点还是元素节点
- firstElementChild 返回第一个子元素节点
- lastElementChild 返回最后一个子元素节点
但最后两个方法存在兼容性问题,因此在实际开发中一般用children方法,将元素节点存储为数组,再取数组的第一个或最后一个
 3. 兄弟节点
- node.nextsibling
 nextsibling 返回当前元素的下一个兄弟节点,找不到则返回null。同样,也是包含所有的节点。
- node.previoussibling
 previoussibling返回当前元素上一个兄弟节点,找不到则返回null。同样,也是包含所有的节点.
- node.nextElementsibling
 nextElementsibling返回当前元素下一个兄弟元素节点,找不到则返回null。
- node.previousElementsibling
 previousElementsibling返回当前元素上一个兄弟节点,找不返回null。
在页面中创建一个新的元素
- 创建节点
document.createElement( 'tagName " )
document.createElement()方法创建由tagName 指定的 HTML元素。因为这些元素原先不存在,是根据我们的需求动态生成的,所以我们也称为动态创建元素节点
 2. 添加节点
- node.appendchild (child)
 node.appendchild()方法将一个节点添加到指定父节点的子节点列表末尾。类似于css里面的after伪元素
- node.insertBefore (child,指定元素)
 node.insertBefore()方法将一个节点添加到父节点的指定子节点前面。类似于css里面的before伪元素
删除节点
- node. removeChild(child)
 node.removeChild()方法从DOM中删除一个子节点,返回删除的节点。
复制节点
- node.cloneNode ()
 node.cloneNode()方法返回调用该方法的节点的一个副本。也称为克隆节点/拷贝节点
注意:
- 如果括号参数为空或者为false,则是浅拷贝,即只克隆复制节点本身,不克隆里面的子节点
- 如果括号参数为true,则是深度拷贝,会复制节点本身以及里面所有的子节点。










