JavaScript DOM对象(文档对象模型)

JavaScript - DOM

一.理解

    DOM:Document Object Model 文档对象模型

    要实现页面的动态交互效果,bom 操作远远不够,需要操作 html 才是核心。如何操作 htm,就是 DOM。简单的说,dom 提供了用程序动态控制 html 接口。DOM即文档对象模型描绘了一个层次化的节点树,运行开发人员添加、移除和修改页面的某一部分。dom 处于javascript 的核心地位上。

    每个载入浏览器的 HTML 文档都会成为 Document 对象。Document 对象使我们可以从脚本中对 HTML 页面中的所有元素进行访问。Document 对象是 Window 对象的一部分,可通过 window.document 属性对其进行访问。
在这里插入图片描述



二.节点

    加载 HTML 页面时,Web 浏览器生成一个树型结构,用来表示页面内部结构。DOM 将这种树型结构理解为由节点组成,组成一个节点树。对于页面中的元素,可以解析成以下几种类型的节点:
在这里插入图片描述

<!DOCTYPE html>
<html>

	<head>
		<meta charset="utf-8" />
		<title>!!到处都是树!</title>
	</head>

	<body>
		<div title="属性节点">测试 Div</div>
	</body>

</html>

html ---- 文档节点
div ---- 元素节点
title ---- 属性节点
测试 Div ---- 文本节点
在这里插入图片描述



三.元素节点的操作

    当HTML文档在被解析为一颗DOM树以后,里面的每一个节点都可以看做是一个一个的对象,我们成为DOM对象,对于这些对象,我们可以进行各式各样的操作,查找到某一个或者一类节点对象,可以创建某种节点对象,可以在某个位置添加节点对象,甚至可以动态地删除节点对象,这些操作可以使我们的页面看起来有动态的效果,后期结合事件使用,就能让我们的页面在特定时机、特定的事件下执行特定的变换。

1、获取节点

    在进行增、删、改的操作时,都需要指定到一个位置,或者找到一个目标,此时我们就可以通过Document对象提供的方法,查找、定位某个对象(也就是我们说的节点)。
    注意:操作 dom 必须等节点初始化完毕后,才能执行。 处理方式两种:
    a. 把 script 调用标签移到html末尾即可;
    b. 使用onload事件来处理JS,等待html 加载完毕再加载 onload 事件里的 JS。

window.onload = function() {
	// 预加载html后执行
};

获取方式如下:
在这里插入图片描述
主语 document.

1.1 根据id
    getElement + By +Id( );
1.2. 根据标签名TagName
    getElements + By + TagName( );
1.3 根据样式名ClassName
    getElements + By + ClassName( );
1.4 根据name属性值
    getElements + By + Name( );

代码示例:

	<!-- 根据id class获取元素 -->
	<p id="p1" class="paragraph">这是一个段落<span>文本</span></p>
	<p id="p2" class="paragraph">这又是一个段落</p>
	
	<!-- 根据name获取元素 -->
	<input type="text" name="txt" />
	<input type="checkbox" name="hobby" value="游泳" />游泳
	<input type="checkbox" name="hobby" value="篮球" />篮球
	<input type="checkbox" name="hobby" value="足球" />足球
	
	<hr />
	
	<!-- 根据标签名称获取元素 -->
	<!-- href="javascript:void(0)":伪协议,表示不执行跳转,而执行指定的点击事件。 -->
	<a href="javascript:void(0);" onclick="testById();">根据id获取元素</a>
	<a href="javascript:void(0);" onclick="testByName();">根据name获取元素</a>
	<a href="javascript:void(0);" onclick="testByTagName();">根据标签名称获取元素</a>
	<a href="javascript:void(0);" onclick="testByClass();">根据class获取元素</a>
	
	<script type="text/javascript">
		// 根据id获取元素
		function testById() {
			// 返回单个对象
			var p = document.getElementById("p1");
			console.log(p);
			console.log(p.innerHTML); // 表示获取元素开始标签和结束标签之间的html结构
			console.log(p.innerText); // 表示获取标签之间的普通文本
		}

		// 根据name获取元素
		function testByName() {
			// 返回对象数组
			var hobby = document.getElementsByName("hobby");
			console.log(hobby);
			for(var i = 0; i < hobby.length; i++) {
				console.log(hobby[i].value);
			}
		}

		// 根据标签名称获取元素
		function testByTagName() {
			// 返回对象数组
			var input_arr = document.getElementsByTagName("input");
			for(var i = 0; i < input_arr.length; i++) {
				if(input_arr[i].type == "text") {
					console.log("text类型");
				} else if(input_arr[i].type == "checkbox") {
					if(input_arr[i].checked) {
						console.log(input_arr[i].value);
					}
				}
			}
		}

		// 根据class获取元素
		function testByClass() {
			// 返回对象数组
			var paragraph = document.getElementsByClassName("paragraph");
			console.log(paragraph[0].innerHTML);
			paragraph[0].innerHTML += ",这是一段新的文本";
		}
	</script>

