DOM相关知识点整理1

Posted by CodingWithAlice on June 23, 2019

本文概要如下:

  • DOM树:把html页面或者是xml文件看成是一个文档,文档就是一个对象,这个文档中所有的标签都是元素,元素也可以看成是对象/标签(元素,对象)有很多,还有嵌套的关系,组成的这种层次结构,可以模拟成树形结构图,简称:树状图,就是DOM树。

  • DOM对象:通过DOM方式获取的元素得到的对象

  • 获取元素多种方式

  1. 根据 id属性 的值获取元素,返回来的是一个元素对象

    document.getElementById("id属性的值");

  2. 根据 标签名字 获取元素,返回来的是一个伪数组,返回具有指定标签名的元素子元素集合;document.getElementsByTagName("标签名字");

    下面的几个,有的浏览器不支持(ie8)

  3. 根据 name属性 的值获取元素,返回来的是一个伪数组,里面保存了多个的DOM对象;

    document.getElementsByName("name属性的值")

  4. 根据 类样式 的名字来获取元素,返回来的是一个伪数组,里面保存了多个的DOM对象;

    document.getElementsByClassName("类样式的名字")

  5. 根据 选择器 获取元素,返回来的是一个元素对象,文档中匹配到指定的元素的第一个对象;

    document.querySelector("选择器的名字#btn");

  6. 根据 选择器 获取元素,返回来的是一个伪数组,文档中匹配到指定的元素的对象集合;

    document.querySelectorAll("选择器的名字.cls")

  • 获取boby、title、html标签
document.body;		//获取的是元素--标签
document.title;	//标签中的值
document.documentElement;//获取根元素html
  • 操作基本标签的属性
    • src,title,alt,href,id属性
  • 操作表单标签的属性吧
    • name,value,type,checked,selected,disabled,readonly
  • 元素的样式操作
    • 对象.style.属性=值;
    • 对象.className=值;

为元素添加事件的操作:有事件源,触发和响应

例如:按钮被点击,弹出对话框 其中:按钮—->事件源 点击—->事件名字 被点了—>触发了 弹框了—>响应


接下来是详细分析介绍:

DOM经常进行的操作

​ • 获取元素 ​ • 动态创建元素 ​ • 对元素进行操作(设置其属性或调用其方法) ​ • 事件(什么时机做相应的操作)

<input type="button" value="弹框" onclick="alert('哈哈,我又变帅了')" />

等价于

<input type="button" value="显示效果" id="btn"/>
document.getElementById("btn").onclick = function () {
    alert("哈哈,我又变帅了");
};

等价于

var btnObj=document.getElementById("btn");
btnObj.onclick = function(){
    alert("这是分成两行代码的方式");
}
  • HTML:展示信息,展示数据

  • XML:侧重于存储数据

  • 根元素:html标签

    • 元素(element):页面中的所有的标签都是元素,元素可以看成是对象
  • 文档 document:一个网页可以称为文档;页面中的顶级对象
  • 节点 Node:网页中的所有内容都是节点(标签、属性、文本[文字、换行、空格、回车]、注释等)
  • 节点的属性:标签的属性;作用:为了将来获取很多节点,得到节点中的标签(元素),识别节点中的标签元素

  • 点击事件:如下以案例举例出现的情况以及其功能
案例1:点击按钮显示图片:点击按钮的时候设置img标签的src属性有一个图片的路径
<input type="button" value="显示图片" id="btn"/>
<img src="" alt="" id="im" />
var btnObj=document.getElementById("btn");
//为按钮注册点击事件,添加事件处理函数
btnObj.onclick=function () {
	var imObj=document.getElementById("im");
	imObj.src="images/liuyan.jpg";
	imObj.width="300";
	imObj.height="400";
};
案例2:点击按钮,修改p标签的显示内容
<input type="button" value="设置p的内容" id="btn"/>
<p id="p1">我是一个p标签</p>
//根据id获取按钮,为按钮注册点击事件,添加事件处理函数
document.getElementById("btn").onclick=function () {
	//根据id获取p标签,设置内容
	document.getElementById("p1").innerText="这是一个p";
};
注意技巧1:

凡是成对的标签,中间的文本内容,设置的时候,都使用 innerText 这个属性的方式;

案例3:点击按钮修改a标签的地址和热点文字
<input type="button" value="显示效果" id="btn"/>
<a id="ak" href="https://www.jiumodiary.com/">鸠摩搜书</a>
//注册点击事件,添加事件处理函数
document.getElementById("btn").onclick = function () {
	//设置href属性
	document.getElementById("ak").href = "https://codingwithalice.github.io/";
	//设置文字内容
	document.getElementById("ak").innerText = "CodingWithAlice";
};

可对javascript代码进行优化

