DOM知识

获取元素
DOM在我们实际开发中主要用来操作元素。我们如何来获取页面中的元素呢?
获取页面中的元素可以使用以下几种方式:

  1. 根据ID获取
  2. 根据标签名获取
  3. 通过HTML5新增的方法获取
  4. 特殊元素获取

1.根据ID获取

getElementById()
//get获得	element元素	by通过	驼峰命名法
<div id="time" >2019-9-9</div>
var timer = document.getElementById('time');     //参数id是大小写敏感的字符串
console.log(timer);  						   	//返回的是一个元素对象
console.log(typeof timer);

// console.dir打印我们返回的元素对象更好的查看里面的属性和方法
console.dir(timer);     

2.根据标签名获取

getElementsByTagName()

使用getElementsByTagName()方法可以返回带有指定标签名的对象的集合。

<ul>
	<li>知否知否,应是等你好久11</li>
	<li>知否知否,应是等你好久22</li>
	<li>知否知否,应是等你好久33</li>
	<li>知否知否,应是等你好久44</li>
	<li>知否知否,应是等你好久55</li>
</ul>
//返回的是	获取过来元素对象的集合	以伪数组的形式存储的
var lis = document.getElementsByTagName('li');
console.log(lis);
console.log(lis[0]);

//我们想要依次打印里面的元素对象我们可以采取遍历的方式 
for(var i = 0; i<lis.length; i++){
	console.log(lis[i]);
}

获取父元素中的子元素
父元素必须是单个的:比如ul[0]

//如果页面中只有一个1i返回的还是伪数组的形式
//如果页面中没有这个元素返回的是空的伪数组的形式
//element.getElementsByTagName('标签名");
var ul = document.getElementsByTagName('ul');
console.log(u1[0].getElementsyTagName ('li'));

3.通过HTML5新增的方法获取

document.getElementsByClassName ('类名');    //根据类名返回元素对象集合
document.querySeleotor ("选择器");          //根据指定选择器返回第一个元素对象
<div class="box">盒子</div>
<div class="box">盒子</div>
<div id="nav">
	<ul>
		<li>首页</li><li>产品</li>
	</ul>
</div>
// getElementsByClassName根据类名获得某些元素集合
var boxs = document.getElementsByclassName('box');
console.log(boxs);
//queryselector返回指定选择器的第一个元素对象   切记	里面的选择器需要加符号  .box  #nav
var firstBox = document.querySelector('.box');
console.log(firstBox);
var nav = document.queryselector('#nav');
console.log(nav);
var li = document.queryselector('li');
console.log(li);
document.queryselectorAll('选择器');    //根据指定选择器返回
// queryselectorAl1()返回指定选择器的所有元素对象集合
var a11Box = document.queryselectorAll(".box");
console.log(allBox);
var lis = document.querySelectorAl1('li');
console.log(lis);

获取特殊元素(body , html)

获取body元素

doucumnet.body 				//返回body元素对象

获取html元素

document.documentElement 	//返回html元素对象

事件三要素