说明:href=“javascript:void(0)”;伪协议,表示不执行跳转,而执行指定的点击事件。

根据ID获取:
在这里插入图片描述
根据name获取:
在这里插入图片描述
根据标签名称获取:
在这里插入图片描述
根据class获取:
在这里插入图片描述

2、创建节点

在这里插入图片描述
主语 document.

2.1 创建元素节点
    createElement()
2.2 创建文本节点
    createTextNode()
2.3
    innerHTML

3、插入节点

在这里插入图片描述
主语 父节点.

3.1 字符串插入文档
    write()
3.2 子节点插入作为最后子节点
    appendChild()
3.3 指定节点位置插入新的节点
    insertBefore()

代码示例:
添加段落
	<button onclick="add_para()">添加段落</button>
	<div id="container"></div>

	<script type="text/javascript">
		function add_para() {
			// 第一种方式
			// 根据id获取元素div
			var container = document.getElementById('container');
			// 创建p元素
			var paragraph = document.createElement('p');
			// 创建文本节点
			var txt = document.createTextNode('以后的你会感谢现在努力的你');
			// p元素添加文本节点
			//paragraph.appendChild(txt);
			// div元素添加p元素
			//container.appendChild(paragraph);

			// 第二种方式
			// 向p节点中添加内容
			// paragraph.innerHTML = "以后的你会感谢现在努力的你";
			// 将p节点追加到container节点中
			// container.appendChild(paragraph);
				
			// 第三种方式
			// 将字符串类型的p标签内容添加到container中
			// var str = "<p>以后的你会感谢现在努力的你</p>";
			// container.innerHTML += str;
		}
	</script>

在这里插入图片描述

添加图片
	<button onclick="addImg();">添加图片</button>
		
	<div id="container"></div>

	<script type="text/javascript">
		// 添加图片
		function addImg() {
			// 创建img元素
			var img = document.createElement("img");
			// 设置属性第一种方式
			// 设置img元素的src属性
			// img.src = "http://www.baidu.com/img/bd_logo1.png";
				
			// 设置属性第二种方式
			// setAttribute() 方法添加指定的属性,并为其赋指定的值。
			// 设置img元素的src属性
			img.setAttribute('src', 'http://www.baidu.com/img/bd_logo1.png');
			img.style.width = '540px';
			img.style.height = '258px';
			// 获取div元素
			var container = document.getElementById("container");
			// 将img元素节点追加到div元素中
			container.appendChild(img);
		}
	</script>

在这里插入图片描述

添加文本框
	<button onclick="addTxt();">添加文本框</button>
		
	<div id="container"></div>

	<script type="text/javascript">
		// 添加文本框
		function addTxt() {
			// 创建input元素
			var txt = document.createElement("input");
			// 设置类型第一种方式
			// txt.type ="text"; 
			// txt.value ="添加成功";
				
			// txt.type='password'
			// txt.value='123'
				
			// 设置类型第二种方式
			txt.setAttribute('type', 'text');
			txt.setAttribute('value', '添加成功');
				
			// 获取div元素
			var container = document.getElementById("container");
			// 将input节点追加到div元素中
			container.appendChild(txt);
	}
    </script>