//上面的代码,获取了两次id为ak的元素,增加了浏览器的负担。
//优化后的:
document.getElementById("btn").onclick = function () {
	//设置href属性,设置文字内容
	var aObj = document.getElementById("ak");
	aObj.href = "https://codingwithalice.github.io/";
	aObj.innerText = "CodingWithAlice";
};
案例4:点击按钮设置多个p标签的文字内容
<input type="button" value="显示效果" id="btn"/>
<div id="dv1">
	<p>CtrlCoder</p>
	<p>CtrlCoder</p>
</div>
<div id="dv2">
	<p>CodingWithAlice</p>
	<p>CodingWithAlice</p>
	<p>CodingWithAlice</p>
</div>
document.getElementById("btn").onclick=function () {
	//根据标签名字获取标签,返回的是一个伪数组
	var pObjs= document.getElementsByTagName("p");
		//循环遍历这个数组
		for(var i=0;i<pObjs.length;i++){
            //每个p标签,设置文字
            pObjs[i].innerText="我们都是p";
		}
};
案例5:点击按钮改变图片的alt和titile
<input type="button" value="显示效果" id="btn"/>
<img src="images/cangjingkong.jpg" alt="CtrlCoder" title="CodingWithAlice"/>
document.getElementById("btn").onclick = function () {
	//没有给img id名称,可以用tagname获取,但是一定要注意返回的是一个伪数组
	var imgObjs = document.getElementsByTagName("img");
	imgObjs[0].alt = "改了";//调用的时候以数组的形式调用
	imgObjs[0].title = "实现吧";
};
案例6:点击按钮修改文本框的值
<input type="button" value="修改文本框的值" id="btn"/><br/>
<input type="text" value=""/><br/>
<input type="text" value=""/><br/>
<input type="text" value=""/><br/>
<input type="text" value=""/><br/>
document.getElementById("btn").onclick = function () {
	//获取所有的文本框,包含了第一个type为button
	var inputs = document.getElementsByTagName("input");
	for (var i = 0; i < inputs.length; i++) {
		//用该元素的type属性判断这个元素是不是按钮
		if (inputs[i].type != "button") {
			inputs[i].value = "CodingWithAlice";
		}
	}
};
案例7:显示与隐藏
<style>
		div{
            width: 300px;
            height: 200px;
            background-color: darkmagenta;
}
</style>
<input type="button" value="隐藏" id="btn"/>
<input type="button" value="显示" id="btn2"/>
<div id="dv"></div>
	document.getElementById("btn").onclick=function () {
		document.getElementById("dv").style.display="none";
	};
	document.getElementById("btn2").onclick=function () {
		document.getElementById("dv").style.display="block";
	};
案例7:显示与隐藏优化:一个按钮的写法
<style>
	div{
        width: 300px;
        height: 200px;
        background-color: darkmagenta;
}
	.cls {
        display: none;
}
</style>
<input type="button" value="隐藏" id="btn"/>
<div id="dv"></div>
//点击按钮,通过类样式的方式设置div的显示和隐藏
document.getElementById("btn").onclick = function () {
	//判断的是div是否应用了类样式
	if (document.getElementById("dv").className != "cls") {
		//没有应用类样式,现在是显示的,应该隐藏
		document.getElementById("dv").className = "cls";
		//执行完上一句,就隐藏了,按钮改变
		this.value = "显示";
	} else {
		document.getElementById("dv").className = "";
        //执行完上一句,就显示了,按钮改变
		this.value = "隐藏";
	}
};
案例8:开关灯,body标签背景颜色
<style>
	.cls {background-color: black;}
</style>
<input type="button" value="开/关灯" id="btn"/>
document.getElementById("btn").onclick = function () {
	document.body.className = document.body.className != "cls" ? "cls" : "";
};
案例9:单选和多选和下拉菜单
//单选
<input type="button" value="修改性别" id="btn1"/>
<input type="radio" value="1" name="sex"/><input type="radio" value="2" name="sex" id="rad1"/><input type="radio" value="3" name="sex"/>保密
document.getElementById("btn1").onclick = function () {
	document.getElementById("rad1").checked = true;
};
注意技巧2:

在表单标签中,如果属性和值只有一个,并且值是这个属性本身,那么在写js代码,DOM操作的时候,这个属性值,是布尔类型就可以了。

//多选
<input type="button" value="选择兴趣" id="btn2"/>
<input type="checkbox" value="1" name="xingqu" />吃饭
<input type="checkbox" value="2" name="xingqu" id="ck1" />睡觉
<input type="checkbox" value="3" name="xingqu" id="ck2" />打豆豆
document.getElementById("btn2").onclick=function () {
	document.getElementById("ck1").checked=true;
	document.getElementById("ck2").checked=true;
};
//下拉菜单
<input type="button" value="点菜" id="btn"/>
<select name="" id="ss">
	<option value="1">油炸榴莲</option>
	<option value="2">爆炒臭豆腐</option>
	<option value="3">清蒸助教</option>
	<option value="4" id="op1">凉拌班主任</option>
	<option value="5">红烧小苏</option>