//点击一个按钮,弹出对话框
// 1.事件是有三部分组成︰事件源	事件类型  事件处理程序  我们也称为事件三要素
// (1)事件源  事件被触发的对象  谁  按钮
var btn = document.getElementById('btn');
//(2)事件类型如何触发什么事件比如鼠标点击(onclick)还是鼠标经过还是键盘按下
//(3)事件处理程序通过一个函数赋值的方式完成
btn.onclick = function({
	alert('点秋香');
}

执行事件的步骤

  1. 获取事件源
  2. 注册事件(绑定事件)
  3. 添加事件处理程序(采取函数赋值形式)

在这里插入图片描述

改变元素内容

element.innerText

//从起始位置到终止位置的内容,但它去除 html标签,同时空格和换行也会去掉
element.innerHTML

//起始位置到终止位置的全部内容,包括html标签,同时保留空格和换行

操作元素 修改表单属性

<body>
	<button>按钮</button>
		<input type="text" value="输入内容">
		<script>
	//获取元素
	var btn = document.querySelector('button');
	var input = document.querySelector('input');
	 //2.注册事件	处理程序
	 btn.onclick = function() {
	// input.innerHTMAL = '点击了';  这个是普通盒子	比如 div 标签里面的内容
	//表单里面的值	文字内容是通过value来修改的
	input.value = '被点击了';
	//如果想要某个表单被禁用不能再点击 disabled	我们想要这个按钮 
	//button禁用
	//btn.disabled = true;
	}
	</script>
</body>



操作元素
样式属性操作
我们可以通过JS修改元素的大小、颜色、位置等样式。

element.style   	  行内样式操作
element.className	  类名样式揉作
<style>
	div {
		width: 200px;
		height: 200px;
		background-color: pink;
	}
</style>
<div></div>
	<script>
	// 1.获取元素
	var div = document.querySelector('div');
	// 2.注册事件处理程序
	div.onclick = function(){
		// div.style里面的属性采取驼峰命名法
		this.style.backgroundColor = 'purple';
		this.style.width = '250px'
	}
	</script>
</body>

注意:

1.Js里面的样式采取驼峰命名法比如fontsize、backgroundcolor
2.Js修改style样式操作,产生的是行内样式,css权重比较高



样式属性操作

我们可以通过JS修改元素的大小、颜色、位置等样式。
element.style 行内样式操作
element.className 类名样式操作

注意:

如果样式修改较多,可以采取操作类名方式更改元素样式。
class因为是个保留字,因此使用className来操作元素类名属性
className会直接更改元素的类名,会覆盖原先的类名。

className

.change {	
	color :#fff;
	font-size: 25px;
	margin-top: 100px;
	background-color: purple;
}
<body>
	<div>文本</div>
	<script>
	// 1.使用element.style获得修改元素样式︰如果样式比较少或者功能简单的情况下使用
	var test = document.queryselector('div');
	test.onclick = function() 
	// this.style.backgroundColor = 'purple';
	// this.style.color = '#fff';
	// this.style.fontsize = '25pX';
	//this.style.marginTop = '120px';
	//让我们当前元素的类名改为了 change
	//2.我们可以通过修改元素的className更改元素的样式适合于样式较多或者功能复杂的情况
	this.className = 'change';
	</script>
</body>
//如果想要保留原先的类名,我们可以这么做   多类名选择器
//this.className = 'change ';
this.className = 'first change';

在这里插入图片描述

自定义属性的操作
1.获取属性值

element.属性   获取属性值
element.getAttribute('属性')

两者的区别

  • element.属性                            获取内置属性值(元素本身自带的属性)
  • element.getAttribute(‘属性’);  主要获得自定义的属性(标准)我们程序员自定义的属性
<div id="demo"></div>
<script>
	var div = document.querySelector('div');   
	// 1.获取元素的属性值
	console.log(div.id);
    //(2)element.getAttribute('属性')	get得到获取 attribute属性的意思
    console.log(div.getAttribute('id'));
</script>

设置自定义属性

  • element.属性 = ‘值’                   设置内置属性值
  • element.setAttribute(‘属性’,‘值’)

区别

  • element.属性                             设置内置属性值
  • element.setAttribute(‘属性’)       主要设置自定义属性(标准)
<div id="demo" index=""1"></div>
	<script>
		var div = document.querySelector('div');
		// 1.获取元素的属性值
		//(1)element.属性
		console.log(div.id);
		//(2)element.getAttribute('属性')  get得到获取  attribute 属性的意思 我们称为自定义属性index
		console.log(div.getAttribute('id'));
		console.log(div.getAttribute('index'));
		// 2.设置元素属性值
		// (1)element.属性='值'
		div.id = 'test';
		//(2)element.setAttribute('属性',‘值');主要针对于自定义属性
		div.setAttribute('index',2);
</script>

移除自定义属性

// 移除属性   removeAttribute(属性)
div.removeAttribute('index')



H5自定义属性
自定义属性目的∶是为了保存并使用数据。有些数据可以保存到页面中而不用保存到数据库中。
自定义属性获取是通过getAttribute (‘属性’) 获取。

但是有些自定义属性很容易引起歧义,不容易判断是元素的内置属性还是自定义属性。
H5给我们新增了自定义属性∶

1.设置H5自定义属性
H5规定自定义属性data-开头做为属性名并且赋值。
比如用HTML设置

<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才开始支持

<body>
	<div getTime='20' data-index='2' data-list-name='andy'></div>
	script
		var div = document.querySelector('div')
		//console.log(div.getTime);
		console.log(div.getAttribute('getTime'));
		div.setAttribute('data-time', 20);
		console.log(div.getAttribute('data-index'));
		console.log(div.getAttribute('data-list-name'));
		//h5新增的获取自定义属性的方法 它只能获取data-开头的
		//dataset 是一个集合里面存放了所有以data开头的自定义属性
		console.log(div.dataset);
		console.log(div.dataset.index);
		console.log(div.dataset['index']);
		//如果自定义属性里面有多个 - 链接的单词,我们获取的时候采取驼峰命名法
		console.log(div.dataset.listName);
		console.log(div.dataset['listName']);
</body>



节点概述

一般地,节点至少拥有nodeType(节点类型)、nodeName(节点名称)和nodeValue(节点值)这三个基本属性。

  • 元素节点nodeType为1
  • 属性节点nodeType 为2
  • 文本节点nodeType 为3(文本节点包含文字、空格、换行等)
    我们在实际开发中,节点操作主要操作的是元素节点


节点层级
父子节点
兄弟节点


操作父节点

node.parentNode
  • parentNode属性可返回某节点的父节点,注意是最近的一个父节点
  • 如果指定的节点没有父节点则返回null
  • 返回父节点以及父节点下的所有子节点

示例:

    <div>
        <span class="code"></span>
        <div>666</div>
    </div>
    
    <script>
        var code = document.querySelector('.code')
        console.log(code.parentNode);
    </script>




操作子节点

第一种方法:(不推荐)

parentNode.chikdNodes       //标准

注意:返回值里面包含了所有的子节点,包括元素节点,文本节点等。
如果只想要获得里面的元素节点,则需要专门处理。所以我们一般不提倡使用childNodes

第二种方法:推荐

parentNode.children    //非标准,但是得到各个浏览器都支持

parentNode.children是一个只读属性,返回所有的子元素节点。它只返回子元素节点,其余节点不返回。



获取子节点

<ul>
	<li>我是一<li>
	<li>我是二<li>
	<li>我是三<li>
</ul>

<script>
        var ul = document.querySelector('ul')
        
        //获取节点
        console.log(ul.firstChild)              //#text
        console.log(ul.lastChild)               //#text

		//虽然可以返回需要的节点,但是需要IE9以上才能支持
        console.log(ul.firstElementChild)       //带标签和内容
        console.log(ul.lastElementChild)        //带标签和内容

        //下面这种兼容性最好
        console.log(ul.children[0])
        console.log(ul.children[ul.children.length - 1])

</script>




获取第一个儿子

father.firstChild			//包含换行,文字等内容
father.firstElementChild    //只包含标签(推荐)

获取最后一个儿子

father.lastChild			//包含换行,文字等内容
father.lastElementChild     //只包含标签(推荐)



兄弟节点

获取上一个兄弟节点

son1.previousSibling  		   //包含换行,文字等内容
son1.previousElementSibling   //只包含标签(推荐)

获取下一个兄弟节点

son1.nextSibling			//包含换行,文字等内容
son1.nextElementSibling     //只包含标签(推荐)




删除节点

node.removeChild() 方法从 node节点中删除一个子节点,返回删除的节点。

 <button>删除</button>
    <ul>
        <li>熊大</li>
        <li>熊二</li>
        <li>光头强</li>
    </ul>
    <script>
        // 1.获取元素
        var ul = document.querySelector('ul');
        var btn = document.querySelector('button');
        // 2. 删除元素  node.removeChild(child)
        // ul.removeChild(ul.children[0]);
        // 3. 点击按钮依次删除里面的孩子
        btn.onclick = function() {
            if (ul.children.length == 0) {
                this.disabled = true;              //禁用
            } else {
                ul.removeChild(ul.children[0]);        //删除
            }  
        }
    </script>

创建添加元素节点

var li = document.createElement('li')     //需要添加的元素节点
var ul = document.querySelector('ul')     //添加到的地方
ul.appendChild(li)						  //添加进去

//添加到指定元素的前面的方法
var lili = document.createElement('li')   
ul.insertBefore(lili,ul.children[0])




复制(克隆)节点

node.cloneNode ()

node.cloneNode ()方法返回调用该方法的节点的一个副本。也称为克隆节点/拷贝节点

注意:
1.如果括号参数为空或者为false,则是浅拷贝,即只克隆复制节点本身,不克隆里面的子节点。
⒉如果括号参数为true,则是深度拷贝,会复制节点本身以及里面所有的子节点。

<ul>
    <li>1111</li>
    <li>2</li>
    <li>3</li>
</ul>

<script>
        var ul = document.querySelector('ul');
        // 1. node.cloneNode(); 括号为空或者里面是false 浅拷贝 只复制标签不复制里面的内容
        // 2. node.cloneNode(true); 括号为true 深拷贝 复制标签复制里面的内容
        var lili = ul.children[0].cloneNode(true);
        ul.appendChild(lili);
</script>




动态生成表格
在这里插入图片描述

<script>
        // 1.先去准备好学生的数据
        var datas = [{
            name: '魏璎珞',
            subject: 'JavaScript',
            score: 100
        }, {
            name: '弘历',
            subject: 'JavaScript',
            score: 98
        }, {
            name: '傅恒',
            subject: 'JavaScript',
            score: 99
        }, {
            name: '明玉',
            subject: 'JavaScript',
            score: 88
        }, {
            name: '大猪蹄子',
            subject: 'JavaScript',
            score: 0
        }];
        // 2. 往tbody 里面创建行: 有几个人(通过数组的长度)我们就创建几行
        var tbody = document.querySelector('tbody');
		// 遍历数组
        for (var i = 0; i < datas.length; i++) { 
            // 1. 创建 tr行
            var tr = document.createElement('tr');
            tbody.appendChild(tr);
            // 2. 行里面创建单元格td 单元格的数量取决于每个对象里面的属性个数  
            // 使用for in遍历学生对象
            for (var k in datas[i]) { 
                // 创建单元格 
                var td = document.createElement('td');
                // 把对象里面的属性值 datas[i][k] 给 td  
                td.innerHTML = datas[i][k];
                tr.appendChild(td);
            }
            // 3. 创建有删除2个字的单元格 
            var td = document.createElement('td');
            td.innerHTML = '<a href="javascript:;">删除 </a>';
            tr.appendChild(td);

        }
        // 4. 删除操作 开始 
        var as = document.querySelectorAll('a');
        for (var i = 0; i < as.length; i++) {
            as[i].onclick = function() {
                // 点击a 删除 当前a 所在的行(链接的爸爸的爸爸)  node.removeChild(child)  
                tbody.removeChild(this.parentNode.parentNode)
            }
        }
    </script>

创建元素的三种方式

document.write()
element.innerHTML
document.createElement()

三者区别

  1. document.write是直接将内容写入页面的内容流,但是文档流执行完毕,则它会导致页面全部重绘
  2. innerHTML是将内容写入某个DOM节点,不会导致页面全部重绘
  3. innerHTML创建多个元素效率更高(不要拼接字符串,采取数组形式拼接),结构稍微复杂
  4. createElement ()创建多个元素效率稍低一点点,但是结构更清晰

总结: 不同浏览器下, innerHTML效率要比creatElement高

 <script>
        // 三种创建元素方式区别 
        // 1. document.write() 创建元素  如果页面文档流加载完毕,再调用这句话会导致页面重绘
         var btn = document.querySelector('button');
         btn.onclick = function() {
             document.write('<div>123</div>');
         }

        // 2. innerHTML 创建元素
        var inner = document.querySelector('.inner');
         for (var i = 0; i <= 100; i++) {
             inner.innerHTML += '<a href="#">百度</a>'
         }
        var arr = [];
        for (var i = 0; i <= 100; i++) {
            arr.push('<a href="#">百度</a>');
        }
        inner.innerHTML = arr.join('');
        // 3. document.createElement() 创建元素
        var create = document.querySelector('.create');
        for (var i = 0; i <= 100; i++) {
            var a = document.createElement('a');
            create.appendChild(a);
        }
    </script>

innerTHML和createElement效率对比
innerHTML字符串拼接方式(效率低)

<script>
    function fn() {
        var d1 = +new Date();
        var str = '';
        for (var i = 0; i < 1000; i++) {
            document.body.innerHTML += '<div style="width:100px; height:2px; border:1px solid blue;"></div>';
        }
        var d2 = +new Date();
        console.log(d2 - d1);
    }
    fn();
</script>

createElement方式(效率一般)

<script>
    function fn() {
        var d1 = +new Date();

        for (var i = 0; i < 1000; i++) {
            var div = document.createElement('div');
            div.style.width = '100px';
            div.style.height = '2px';
            div.style.border = '1px solid red';
            document.body.appendChild(div);
        }
        var d2 = +new Date();
        console.log(d2 - d1);
    }
    fn();
</script>

innerHTML数组方式(效率高)

<script>
    function fn() {
        var d1 = +new Date();
        var array = [];
        for (var i = 0; i < 1000; i++) {
            array.push('<div style="width:100px; height:2px; border:1px solid blue;"></div>');
        }
        document.body.innerHTML = array.join('');
        var d2 = +new Date();
        console.log(d2 - d1);
    }
    fn();
</script>



DOM的核心总结
文档对象模型(Document Object Model,简称DOM),是W3C组织推荐的处理可扩展标记语言(HTML或者XML)的标准编程接口。
w3C已经定义了一系列的DOM接口,通过这些DOM接口可以改变网页的内容、结构和样式。

  1. .对于JavaScript,为了能够使JavaScript操作HTML,JavaScript就有了一套自己的dom编程接口。
  2. 对于HTML,dom使得html形成一棵dom树.包含文档、元素、节点

在这里插入图片描述

创建

document.write
innerHTML
createElement

增加

appendChild
insertBefore

removeChild


主要修改dom的元素属性,dom元素的内容、属性,表单的值等
1.修改元素属性: src、href、title等
2.修改普通元素内容:innerHTML 、innerText
3.修改表单元素: value、type、disabled等
4.修改元素样式: style、className


DOM提供的API方法: getElementByldgetElementsByTagName 古老用法不太推荐
H5提供的新方法: querySelectorquerySelectorAll(提倡)
利用节点操作获取元素:父(parentNode)、子(children)、兄(previousElementSibling、nextElementSibling)提倡

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值