本章目标
理解文档对象模型
熟练掌握document对象访问页面元素
熟练掌握动态添加页面元素
通过DOM操作html页面中的标签,属性,样式等。
1.DOM编程概述
1.1 什么是DOM编程
文档对象模型(Document Object Model,简称DOM),是W3C组织推荐的处理可扩展标记语言的标准编程接口。在网页上,组织页面(或文档)的对象被组织在一个树形结构中。
使用js代码来操作文档中的元素(标签元素,文本,属性)。
1.2 为什么要学习DOM编程
学习DOM操作 就是 操作页面中的标签/节点/元素的。
增删改
新增:新增什么? 各种标签 本来不存在,但是我们又想用, 无中生有!
- 造标签 此时没有样式 创建
- 美化(设置样式,添加内容) 美化
- 将造好的标签 添加到 该添加的地方!添加
删除:删除标签
修改:1.修改样式 2.内容 3. 替换 4.属性
2.节点操作
对节点的操作 增删改查
2.1 节点概述
什么是节点?
- 文档是一个文档节点。(页面中的汉字,空格符,特殊符号)
- 所有的HTML元素都是元素/标签节点。 **
- 所有 HTML 属性都是属性节点。
- 文本插入到 HTML 元素是文本节点。
2.2 标签节点对象的获取
想操作页面中的某一个标签,要先拿到这个标签。
2.3 节点的操作
增加操作
名称 | 含义 |
document.createElement(标签名) | 创建一个节点 |
insertBefore(新标签,哪个标签之前) | 在哪个标签之前插入节点 |
父.appendChild(新标签) | 在父节点的里边追加子节点 |
cloneNode() | 复制节点,如果参数为true,还会复制当前节点的子孙节点,否则只复制当前节点。 |
删除操作
名称 | 含义 |
父.removeChild(子元素对象) | 删除指定的子标签/子节点 |
自己.remove() | 删除自身 |
修改操作
名称 | 含义 |
父.replaceChild(新标签, 旧标签); | 将父标签中的旧标签用新标签替换掉 |
<!DOCTYPE html >
<html>
<head>
<title> New Document </title>
<meta charset="utf-8">
<meta name="Generator" content="EditPlus">
<meta name="Author" content="">
<meta name="Keywords" content="">
<meta name="Description" content="">
<style type="text/css">
#con{
width:300px;
height:300px;
border:2px solid red;
}
</style>
</head>
<body>
<!--onclick="addYS()" 通过标签事件属性绑定函数-->
<input type="button" value="添加元素" id="btnAdd" />
<input type="button" value="删除元素" id="btnDelete" />
<hr/>
<div id="con">
</div>
<script type="text/javascript">
//通过js方式绑定元素的事件函数
//var btn = document.getElementById("btnAdd");
// 为按钮的单击事件绑定一个函数
// 改函数并不会马上运行,只有按钮点击的时候才会触发
// btnAdd:通过id名获取元素对象
btnAdd.onclick = function(){
// 创建一个p元素,并添加到div中
var myp = document.createElement("p");
// 设置p元素的内容
myp.innerHTML="这是一个P";
// 将p元素添加到页面的div中,这样新加的元素才会显示出来
con.appendChild(myp);
}
btnDelete.onclick=function(){
//删除div中的元素
//1.通过父删除子元素
// con.lastElementChild:div中的最后一个元素
//con.removeChild(con.lastElementChild);
//2.通过子元素删除自己
con.lastElementChild.remove();
}
</script>
</body>
</html>
2.4 节点具有的属性
属性中包含Node关键字,获取都是节点(html标签,文本)
属性中包含Element关键字的,获取的都是元素(html元素/标签)
节点对象属性 | 含义 |
childNodes | 所有直接子节点(包含文本节点和元素节点) |
*children | 所有元素子节点——获取所有的子标签 |
*firstElementChild | 第一个子元素对象,获取的是html元素 |
firstChild | 第一个子节点对象,获取的是节点 |
*lastElementChild | 最后一个子元素对象 |
lastChild | 最后一个子节点对象 |
parentNode | 父节点 |
*parentElement | 父元素 |
nextSibling | 返回当前元素紧跟的下一个兄弟节点(包含文本/标签等) |
*nextElementSibling | 返回指定元素之后的下一个兄弟元素节点(相同节点树层中的下一个元素节点)。 |
previousSibling | 返回当前元素上一个节点紧挨着的 |
*previousElementSibling | 返回指定元素的前一个兄弟元素(相同节点树层中的前一个元素节点) |
节点对象属性 | 含义 |
nodeValue | 节点值 (文本节点的值)。文本节点和属性节点返回文本内容,元素节点返回null |
nodeType | 节点类型。1标签节点 2 属性节点 3文本节点 |
nodeName | 节点名称。文本节点固定返回: #text 元素节点:返回标签名 |
<!DOCTYPE html >
<html>
<head>
<title> New Document </title>
</head>
<body>
<div id="con">
<h1>这是标题</h1>
<span>这是span</span>
<p>这是p元素</p>
</div>
<script type="text/javascript">
//获取div
var mydiv = document.getElementById("con");
//firstElementChild:找父元素的第一个子元素
var myh1 = mydiv.firstElementChild;
//nodeName: 元素名字
//alert(myh1.nodeName);
//tagName :标签名
//alert(myh1.tagName);
//innerHTML:元素内部内容
//alert(myh1.innerHTML);
//outerHTML:元素包含自己标签的内容
alert(myh1.outerHTML);
</script>
</body>
</html>
元素对象属性/方法 | 值 |
*value | 文本框的值 |
id | 标签的id属性值 |
name | 表单元素的name属性值 |
className | class属性值 |
*innerHTML | 标签中的所有HTML内容 |
outerHTML | 包含标签本身以及标签体 |
innerText | 标签中的所有文本内容 |
getAttribute("属性名") | 获取标签属性值方法 |
setAttribute("属性名","属性值") | 为标签设置属性方法 |
getAttributeNode("属性名") | 获取属性节点对象方法 |
修改本身就有的属性 只要能直接 . 出来 就表示 . 出来的属性都是本身就有的(系统规定的)
2.5 常用查询节点方法
方法 | 说明 |
*getElementById | 根据编号获取元素 |
getElementsByTagName | 根据标签名获取元素数组 |
getElementsByClassName | 根据类样式名获取元素数组 |
getElementsByName | 根据元素的name属性查找元素数组 |
*querySelector | 可以根据标签名,id名(#id),类名(.类)获取单个元素 |
*querySelectorAll | 可以根据标签名,id多名,类名获取元素数组 |
<!DOCTYPE html >
<html>
<head>
<title> New Document </title>
<meta charset="utf-8">
</head>
<body>
<div class="c1">这是一个div1</div>
<p>这是一个p1</p>
<p class="c1">这是一个p2</p>
<div>这是一个div2</div>
<p>这是一个p3</p>
<script type="text/javascript">
//var ary = [1,2,3,4];
//获取当前页面中所有的p元素
var pAry = document.getElementsByTagName("p");
//pAry[0].innerHTML:访问第一个p元素的innerHTML属性
//alert(pAry[0].innerHTML);
//pAry[1].innerHTML:访问第二个p元素的innerHTML属性
//alert(pAry[1].innerHTML);
//alert(pAry[2].innerHTML);
//获取class名字为c1的所有元素
var ary = document.getElementsByClassName("c1");
//遍历获取的元素数组
/*for(var i=0;i<ary.length;i++){
//获取其中的一个元素
var ys = ary[i];
//ys.innerHTML:获取遍历的元素的内部内容
alert(ys.innerHTML);
}*/
//div元素
//div元素.innerHTML: 显示的div元素的内容
//对象:具有一系列的属性和行为
</script>
</body>
</html>
<!DOCTYPE html >
<html>
<head>
<title> New Document </title>
<meta charset="utf-8">
</head>
<body>
爱好:
<input type="checkbox" name="hobby" value="奋斗"/>奋斗
<input type="checkbox" name="hobby" value="运动"/>运动
<input type="checkbox" name="hobby" value="看B站"/>看B站
<input type="checkbox" name="hobby" value="读唐诗"/>读唐诗
<input type="checkbox" name="hobby" value="练习毛笔字"/>练习毛笔字
<input type="button" value="你的爱好是哪些?" id="btnShow1"/>
<hr/>
你喜欢的水果?
<input type="checkbox" name="fruit" value="苹果"/>苹果
<input type="checkbox" name="fruit" value="香蕉"/>香蕉
<input type="checkbox" name="fruit" value="橘子"/>橘子
<input type="checkbox" name="fruit" value="榴莲"/>榴莲
<input type="button" value="你喜欢的水果是哪些?" id="btnShow2"/>
<script type="text/javascript">
//练习:获取选中的复选框
//绑定按钮的单击事件
btnShow1.onclick=function(){
//1.获取所有的爱好复选框
var ckAry = document.getElementsByName("hobby");
//2.判断复选框是否处于选中状态
//遍历获取的所有复选框
for(var i=0;i<ckAry.length;i++){
//获取当前遍历到的复选框
var ck = ckAry[i];
//判断这个复选框的状态
// ck.checked:复选框的选中状态 true/false
if(ck.checked==true){
//这个复选框选中了,则提示它的值
alert(ck.value);
}
}
//一次性弹出所有选中内容
}
</script>
</body>
</html>
querySelector,querySelectorAll
<!DOCTYPE html >
<html>
<head>
<title> New Document </title>
<meta charset="utf-8">
</head>
<body>
<div class="c1">这是一个div1</div>
<p>这是一个p1</p>
<p class="c1">这是一个p2</p>
<div id="mydiv">这是一个div2</div>
<p>这是一个p3</p>
<script type="text/javascript">
//使用querySelector,根据选择器(标签,.类,#id)获取单个元素
//var d = document.querySelector("#mydiv");
//alert(d.innerHTML);
//使用querySelectorAll,根据选择器(标签,.类,#id)获取元素元素
var ary = document.querySelectorAll(".c1");
for(var i=0;i<ary.length;i++){
alert(ary[i].innerHTML);
}
</script>
</body>
</html>
3.案例练习
3.1 发表说说
分析:
1.首先需要一个div装所有的评论。
2.当点击发表按钮时 将评论添加到div中
3.添加之前 先创建标签 < span>放名字 在创建一个span放内容 在将创建的两个span 添加到一个P标签中
<!DOCTYPE html>
<html>
<head>
<title> new document </title>
<style type="text/css">
fieldset{
width:500px;
height:300px;
border:1px solid red;
margin:0px auto;
text-align:center
}
#con{
border:2px dashed gray;
height:200px;
margin:10px;
padding:10px;
text-align:left;
}
</style>
<script type="text/javascript">
function send(){
var xm = txtName.value;
var nr = txtMsg.value;
//var str = xm+"说:"+nr+"<br/>";
//con.innerHTML +=str;
var span1 = document.createElement("span");
span1.innerHTML=xm+"说:";
span1.style.backgroundColor="#ffff66";
var span2 = document.createElement("span");
span2.innerHTML=nr;
span2.style.backgroundColor="lightblue";
var p = document.createElement("p");
p.style.border="1px solid gray";
p.appendChild(span1);
p.appendChild(span2);
con.appendChild(p);
}
// 扩展,添加删除按钮删除说说
</script>
</head>
<body>
<fieldset>
<legend>发表说说</legend>
<div>
姓名:
<input type="text" id="txtName"/>
内容:
<input type="text" id="txtMsg"/>
<input type="button" value="发表" onclick="send()"/>
</div>
<div id="con">
</div>
</fieldset>
</body>
</html>
扩展功能,添加删除按钮
掌握事件函数绑定的各种方式
<body>
<!--标签事件绑定方式
<input type="button" value="按钮1" id="btn1" onclick="test1()"/>
<input type="button" value="按钮2" id="btn2" onclick="test2()"/>
<input type="button" value="按钮3" id="btn3" onclick="test3()"/>
-->
<input type="button" value="按钮1" id="btn1" />
<input type="button" value="按钮2" id="btn2" />
<input type="button" value="按钮3" id="btn3" />
<script type="text/javascript">
function test1(){
alert("1111");
}
function test2(){
alert("2222");
}
function test3(){
alert("3333");
}
//通过元素对象绑定事件/js方式绑定事件
/*btn1.onclick=test1;
btn2.onclick=test2;
btn3.onclick=test3;*/
//事件绑定匿名函数
btn1.onclick=function(){
//this:当前触发事件的元素
alert(this.value);
}
btn2.onclick=function(){
alert(this.value);
}
btn3.onclick=function(){
alert(this.value);
}
</script>
</body>
完成说说删除功能
<!DOCTYPE html >
<html>
<head>
<title> New Document </title>
<meta charset="utf-8">
<meta name="Generator" content="EditPlus">
<meta name="Author" content="">
<meta name="Keywords" content="">
<meta name="Description" content="">
<style type="text/css">
fieldset{
width:500px;
border:2px solid gray;
margin:0px auto;
text-align:center;
}
#con{
margin:10px;
padding:10px;
border:2px dashed gray;
height:300px;
text-align:left;
}
#con p{
border:1px solid gray;
padding:10px;
/*变为相对定位*/
position:relative;
}
#con .s1{
background-color:#ffff99;
}
#con .s2{
background-color:#6699ff;
}
#con .close{
border:2px solid red;
width:20px;
height:20px;
/*变为圆形*/
border-radius:10px;
text-align:center;
line-height:20px;
/*元素设置绝对定位:可以变为块状*/
position:absolute;
right:-10px;
top:-10px;
background-color:#cccc33;
/*让鼠标放到span上时,变为手型*/
cursor:pointer;
}
</style>
</head>
<body>
<!--发表说说-->
<fieldset>
<legend>发表说说</legend>
<div>
姓名:
<input type="text" name="xm" id="xm"/>
内容:
<input type="text" name="msg" id="msg"/>
<input type="button" value="发表说说" onclick="sendMsg()"/>
</div>
<div id="con">
</div>
</fieldset>
<script type="text/javascript">
//定义函数,发表说说
function sendMsg(){
//获取姓名文本框的内容
var name = xm.value;
//获取内容框中的信息
var xinxi = msg.value;
//创建p元素
var myp = document.createElement("p");
//创建span元素
var myspan1 = document.createElement("span");
myspan1.innerHTML=name+"说:";
//设置元素的行内样式
//myspan1.style.backgrounColor="yellow";
//设置元素的类样式
myspan1.className="s1";
//创建span元素
var myspan2 = document.createElement("span");
myspan2.innerHTML=xinxi;
//设置元素的类样式
myspan2.className="s2";
//创建span元素,作为关闭按钮
var myspanClose = document.createElement("span");
myspanClose.innerHTML="x";
myspanClose.className="close";
//为元素绑定单击事件
myspanClose.onclick=function(){
//alert(123);
//this:表示当前发生点击事件的span元素,固定写法
//this.parentElement:当前元素的爹
//remove():删除自己
this.parentElement.remove();
}
//将两个span添加到p元素中
myp.appendChild(myspan1);
myp.appendChild(myspan2);
myp.appendChild(myspanClose);
//将p元素添加到div中
con.appendChild(myp);
}
</script>
</body>
</html>
3.2 购物车
分析:
1.先搭建ui
2.新增
新增基操:(没有任何限定条件)
添加条件:
1.新增商品时要先判断购物车中是否为空,如果为空直接新增,否则就判断
该商品在购物车中是否存在,如果不存在就新增,如果存在就让数量++;
抛出问题:我要怎么做才能取出 购物车中的每一个商品名称?
可以看出 购物车中的每一个商品名称 都是所属tr的第二个子标签,那么我们可以通过 取出所有的tr,然后在去tr的第二个td子标签。
3.+ - 按钮
4.计算总价,和数量
5.删除一行
6.全选和全不选
7.删除多行
<!DOCTYPE html>
<html>
<head>
<title> new document </title>
<meta charset="gbk"/>
<script type="text/javascript">
// 1.创建购物车UI(user interface)用户界面
// 2.功能实现
/*
a. 添加商品
a1: 直接添加
a2: 如果添加商品存在的时候,进行数量累加
b. 调整数量,计算小计
b1: 通过"+","-"调整数量
b2: 通过文本框输入调整数量(数据校验),通过文本框的onblur(失焦)事件处理
c. 汇总合计(汇总选择商品的总价)
d. 删除(单行删除)
e. 选择部分商品(全选/部分选择/反选)
f. 批量删除多个商品
*/
</script>
</head>
<body>
<div style="width:800px;height:500px;margin:10px auto;border:1px solid black">
<!--商品信息部分-->
<fieldset>
<legend>商品信息</legend>
<form name="frmGoods">
<!--
name属性用于向服务器传值的时候,做数据标识
id属性用于在js中获取元素的查找条件
使用元素名访问元素对象:frmGoods(表单名).goodsName(元素名)
使用元素的id名访问元素对象: goodsName(元素id)
-->
品名:<input type="text" name="goodsName" id="goodsName"/>
单价:<input type="text" name="goodsPrice" id="goodsPrice"/>
数量:<input type="text" name="qty" id="qty"/>
<input type="button" value="添加商品" onclick="addGoods()"/>
</form>
</fieldset>
<fieldset>
<legend>购物车</legend>
<table border="1" width="100%" >
<thead>
<tr>
<th>
全选
<input type="checkbox" name="ckAll" id="ckAll"/>
</th>
<th>品名</th>
<th>单价</th>
<th>数量</th>
<th>小计</th>
<th>操作</th>
</tr>
</thead>
<tbody id="tby">
</tbody>
</table>
合计:<span id="total"></span>
</fieldset>
</div>
<script type="text/javascript">
// 点击按钮添加商品
/*
1.获取商品信息表单填写的数据:品名,单价,数量
2.拼接6个td的字符串,添加tr对象中,最终将tr添加到tbody中
*/
function addGoods(){
//1. 获取商品信息
// goodsName.value:通过id属性直接获取对象,并访问对象的value属性
var gname = goodsName.value;
var gprice = goodsPrice.value;
var gqty = qty.value;
//alert(gname+" "+gprice+" "+gqty);
//2 拼接表格行中的6个td字符串
var str = ""; //定义变量,累加拼接每个td字符串
// 第1个td:复选框
str += "<td><input type='checkbox' name='ckgoods'/></td>";
// 第2个td:品名
str += "<td>" + gname + "</td>";
// 第3个td:单价
str += "<td>"+gprice+"</td>";
// 第4个td:数量(两个按钮和一个文本框)
str += "<td>" +
"<input type='button' value='+' onclick='addQty(this)' />"+
"<input type='text' value='"+gqty+"' onblur='changeQty(this)' /> "+
"<input type='button' value='-' onclick='subQty(this)' />"+
"</td>";
// 第5个td:小计
str += "<td>"+gqty*gprice+"</td>";
// 第6个td
str += "<td><input type='button' value='删除' onclick='del(this)'/></td>";
// 创建tr元素对象
var tr = document.createElement("tr");
// 设置tr的内容为拼接的td字符串
tr.innerHTML=str;
// 将tr添加到tbody中
// append(添加)Child(子元素)
tby.appendChild(tr);
//更新总计
sum();
}
// 点击加号按钮调整数量
function addQty(btnQty){
// 1.通过点击的按钮对象找到数量文本框,获取文本框的数据
var txtQty = btnQty.nextElementSibling;
txtQty.value++; // 文本框的值自增
// 2.数量变化引起小计变化: 获取单价,计算小计
var price = Number(btnQty.parentNode.previousElementSibling.innerText);
alert(price);
var money = price*txtQty.value;
// 设置小计内容
btnQty.parentNode.nextElementSibling.innerText=money;
//更新总计
sum();
}
// 点击减号按钮调整数量
// 点击加号按钮调整数量
function subQty(btnQty){
// 1.通过点击的按钮对象找到数量文本框,获取文本框的数据
var txtQty = btnQty.previousElementSibling;
txtQty.value--; // 文本框的值自增
// 2.数量变化引起小计变化: 获取单价,计算小计
var price = Number(btnQty.parentNode.previousElementSibling.innerText);
//alert(price);
var money = price*txtQty.value;
// 设置小计内容
btnQty.parentNode.nextElementSibling.innerText=money;
//更新总计
sum();
}
// 文本框输入数量之后,光标离开时(失焦),调整数量
// onblur:触发失焦事件 onfoucs:获得焦点
function changeQty(txt){
// 将文本框的内容转为数值
var qty = Number(txt.value);
// 如果转换后不是一个数值
if(isNaN(qty)){
//提示错误
alert("输入的数据不是数值");
// 终止方法执行
return;
}
//如果数值超出范围要提示错误
if(qty<=0 || qty>100){
alert("数值必须是1-100");
return;
}
// 测试文本框的数据
//alert(txt.value);
// 1.获取单价
var price= txt.parentNode.previousElementSibling.innerText;
// 2.计算小计
var money = price*qty; //单价*文本框的数量
// 3.将金额设置到小计单元格中
txt.parentNode.nextElementSibling.innerText=money;
//更新总计
sum();
}
// 删除一行
function del(btnQty){
// 判断是否确定删除
if(confirm('确定删除?')){
//btnQty.parentNode:父级元素td .parentNode td的父级元素tr
btnQty.parentNode.parentNode.remove();
//更新总计
sum();
}
}
// 合计:汇总所有的小计
function sum(){
// 获取所有的tr行
//tby.children :通过tbody元素获取下面的tr数组
var trAry = tby.children;
// 遍历tr,找到tr中的小计td单元格,取出数据
var zongji = 0;
for(var i=0;i<trAry.length;i++){
// 取出当前遍历到的数组中的一个tr
var tr = trAry[i];
// 通过tr,获取tr中下标为4的小计单元格,取出数据
// tr.children: tr这一行的td数组(子元素数组)
// tr.children[4]:取出数组中下标为4的元素:小计单元格元素
var xj = Number(tr.children[4].innerText);
// 累加小计到zongji变量
zongji+=xj;
}
// 将累加后的数据设置到汇总标签上
total.innerText = zongji;
}
</script>
</body>
</html>
3.3 模板法
简化代码,比jQuery的DOM操作还要简单。
1.创建模板
2.读取模板,并替换模板中的内容
3.模板法购物车(新增)
4.JSON对象
JSON ( JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。
核心:
- json是一个具有特定格式的js数据对象
- 用于在系统间交互数据(传递数据)
4.1 js对象,json对象,json字符串
js对象语法:
{ 属性1:数据1, 属性2:数据2, 属性3:数据3, ... 方法名:function(){ //函数体 } }
js对象的特点:
- js对象的属性不用加双引号
- js对象中可以有函数
- 可以通过.访问属性,或者属性下标访问属性
<script type="text/javascript">
//js数据对象
//请存储学生的姓名,性别,年龄,身高
//使用单独变量表示对象数据,无法体现数据的关联性,而且比较繁琐.
/*
var stuName = "张三";
var sex = "男";
var age = 20;
var tall = 1.7;
*/
//定义js对象表示学生数据
var stu = {
stuName:"张三", //对象的属性(描述特征 属性:值)
sex :"男",
age :20,
tall:1.7,
zwjs:function(){ //对象的方法(描述行为)
//this:当前的数据对象
alert(this.stuName+" "+this.sex+" "+this.age+" "+this.tall);
}
};
//访问学生对象的属性
/*alert(stu.stuName);
alert(stu.sex);
alert(stu.age);
alert(stu.tall);*/
//访问学生对象的方法
//stu.zwjs();
</script>
json对象语法
{ "属性1":数据1, "属性2":数据2, "属性3":数据3, ... "属性n":数据n }
json对象的特点:
- 属性名都要用双引号括起来,必须是双引号,不能用单引号
- json对象中不能定义函数,主要作用就是传递数据
- 可以通过.访问属性,或者属性下标访问属性
//json格式的数据对象
var car = {
"brand":"宝马",
"color":"红色",
"price":2000000,
"speed":180
}
//返回的是对象
//alert(typeof(car));
//访问汽车的属性
//使用.操作符访问对象属性,此时属性不能加引号
//alert(car.brand+" "+car.color+" "+car.price+" "+car.speed);
//使用属性文本下标的方式,访问对象属性。属性要加引号
//alert(car["brand"]+" "+car["color"]+" "+car["price"]);
json格式字符串
'{"属性1":值1,"属性2":值2}'
特点:
- 首先数据本身是字符串类型的数据
- 字符串的内容复合json格式
- 如果要访问其中的属性数据,需要转为json对象
将json字符串转为json对象
JSON.parse(json对象)
将json对象转为json字符串
JSON.stringify(json字符串)
<script type="text/javascript">
//json格式的数据对象
var car = {
"brand":"宝马",
"color":"红色",
"price":2000000,
"speed":180
}
//返回的是对象
//alert(typeof(car));
//访问汽车的属性
//使用.操作符访问对象属性,此时属性不能加引号
//alert(car.brand+" "+car.color+" "+car.price+" "+car.speed);
//使用属性文本下标的方式,访问对象属性。属性要加引号
//alert(car["brand"]+" "+car["color"]+" "+car["price"]);
//json格式字符串
//json格式的对象
//var stu = {"name":"张三","age":20};
//json格式的字符串
var stu = '{"name":"张三","age":20}';
//alert(typeof(stu));
//字符串没有name属性和age属性
//alert(stu.name+" "+stu.age);
//将json格式的字符串转为json对象,从而愉快的访问其中的属性
//JSON.parse("json字符串")
//使用JSON工具类对象的parse方法,将stu这个json字符串转为json对象
// 并存储到mystu这个变量中
var mystu = JSON.parse(stu);
//alert(mystu.name+" "+mystu.age);
//扩展: JSON.stringify(json对象) 将json对象转为json字符串
var dog = {"kind":"牧羊犬","hobby":"骨头"};
//alert(typeof(dog));
//alert(dog); //对象数据,弹窗显示的时候,不会显示属性信息
//console.log(dog);
var dogStr = JSON.stringify(dog);
alert(typeof(dogStr));
alert(dogStr);
</script>
4.2 案例: 定义json对象数组生成表格数据,扩展购物车功能
<!DOCTYPE html >
<html>
<head>
<title> New Document </title>
<meta charset="utf-8">
<meta name="Generator" content="EditPlus">
<meta name="Author" content="">
<meta name="Keywords" content="">
<meta name="Description" content="">
<style type="text/css">
fieldset{
width:500px;
margin:0px auto;
}
</style>
</head>
<body>
<fieldset>
<legend>水果商品列表</legend>
<table border="1" width="100%">
<thead>
<tr>
<th>编号</th>
<th>名字</th>
<th>价格</th>
<th>操作</th>
</tr>
</thead>
<tbody id="fbody">
<!--
<tr>
<td>1001</td>
<td>苹果</td>
<td>3.5</td>
<td>
<input type="button" value="添加"/>
</td>
</tr>
-->
</tbody>
</table>
</fieldset>
<fieldset>
<legend>购物车</legend>
<table border="1" width="100%">
<thead>
<tr>
<th>编号</th>
<th>名字</th>
<th>价格</th>
<th>数量</th>
<th>小计</th>
<th>操作</th>
</tr>
</thead>
<tbody id="mybody">
<!--
<tr>
<td>1001</td>
<td>苹果</td>
<td>3.5</td>
<td>
<input type="button" value="+"/>
<input type="text" value="3"/>
<input type="button" value="-"/>
</td>
<td>10.5</td>
<td>
<input type="button" value="删除"/>
</td>
</tr>
-->
</tbody>
</table>
</fieldset>
<script type="text/javascript">
//水果数组
var fruitAry = [
{"id":1001,"name":"苹果","price":3.5},
{"id":1002,"name":"香蕉","price":6.5},
{"id":1003,"name":"榴莲","price":9},
{"id":1004,"name":"橘子","price":2}
];
//遍历水果数组,将数据添加到表格中
for(var i=0;i<fruitAry.length;i++){
//获取当前遍历的水果对象
var f = fruitAry[i];
//console.log(f);
//将数据填充到表格行中
var tds = "";
tds +="<td>"+f.id+"</td>";
tds +="<td>"+f.name+"</td>";
tds +="<td>"+f.price+"</td>";
tds +="<td><input type='button' value='添加' onclick='addGoods(this)'/></td>";
//创建tr对象
var tr = document.createElement("tr");
tr.innerHTML=tds;
//将tr添加到tbody中
fbody.appendChild(tr);
}
//点击添加按钮,将按钮对应行的水果信息,添加购物车表格的行中
function addGoods(btnObj){
//通过点击的按钮找到tr行对象
var tr = btnObj.parentElement.parentElement;
//通过tr行对象,分别获取各个单元格的数据
//编号
var fid = tr.children[0].innerText;
//水果名字
var fname = tr.children[1].innerText;
//水果价格
var fprice = Number(tr.children[2].innerText);
//判断重复
if(mybody.children.length>0){
for(var i=0;i<mybody.children.length;i++){
var tr = mybody.children[i];
//tr.children[0].innerText:找到本行第一个单元格的id数据是否重复
if(tr.children[0].innerText==fid){
//让文本框数量++
tr.children[3].children[1].value++
//计算小计
tr.children[4].innerText =
Number(tr.children[3].children[1].value)*Number(fprice);
//返回函数,不执行后面的代码
return;
}
}
}
//alert(fname+" "+fprice+" "+fqty);
//拼接td单元格
var tds = "";
tds +="<td>"+fid+"</td>";
tds +="<td>"+fname+"</td>";
tds +="<td>"+fprice+"</td>";
tds +="<td>"+
"<input type='button' value='+'/>"+
"<input type='text' value='1'/>"+
"<input type='button' value='-'/>"+
"</td>";
tds +="<td>"+fprice*1+"</td>";
tds +="<td><input type='button' value='删除'/></td>";
//创建tr对象
var tr = document.createElement("tr");
tr.innerHTML=tds;
//将tr添加到tbody中
mybody.appendChild(tr);
}
</script>
</body>
</html>
5.模板字符串
<script type="text/javascript">
//请假条模板字符串
var qjtTemp = "本人XM,因为SQ,特请假TS天,从KSRQ开始到JSRQ结束。望批准!";
var lsqjt = qjtTemp.replace("XM","李四")
.replace("SQ","要去见女朋友")
.replace("TS","3")
.replace("KSRQ","2022-3-16")
.replace("JSRQ","2022-3-19");
document.write(lsqjt+"<br/>");
var wwqjt = qjtTemp.replace("XM","王五")
.replace("SQ","要去相亲")
.replace("TS","1")
.replace("KSRQ","2022-3-16")
.replace("JSRQ","2022-3-17");
document.write(wwqjt+"<br/>");
</script>
<!--使用script标签来定义模板字符串-->
<script type="text/html" id="temp">
<td>ID</td>
<td>NAME</td>
<td>PRICE</td>
<td>
<input type="button" value="+"/>
<input type="text" value="1"/>
<input type="button" value="-"/>
</td>
<td>XJ</td>
<td><input type="button" value="删除"/></td>
</script>
<!--定义js代码-->
<script type="text/javascript">
//alert(temp.innerHTML);
var tds = temp.innerHTML.replace("ID","1001")
.replace("NAME","苹果")
.replace("PRICE",3.5)
.replace("XJ",3.5)
</script>
完成购物车的改进
<!DOCTYPE html >
<html>
<head>
<title> New Document </title>
<meta charset="utf-8">
<meta name="Generator" content="EditPlus">
<meta name="Author" content="">
<meta name="Keywords" content="">
<meta name="Description" content="">
<style type="text/css">
fieldset{
width:500px;
margin:0px auto;
}
</style>
</head>
<body>
<fieldset>
<legend>水果商品列表</legend>
<table border="1" width="100%">
<thead>
<tr>
<th>编号</th>
<th>名字</th>
<th>价格</th>
<th>操作</th>
</tr>
</thead>
<tbody id="fbody">
<!--
<tr>
<td>1001</td>
<td>苹果</td>
<td>3.5</td>
<td>
<input type="button" value="添加"/>
</td>
</tr>
-->
</tbody>
</table>
</fieldset>
<fieldset>
<legend>购物车</legend>
<table border="1" width="100%">
<thead>
<tr>
<th>编号</th>
<th>名字</th>
<th>价格</th>
<th>数量</th>
<th>小计</th>
<th>操作</th>
</tr>
</thead>
<tbody id="mybody">
<!--
<tr>
<td>1001</td>
<td>苹果</td>
<td>3.5</td>
<td>
<input type="button" value="+"/>
<input type="text" value="3"/>
<input type="button" value="-"/>
</td>
<td>10.5</td>
<td>
<input type="button" value="删除"/>
</td>
</tr>
-->
</tbody>
</table>
</fieldset>
<!--使用script标签来定义模板字符串-->
<script type="text/html" id="temp">
<td>ID</td>
<td>NAME</td>
<td>PRICE</td>
<td>
<input type="button" value="+"/>
<input type="text" value="1"/>
<input type="button" value="-"/>
</td>
<td>XJ</td>
<td><input type="button" value="删除"/></td>
</script>
<script type="text/javascript">
//水果数组
var fruitAry = [
{"id":1001,"name":"苹果","price":3.5},
{"id":1002,"name":"香蕉","price":6.5},
{"id":1003,"name":"榴莲","price":9},
{"id":1004,"name":"橘子","price":2}
];
//遍历水果数组,将数据添加到表格中
for(var i=0;i<fruitAry.length;i++){
//获取当前遍历的水果对象
var f = fruitAry[i];
//console.log(f);
//将数据填充到表格行中
var tds = "";
tds +="<td>"+f.id+"</td>";
tds +="<td>"+f.name+"</td>";
tds +="<td>"+f.price+"</td>";
tds +="<td><input type='button' value='添加' onclick='addGoods(this)'/></td>";
//创建tr对象
var tr = document.createElement("tr");
tr.innerHTML=tds;
//将tr添加到tbody中
fbody.appendChild(tr);
}
//点击添加按钮,将按钮对应行的水果信息,添加购物车表格的行中
function addGoods(btnObj){
//通过点击的按钮找到tr行对象
var tr = btnObj.parentElement.parentElement;
//通过tr行对象,分别获取各个单元格的数据
//编号
var fid = tr.children[0].innerText;
//水果名字
var fname = tr.children[1].innerText;
//水果价格
var fprice = Number(tr.children[2].innerText);
//判断重复
if(mybody.children.length>0){
for(var i=0;i<mybody.children.length;i++){
var tr = mybody.children[i];
//tr.children[0].innerText:找到本行第一个单元格的id数据是否重复
if(tr.children[0].innerText==fid){
//让文本框数量++
tr.children[3].children[1].value++
//计算小计
tr.children[4].innerText =
Number(tr.children[3].children[1].value)*Number(fprice);
//返回函数,不执行后面的代码
return;
}
}
}
//alert(fname+" "+fprice+" "+fqty);
//拼接td单元格
var tds = temp.innerHTML.replace("ID",fid)
.replace("NAME",fname)
.replace("PRICE",fprice)
.replace("XJ",fprice*1);
//创建tr对象
var tr = document.createElement("tr");
tr.innerHTML=tds;
//将tr添加到tbody中
mybody.appendChild(tr);
}
</script>
</body>
</html>
总结
节点的操作(增删改查)
节点的属性掌握
购物车的搭建(思路分析清楚)
模板法学会