</select>
document.getElementById("btn").onclick=function () {
	//点击按钮选择菜
	document.getElementById("op1").selected=true;
};
案例10:改变文本域内的值
<textarea name="" id="tt" cols="30" rows="10" readonly="readonly"/disabled=“disabled”/readonly/disabled >
	注册用户的协议:某人问智者,大师:您觉得怎么做才是最快乐的?回答说:不要和愚者辩论这个人说:我不这么认为!大师说:您说的对.
</textarea>
<input type="button" value="注册" id="btn2"/>
document.getElementById("btn2").onclick=function () {
    //推荐使用value,textarea是表单标签。
	document.getElementById("tt").value="CodingWithAlice";
	//document.getElementById("tt").innerText="哈哈";
};
案例11:点击小图(保留),显示大图
<a href="images/1.jpg" id="ak">
    <img src="images/1-small.jpg" alt="">
</a>
<img src="" alt="" id="big"> //保证小图的保留
//点击小图,下面显示大图 //点击超链接触发事件
document.getElementById("ak").onclick=function () {
	document.getElementById("big").src=this.href;
	return false;//保证小图的保留
};

相册操作:

<ul id="imagegallery">
    <li>
        <a href="images/1.jpg" title="A">
            <img src="images/1-small.jpg" width="100" alt="1"/>
        </a>
    </li>
    <li>
        <a href="images/2.jpg" title="B">
            <img src="images/2-small.jpg" width="100" alt="2"/>
        </a>
    </li>
    <li>
        <a href="images/3.jpg" title="C">
            <img src="images/3-small.jpg" width="100" alt="3"/>
        </a>
    </li>
    <li>
        <a href="images/4.jpg" title="D">
            <img src="images/4-small.jpg" width="100" alt="4"/>
        </a>
    </li>
</ul>
<img id="image" src="images/placeholder.png" alt="" width="450"/>//点击链接a后显示大图的标签
<p id="des">选择一个图片</p>
//第一步:点击a标签,把a标签中的href的属性值给id为image的src属性
//第二步:把a的title属性的值给id为des的p标签赋值
var aObjs=document.getElementById("imagegallery").getElementsByTagName("a");
//循环遍历所有的a标签
for(var i=0;i<aObjs.length;i++){
	//为每个a标签注册点击事件
	aObjs[i].onclick=function () {
		document.getElementById("image").src=this.href;
		document.getElementById("des").innerText=this.title;
		//阻止超链接默认的跳转
		return false;
	};
}
案例12:隔行变色,奇红偶黄
<input type="button" value="隔行变色" id="btn"/>
<ul id="uu">
	<li>红旗</li>
    <li>五菱宏光</li>
    <li>奔驰</li>
    <li>兰博基尼</li>
    <li>哈弗</li>
</ul>
//第一种方法
document.getElementById("btn").onclick=function () {
	//获取所有的li标签
	var list=document.getElementById("uu").getElementsByTagName("li");
	for(var i=0;i<list.length;i++){
		if(i%2==0){
			list[i].style.backgroundColor="red";
		}else{
			list[i].style.backgroundColor="yellow";
		}
	}
};
//第二种方法:简写,善于利用三元表达式
document.getElementById("btn").onclick = function () {
	//获取所有的li标签
	var list = document.getElementById("uu").getElementsByTagName("li");
	for (var i = 0; i < list.length; i++) {
		list[i].style.backgroundColor = i % 2 == 0 ? "red" : "yellow";
	}
};
案例13:排他功能
<input type="button" value="没怀孕"/>
<input type="button" value="没怀孕"/>
<input type="button" value="没怀孕"/>
var btnObjs = document.getElementsByTagName("input");
for (var i = 0; i < btnObjs.length; i++) {
	//每个事件包括两件事情
	btnObjs[i].onclick = function () {
		//第一:把所有的按钮的value值设置为默认的值:没怀孕
		for (var j = 0; j < btnObjs.length; j++) {
			btnObjs[j].value = "没怀孕";
		}
		//第二:当前被点击的按钮设置为:怀孕了
		this.value = "怀孕了";
	};
}
注意技巧3:

设置被点击按钮的时候,不能用btnObjs[i].value ,因为事件是在触发的时候执行的,而 for 循环是在页面加载的时候执行完毕了,触发时间的时候,i=btnObjs.length