在这里插入图片描述

添加选项框
	<button onclick="addOptions()">添加选项</button>
	<select name="music">
		<option value="0">---请选择---</option>
		<option value="1">南山南</option>
		<option value="2">喜欢你</option>
	</select>

	<script type="text/javascript">
		// 添加下拉框的选项			
		function addOptions() {
			// 第一种方式
			// 创建下拉项
			var option = document.createElement("option");
			option.value = "3";
			option.text = "北京北京";
			// 获取下拉框
			var sel = document.getElementsByTagName("select")[0];
			// 添加下拉项 
			sel.appendChild(option);
				
			// 第二种方式
			var option = document.createElement("option");
			option.value = "4";
			option.text = "上海上海";
			// 获取下拉框
			var sel = document.getElementsByTagName("select")[0];
			// 添加下拉项
			sel.options.add(option);
				
			// 第三种方式
			var sel = document.getElementsByTagName("select")[0];
			sel.innerHTML += "<option value='5'>松江松江</option>";
		}
	</script>

在这里插入图片描述

4、间接查找节点

在这里插入图片描述
主语:主位置节点.

4.1 返回元素的一个子节点的数组 (有参数)
    childNodes[n]
4.2 返回元素的第一个子节点
    firstChild
4.3 返回元素的最后一个子节点
    lastChild
4.4 返回元素的上一个兄弟节点
    previousSibling
4.5 返回元素的下一个兄弟节点
    nextSibling
4.6 返回元素的父节点
    parentNode
代码示例:
	<button type="button" id="btn">测试按钮</button>
	
	<div id="dv">
		<form>
			<table>
				<input />
				<input />
				<input id="inp" />
				<span>
					<p></p>
				</span>
			</table>
		</form>
	</div>
	
	<script type="text/javascript">
		var dv = document.getElementById('dv');
		
		// childNodes返回元素的一个子节点的数组
		function get_childNodes() {
			console.log(dv.childNodes[1]);  // 获取到form
		}
		
		// firstChild返回元素的第一个子节点
		function get_firstChild() {
			console.log(dv.firstChild);
		}
		
		// lastChild返回元素的最后一个子节点
		function get_lastChild() {
			console.log(dv.lastChild);
		}
		
		// nextSibling返回元素的下一个兄弟节点
		function get_nextSibling() {
			var inp = document.getElementById('inp');
			console.log(inp.nextSibling);
		}
		
		// parentNode返回元素的父节点
		function get_parentNode() {
			var inp = document.getElementById('inp');
			console.log(inp.parentNode);
		}
		
		// previousSibling返回元素的上一个兄弟节点
		function get_previousSibling() {
			var inp = document.getElementById('inp');
			console.log(inp.previousSibling);
		}
		
		var btn = document.getElementById('btn');
		btn.onclick = get_previousSibling;  // DOM 0级方式处理 解耦
	</script>

5、替换节点

在这里插入图片描述
主语: 父节点.

用新的节点替换旧的节点
    replaceChild(newNode, oldNode)
第一种:获取父节点,然后用新的节点替换旧节点
    父节点.replaceChild(newNode, oldNode);
第二种:通过旧节点定位到父节点,然后用新的节点替换旧节点
    oldNode.parentNode.replaceChild(newNode, oldNode);

代码示例:
	<div id="dv">
		<button type="button" id="btn">我是一个按钮</button><br />
		<button type="button" onclick="replace_child();">替换</button>
	</div>

	<script type="text/javascript">
		function replace_child() {
			// 第一种方式:获取父节点,然后用新的节点替换旧节点
			// 获取button元素
			var btn = document.getElementById('btn');
			// 创建p元素
			var p = document.createElement('p');
			p.innerText = '我是一个段落';
			// 获取到父元素div 用p元素替换button元素
			var dv = document.getElementById('dv');
			dv.replaceChild(p, btn);
				
			// 第二种方式:通过旧节点定位到父节点,然后用新的节点替换旧节点
			// 用p元素替换button元素
			// btn.parentNode.replaceChild(p, btn);
		}
	</script>