案例14:阻止超链接跳转
<a href="images/lb1.jpg" id='a1'><img src="images/content_bg.jpg" alt="" id='im'></a>
//方法1:
document.getElementById('im').onclick=function(){
	this.src=document.getElementById('a1').href;
	return false;//阻止链接默认跳转
}
<!--方法2:return flase 写在行内式中-->
<a href="http://www.baidu.com" onclick="alert('哎呀,我被点了'); return false">百度</a>
<!--方法3:注意这里哦,这里调用f1的函数,返回的是一个false,所以这里要添加一个return-->
<a href="http://www.baidu.com" onclick="return f1()">百度</a>
function f1() {
	alert("哇塞,好漂亮哦");
	return false;
}
案例15:鼠标进入onmouseover、离开onmouseout改变标签的背景颜色
        //获取所有的li标签
        var list = document.getElementsByTagName("li");
        for (var i = 0; i < list.length; i++) {
            //为li注册鼠标进入事件
            list[i].onmouseover = function () {
                this.style.backgroundColor = "yellow";
            };
            //为li注册鼠标离开事件
            list[i].onmouseout = function () {
                //恢复到这个标签默认的颜色
                this.style.backgroundColor = "";
            };
        }
注意技巧4:
  1. getElementsByTagName获取的是数组,如果只使用一个,就要加序号getElementsByTagName("li")[0]

  2. 设置元素的样式的方式:

    ​ 1. 对象 ** . style . **属性 **= **值

    2. **对象** . className = **值**;
    
  3. 对象.className=“”使用的时候要注意,若只写想要设置的类名,会覆盖这个对象所有的类

案例17:点击按钮,修改div的宽、高、背景颜色
	<input type="button" value="设置样式" id="btn"/>
	<div id="dv"></div>
	//方法一:直接修改样式 .style.属性 = 值;
	document.getElementById$("btn").onclick = function () {
		document.getElementById("dv").style.width = "300px";
		document.getElementById("dv").style.height = "200px";
		document.getElementById("dv").style.backgroundColor = "pink";
        //原来在css中是background-color
	};
	/*方法二:通过给元素添加css样式属性 .className = 值; */
	.cls {width: 300px;height: 200px;background-color: yellow;border: 2px solid red;}
	my$("btn").onclick = function () {
		//在js代码中DOM操作的时候,设置元素的类样式,不用class关键字,应该使用,className
		my$("dv").className="cls";
        //等价于:<div id="dv" class=“cls”/cls></div>
	};
注意技巧5:

如果在 css 中属性是多个单词(带-)的写法,那么在js代码中DOM操作的时候,要用驼峰命名法来调用

案例18:获取焦点onfocus,失去焦点事件onblur
		my$("txt").onfocus = function () {
			//判断文本框的内容是不是默认的内容
			if (this.value == "请输入搜索内容") {
				this.value = "";//清空文本框
				this.style.color = "black";
			}
		};
		my$("txt").onblur = function () {
		//1.判断字符串方式
			if (this.value == "") {
				this.value = "请输入搜索内容";
				this.style.color = "gray";
			}
		//2.判断字符串长度方式,更推荐这种,数字判断的运行效率高
			if (this.value.length == 0) {
				this.value = "请输入搜索内容";
				this.style.color = "gray";
			}
		};
注意技巧6:
  1. 如果这个属性在浏览器中不支持,那么这个属性的类型是undefined
案例19:自定义属性
  1. 设置自定义属性:setAttribute("属性的名字","属性的值");
  2. 获取自定义属性的值:getAttribute("属性的名字");
  3. 移除义属性:removeAttribute("属性的名字");
<ul id="uu">
    <li>数学成绩</li>
    <li>英语成绩</li>
    <li>语文成绩</li>
    <li>科学成绩</li>
    <li>历史成绩</li>
</ul>
var list=my$("uu").getElementsByTagName("li");//根据id获取ul标签,并且或者该标签中所有的li
//为每个li添加自定义属性
for(var i=0;i<list.length;i++){//循环遍历
	list[i].setAttribute("score",(i+1)*10);//添加在DOM对象上,不在标签中
	list[i].onclick=function(){//点击每个li标签,获取对应的自定义属性值
		alert(this.getAttribute("score"));
	};
}
//移除自定义属性
document.getElementById("btn").onclick=function () {
	document.getElementById("dv").removeAttribute("score");//移除自定义属性,没值也没属性
	document.getElementById("dv").className="";//移除元素的类样式,值没有了,但是属性还是有的	
	document.getElementById("dv").removeAttribute("class");//移除自定义属性,没值也没属性
};
案例20:获取标签的内容
分类 名称 说明 使用时的区别
属性 innerHTML 设置或返回元素开始和结束标签之间的 HTML 保持编写的格式、样式标签<>
属性 innerText 设置或返回元素中去除所有标签的内容 去掉所有格式以及标签的纯文本内容
属性 textContent 设置或返回指定节点的文本内容 去掉标签后,保留文本样式,有回车
方法 document.write() 向文档写入指定的内容  
方法 document.writeln() 向文档写入指定的内容并换行