替换前:
在这里插入图片描述
替换后:
在这里插入图片描述

6、克隆节点

在这里插入图片描述

var 复制好的节点 = 被复制的节点.cloneNode([true/false]);

    true:深度克隆,可以克隆结构和内容
    false(默认值):只克隆结构
    均不能克隆功能

代码示例:
	<ul id="src_ul">
		<li>red</li>
		<li>yellow</li>
		<li>blue</li>
	</ul>
	<button onclick="copy();">复制</button>
	<hr />
	<div id="copy_div"></div>

	<script type="text/javascript">
		function copy() {
			// 获取要复制的元素
			var src_ul = document.getElementById("src_ul");
			// 复制 true深度克隆,可以克隆结构和内容
			var copy_ul = src_ul.cloneNode(true);
			// 将复制好的内容添加到div中
			document.getElementById("copy_div").appendChild(copy_ul);
		}
	</script>

在这里插入图片描述

7、删除节点

在这里插入图片描述

主语:父节点.

从元素中移除子节点
    removeChild()
第一种:获取父节点,然后删除子节点
    父节点.removeChild(childNode);
第二种:通过旧节点定位到父节点,然后删除子节点
    childNode.parentNode.removeChild(childNode);

代码示例:

	<div id="del_dv">
		<span id="programmer">程序猿</span>
		<a href="javascript:void(0)" onclick="delNode();">删除</a>
	</div>

	<script type="text/javascript">
		function delNode() {
			// 第一种方式:获取父节点,然后删除子节点
			var dv = document.getElementById('del_dv');
			var programmer = document.getElementById("programmer");
			dv.removeChild(programmer);
				
			// 第二种方式:通过旧节点定位到父节点,然后删除子节点
			// var programmer = document.getElementById("programmer");
			// programmer.parentNode.removeChild(programmer);
		}
	</script>

删除前:
在这里插入图片描述
删除后:
在这里插入图片描述



四.属性操作

    在操作DOM对象时,除了可以操作对象整体之外,还可以更加灵活地操作对象中的各个属性。
在这里插入图片描述
在这里插入图片描述

返回指定元素的属性值
    getAttribute()
返回指定属性节点
    getAttributeNode()
设置或者返回元素的 id
    element.id
设置或者改变指定属性并指定值
    setAttribute()
设置或者改变指定属性节点
    setAttributeNode()
设置或返回元素的样式属性
    element.style
设置或返回元素的class属性
    element.className
返回元素的类名
    element.classList

代码示例:
	<input type="text" value="加油,胜利就在眼前" id="txt" class="test" /><br />
	性别:<input type="radio" checked="true" name="sex" value="1"><input type="radio" name="sex" value="0"><br />
	<img src="img/timg.jpg" id="sxtimg" title="sxt" />

	<script type="text/javascript">
		var txt = document.getElementById("txt");
		var sxtimg = document.getElementById("sxtimg");
		var sex = document.getElementsByName("sex")[0];
		
		// 获取值
		// txt.getAttribute("class")// IE 不支持
		// txt.getAttribute("className") //IE支持
         // 浏览器兼容操作
		var clz = (txt.getAttribute("class") == 'undefined') ? txt.getAttribute("className") : txt.getAttribute("class");
		console.log(txt.getAttribute("id") + "-->" + txt.getAttribute("value") + "-->" + clz);
		console.log(txt.value);  // 获取文本
		console.log(sex.checked);  // 获取状态是否选中

		// 修改值
		txt.className = 'test1';
		sxtimg.style.display = 'none';
		txt.setAttribute("value", "success");
		txt.setAttribute("aaa", "000000"); // 自定义属性
		console.log(txt.getAttribute("aaa")); // 获取自定义属性值
		
		// 删除属性
		txt.removeAttribute("aaa");
		console.log(txt.getAttribute("aaa"));
	</script>

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值