Bom

概念

Browser Object Model 浏览器对象模型

BOM提供了独立于内容的、可以与浏览器窗口进行互动的对象结构

window对象

概念

称为 浏览器对象, 当浏览器打开一个 html 文档的时候, 通常会创建一个 window 对象

属性

window对象属性 含义
history 历史- 表示客户访问过的历史记录(URL)
location 当前页面 URL (网址) 信息
screen 只读属性, 包含有关客户端显示屏幕的有关信息

方法

方法名 说明
弹窗 alert 警告框 (带有提示信息,和一个确定按钮)
弹窗 confirm 确认框 (带有提示信息, 和确认 与取消按钮的对话框)
弹窗 prompt 输入框 (可以使用对话框接收用户的输入信息)
close() 关闭窗口功能
open() 打开一个新的浏览器窗口,加载指定URL 文档
setTimeout() 在指定毫秒数后执行指定函数(一次性)
setInterval() 在指定毫秒数后执行指定函数(周期性)
clearInterval() 取消由 setInterval() 设置的 timeout。

弹窗案例

警告框

<button onclick="window.alert('有种再点我一次')">点我一下试试</button>
<button onclick="alert('有种再点我一次')">点我一下试试</button>

确认框

<button onclick="f1()">点我一下试试</button>
function f1(){// confirm 确认框 有返回值, 当点击确认的时候,返回true var boo = confirm('有种再点我一次');console.log(boo);
}
// 主要用处 删除按钮. 确认用户是否确定要删除function f1(){var boo = confirm('你确定要删除吗?');if(boo){console.log("删除成功!");}else{console.log("取消删除!");}
}

输入框

prompt(参数一,参数二) , 表示 提示信息 和 默认值

<button onclick="f1()">登录</button>function f1(){var pwd = prompt('请输入密码');console.log(pwd);
}

窗口案例

// 父页面
<button onclick="open_win()">打开页面</button>
function open_win(){window.open("test.html"); // 可以传递一些参数, 用于表示新窗口的样式
}// 子页面 test.html
<button onclick="close_win()">关闭页面</button>
function close_win(){window.close();
}

定时任务

setTimeout() 一次性定时任务

function open_win(){// 执行定时任务// window.setTimeout("要执行的函数",需要等待的毫秒数);window.setTimeout("window.open('test.html')",3000);
}

setInterval() 周期性任务

// 向浏览器中 输出一些小图片(每隔两秒钟输入一张图片)
function setInterval_print(){window.setInterval("document.write('<img src=\"a.gif\">')",2000);
}
setInterval_print();

撤销定时任务 clearInterval()

<button onclick="setInterval_print()">开启定时任务</button>
<button onclick="clearInterval_print()">关闭定时任务</button>var num;
function setInterval_print(){// 返回值表示 该定时任务的一个编号num = window.setInterval("console.log('123')",200);
}
function clearInterval_print(){// 取消 编号为num的定时任务window.clearInterval(num);
}

history

history 方法 说明
back() 加载history 对象列表中 前一个 URL
forward() 加载history 对象列表中 后一个 URL
go(参数) 加载history 对象列表中 指定的一个 URL

back() forward()

<button onclick="history.back()">返回到上一个页面</button><br><br>
<button onclick="history.forward()">加载到一个页面</button>
<h1>A 页面</h1>
<a href="b.html">B页面</a>

go()

<button onclick="history.back()">返回到上一个页面</button><br><br>
<button onclick="history.forward()">加载到一个页面</button>
/*******相当于********/
<button onclick="history.go(-1)">返回到上一个页面</button><br><br>
<button onclick="history.go(1)">加载到一个页面</button><button onclick="history.go(-2)">返回到上两层页面</button><br><br>
<h1>B 页面</h1>

location

属性方法 名称 说明
属性 host 主机号,url 端口号
属性 hostname 主机名
属性 href 返回完整URL
方法 reload() 重新加载当前文档
方法 replace() 用新文档替换当前文档

获取属性案例

console.log(window.location.host);
console.log(window.location.hostname)
console.log(window.location.href);
// 需要使用 webStorm 内置服务器打开页面

设置属性

location.href 直接获取

location.href = “”; 设置新网址

window.location.href = "URL地址"; 跳转页面到指定地<button onclick="changeURL()">改变网页地址</button>
<br>
<br>
<a href="http://www.baidu.com">百度首页</a>function changeURL(){//改变页面网址, 类似于 使用a链接 跳转页面window.location.href = "http://www.baidu.com";
}

方法案例

<script>document.write(new Date());document.write("<br/>");document.write("<br/>");function changeDate(){//刷新页面window.location.reload();}
</script><button onclick="changeDate()">改变时间</button>

Dom 文档模型

DOM 文档对象模型

基于文档编程的一组API 接口

是W3C组织 编写的一组规范, 允许访问和操作 HTML 页面中每一个单独的元素

“W3C 文档对象模型 (DOM) 是中立于平台和语言的接口,它允许程序和脚本动态地访问和更新文档的内容、结构和样式。”

类似于一个上帝视角, 可以对看到的每一个元素, 进行操作

下棋 没有棋盘 , 定位某一个旗棋子的位置

document 文档对象

获取节点对象的常用方法

常用方法 方法含义
write() 向文档书写文本, html标签 甚至 script 脚本
getElementById() 返回 指定ID的第一个对象的引用
getElementsByName() 返回所有该名称属性的对象集合
getElementsByTagName() 返回所有该标签名称的对象集合

事件和 Dom 联动

行内方法联动

<body><button onclick="f1()">点击</button>
</body>
<script>function f1(){// 执行代码}
</script>

对象联动

<body><button >点击</button>
</body>
<script>var button = document.getElementsByTagName("button")[0];// 对象.事件 = 函数, (只能写函数名, 不能加括号)// button.onclick = f1(); //错误button.onclick = f1;  // 正确//错误的原因   当程序运行到 f1() 认为 是函数的调用 , 直接执行 f1 函数function f1(){alert(123);}
</script>

匿名函数

<script>var button = document.getElementsByTagName("button")[0];// 对象.事件 = 匿名函数button.onclick = function (){alert(123);}
</script>

this 关键字

button.onclick = function (){// this 指代当前对象alert(this.innerHTML);
}

DOM 节点

HTML DOM 将 HTML 文档视作树结构。这种结构被称为节点树

  • 在节点树中,顶端节点被称为根(root)
  • 每个节点都有父节点、除了根(它没有父节点)
  • 一个节点可拥有任意数量的子节点
  • 同胞是拥有相同父节点的节点 (兄弟节点)

节点分类

  • 整个文档是一个文档节点
  • 每个 HTML 元素是元素节点
  • HTML 元素内的文本是文本节点
  • 每个 HTML 属性是属性节点
  • 注释是注释节点

每一个节点 都有相同的属性

nodeName

nodeValue

nodeType 类型编号

分类(类型) nodeType 值
元素 Element 1
属性 attr 2
文本 text 3
注释节点 comments 8
文档节点document 9
<html><!-- 注释 --><head><meta charset="UTF-8" /><title >标题</title></head>
</html>

节点的属性

属性名称 描述
parentNode 获取该节点的父节点
childNodes 获取所有子节点的集合
firstChild 获取该节点的第一个子节点(最常用的是获取元素的文本节点)
lastChild 获取最后一个子节点
nextSibling 下一个节点 (兄弟节点)
previousSibling 上一个节点

通常使用 firstChild 想要获取元素节点 但是有可能 会被 空格 换行之类的内容影响, 所以需要换成

避免空格影响
firstElementChild 获取第一个子节点, 元素节点(标签节点)
lastElementChild
nextElementSibling
previousElementSibling

案例

<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
</body>
<script>// 根据标签获取对象 , 标签可以重复, 对象是一个集合var arr = document.getElementsByTagName("html");// 获取集合中的第一个对象var obj = arr[0];var children = obj.childNodes;// console.log(children);for(var i in children){console.log(children[i].nodeName + "\t"+children[i].nodeType);}
</script>
</html>
<body><div class="dv"><p id="pid"></p></div>
</body>
<script>var dvs = document.getElementsByClassName("dv");// console.log(dvs[0].firstChild);// console.log(dvs[0].lastChild);// 使用 firstChild 用可能 会被 空格 换行之类的内容影响, 所以需要换成console.log(dvs[0].firstElementChild);console.log(dvs[0].lastElementChild);
</script>
</html>

获取标签属性

获取节点属性 getAttribute(“属性名”);

设置节点属性 setAttribute(“属性名”,“属性值”);

<body><input type="text"><br/><br/><input type="button"><button onclick="fun()">改变样式</button>
</body>
<script>function fun(){// 获取input 节点对象var ipt = document.getElementsByTagName("input")[0];console.log(ipt.getAttribute("type"));var ipt1 = document.getElementsByTagName("input")[1];console.log(ipt1.getAttribute("type"));ipt1.setAttribute("type","date");}
</script>

获取标签文本

表单元素 value

<body><input type="text" ><input type="radio" value="男" name="sex">男<input type="radio" value="女" name="sex">女<select name="" id=""><option value="青岛">青岛</option><option value="济南">济南</option></select>
</body>
<script>var set = document.getElementsByTagName("select")[0];set.onchange = function(){alert(set.value);}// 两个焦点事件var ipt = document.getElementsByTagName("input")[1]// 光标从 输入框移除的时候ipt.onblur = f1;function f1(){alert(ipt.value);}
/*ipt.onfocus = f2;function f2(){alert("focus");}*/
</script>

普通标签 innerHTML

<p><b>123</b></p>
<button>点击切换 p 标签中的内容</button>var btn = document.getElementsByTagName("button")[0];
var p = document.getElementsByTagName("p")[0];
btn.onclick = function (){// innerHTML 获取 标签之内的所有内容//  alert(p.innerHTML);  //  <b>123</b>p.innerHTML = "切换完成";
}

innerText


// innerText 只获取文本 不获取标签
alert(p.innerText);  // 123

创建节点,插入节点,删除和替换节点

节点操作方法
createElement(“标签名”) 创建一个新元素节点
A.appendChild(B) 把B 标签 添加到 A 标签的(内部)尾部
insertBefore(A,B) 把A节点添加到B节点之前
cloneNode(A) 复制节点A
A.removeChild(B) 从A节点中删除节点B
replaceChild(A,B) 使用新节点A 替换 旧节点B

案例1

<body>选择你喜欢的书:<input type="radio" name="book" onclick="add1()">我和狗狗一起活下来<input type="radio" name="book" onclick="add2()">灰霾来了怎么办<br><br>
</body><script>function add1(){// <img src="data:images/dog.jpg" alt="">// 1- 创建一张图片 对象var img = document.createElement("img");  // <img />// 2- 设置图片的属性为 一个图片路径img.setAttribute("src","images/dog.jpg"); // <img src="data:images/dog.jpg">// 3- 把图片添加到body 网页中var body = document.getElementsByTagName("body")[0];body.appendChild(img);}function add2(){// <img src="data:images/dog.jpg" alt="">// 1- 创建一张图片 对象var img = document.createElement("img");  // <img />// 2- 设置图片的属性为 一个图片路径img.setAttribute("src","images/mai.jpg"); // <img src="data:images/dog.jpg">// 3- 把图片添加到body 网页中var body = document.getElementsByTagName("body")[0];body.appendChild(img);}</script>

案例2

<body><h1>微博发布系统</h1><br><br><textarea name="" id="" cols="30" rows="10"></textarea><br><button onclick="submit_1()">发布</button><hr><ul><li>2018年 已成为历史</li></ul><script>function submit_1(){/*1- 获取到用户输入的内容2- 把用户输入的内容 添加到之后的ul列表中(新添加的内容 优先显示)*/// 获取textarea 对象var area = document.getElementsByTagName("textarea")[0];// 表单元素 使用 value 属性获取 元素内容// 创建li 对象var li = document.createElement("li");  // <li></li>// li 是 普通标签 非表单标签li.innerHTML =  area.value; //<li>新添加的信息</li>// 添加元素到 列表var ul = document.getElementsByTagName("ul")[0];/*ul.appendChild(li);*/// 获取 ul 中的第一个元素// 把 li 插入到 ul 中的第一个元素之前ul.insertBefore(li,ul.firstElementChild);}</script>
</body>

案例3

<body>
<ul><li id="first"><img src="data:images/f01.jpg" ><p><button onclick="del()">删除我吧</button></p></li><li id="second"><img src="data:images/f02.jpg" ><p><button onclick="rep()">替换我吧</button></p></li>
</ul>
</body>
<script>function del(){// 获取第一个 li 对象var first = document.getElementById("first");// 获取li 中的 img 对象var li = first.firstElementChild;// 移除first.removeChild(li);}function rep(){var second = document.getElementById("second");// 先创建一个img 对象var img = document.createElement("img");img.setAttribute("src","images/f04.jpg");// 使用新对象替换旧对象second.replaceChild(img,second.firstElementChild);}</script>

操作节点样式

对象.style.样式属性

案例1 购物车案例 , 鼠标指向显示列表, 鼠标移除, 列表隐藏

<body>
<section id="shopping"><div id="cart" onmouseover="over()" onmouseout="out()">我的购物车<span>1</span></div><div id="cartList"><h2>最新加入的商品</h2><ul><li><img src="data:images/makeup.jpg"></li><li>倩碧经典三部曲套装(液体皂200ml+明肌2号水200ml+润肤乳125ml)</li><li>¥558.00×1<br/>删除</li></ul><div class="footer">共1件商品<span>共计¥558.00</span> <span>去购物车</span></div></div>
</section>
</body>
<script>function over(){// 获取 cartList 对象var cartList = document.getElementById("cartList");var cart = document.getElementById("cart");// 把该对象的样式切换为 blockcart.style.borderBottom = "none";cart.style.backgroundColor = "#fff";cart.style.zIndex = 100;  // 图层级别很高cartList.style.display = "block";cartList.style.position = "relative";cartList.style.top = "-1px";}function out(){// 获取 cartList 对象var cartList = document.getElementById("cartList");// 把该对象的样式切换为 nonecartList.style.display = "none";}</script>
*{margin: 0;padding: 0; font-family: "Arial", "微软雅黑"; font-size: 12px; line-height: 25px;}
ul,li{list-style: none;}
#shopping{margin: 20px auto 0 auto; width: 320px;
}
#cart{background: #f9f9f9 url("../images/cart.png") 20px 6px no-repeat;border: solid 1px #dcdcdc;float: right;width: 100px;height: 28px;padding-left: 45px;line-height: 28px;position: relative;cursor: pointer;
}
#cart span{position: absolute;color: #fff;background: #dc1742;display: block;width: 15px;height: 15px;border-radius: 50%;top:-5px;right: 20px;font-size: 8px;line-height: 15px;text-align: center;
}
#cartList{width: 310px; float: right; border: solid 1px #dcdcdc; display: none;}
#cartList h2{border-bottom: 1px dashed #cccccc; font-size: 14px; padding-left: 10px;}
#cartList li{float: left;}
#cartList li:nth-of-type(1){width: 65px; text-align: center;}
#cartList li:nth-of-type(2){width: 155px;}
#cartList li:nth-of-type(3){text-align: center; width: 85px;}
#cartList .footer{clear: both; height: 35px; line-height: 35px; background: #f5f5f5; padding:0  5px;}
#cartList .footer span{padding: 0 12px;}
#cartList .footer span:nth-of-type(2){color: #fff;background: #dc1742;display: block;height: 25px;border-radius: 6px;float: right;text-align: center;font-weight: bold;margin-top: 5px;
}#shopping .cartOver{background-color: #ffffff;z-index: 100;border-bottom: none;
}
#shopping .cartListOver{display:block;position:relative;top:-1px;
}
#shopping .cartOut{background-color:#f9f9f9;border-bottom:solid 1px #dcdcdc;
}
#shopping .cartListOut{display:none;
}

案例优化 使用 className 优化

<script>function over(){// 获取 cartList 对象var cartList = document.getElementById("cartList");var cart = document.getElementById("cart");// 把该对象的样式切换为 blockcart.className = "cartOver";cartList.className = "cartListOver";}function out(){// 获取 cartList 对象var cartList = document.getElementById("cartList");var cart = document.getElementById("cart");// 把该对象的样式切换为 nonecartList.className = "cartListOut";cart.className = "cartOut";}</script>

操作位置属性

scrollTop scrollLeft

获得滚动轴的位置

<script>// 当 页面 滚动轴 移动的时候 触发事件window.onscroll = f1;
// 获取到 滚动轴的位置var top1;var left1;function f1(){/*top1 = parseInt(document.documentElement.scrollTop || document.body.scrollTop);console.log(top1);*/left1 = parseInt(document.documentElement.scrollLeft || document.body.scrollLeft);console.log(left1);}
</script>

案例

隔行换色

// 隔行换色功能
/*
1- 获取所有li 对象
2- 如果是奇数行 设置为一个颜色, 偶数行 相反*/
var arr = document.getElementsByTagName("li");
for(var i in arr){if(i % 2 == 0){arr[i] .style.backgroundColor = "skyblue";}else{arr[i] .style.backgroundColor = "pink";}
}

鼠标指向高亮显示

第一种

var lis = document.getElementsByTagName("li");
for(let i in lis){// 给每一个li 添加事件lis[i].onmouseover = function (){lis[i].style.backgroundColor = "gold";}lis[i].onmouseout = function (){lis[i].style.backgroundColor = "#fff";}
}

第二种


// 给每一个li 添加 样式  给他的所有兄弟修改颜色
var lis = document.getElementsByTagName("li");
for(let i in lis){// 给每一个li 添加事件lis[i].onmouseover = function (){// alert(123);// 其他所有标签全部变为白色for(let k in lis){if(k == i){lis[k].style.backgroundColor = "gold";}else{lis[k].style.backgroundColor = "white";}}}
}

全选全不选案例/反选案例

<body><input type="checkbox" name="hobby">抽烟<br><input type="checkbox" name="hobby">喝酒<br><input type="checkbox" name="hobby">烫头<br><input type="checkbox" name="hobby">学Java<br><input type="checkbox" name="check" >全选/全不选<input type="checkbox" name="reverse">反选</body>
<script>// 1- 获取所有的hobby 的 标签对象// 2- 获取全选和全不选框的选择状态// 3- 给全选框添加点击事件// 4- 更改 所有hobby的状态 和 check的状态保持一致// 1var hobbies = document.getElementsByName("hobby");// 2  html 中 如果给标签添加 checked 属性 默认选中var check01 = document.getElementsByName("check")[0];//  alert(check01.checked);  选中状态 是 true , 非选中状态为 false// 3check01.onclick = function(){// 4for(let i in hobbies){hobbies[i].checked = check01.checked;}}// 反选步骤// 1- 给反选按钮添加点击事件// 2- 把所有 hobby 的 状态修改为相反的状态var reverse = document.getElementsByName("reverse")[0];reverse.onclick = function(){for(let i in hobbies){hobbies[i].checked = !hobbies[i].checked;}}
</script>

图片轮播器

<body><div class="main"><img src="img/left.png" alt="" id="left"><img src="img/right.png" alt="" id="right"><img src="img/1.jpg" alt="" id="content"></div>
</body>

样式

    div{height: 400px;width: 600px;margin: 0 auto;position: relative;}#left,#right{position: absolute;width: 50px;height: 50px;top: 175px;}#left{left: 10px;}#right{right: 10px;}#content{width: 100%;height: 100%;}
</style>

JS 控制 手动切换

<script>// 1- 左右两个图标 需要添加点击事件// 2- 每一次点击需要切换图片, 实际上就是修改图片的src 属性var left = document.getElementById("left");var right = document.getElementById("right");var content = document.getElementById("content");// 3- 因为图片 的名称 是 从1-11 的  修改src 属性就是修改这些 数字// 设置当前图片的 图片数字名称为 countvar count = 1;right.onclick = next;left.onclick = pre;function next(){// 每一次向右切换 count + 1count++;// 如果超出第十一张图片, 就需要重新回到第一张if(count > 11){count = 1;}content.src = "img/"+count+".jpg";}function pre(){count--;// 如果图片小于 1if(count < 1){count = 11;}content.src = "img/"+count+".jpg";}// 定时任务完成自动切换window.setInterval("next()",1500);</script>

定时任务功能, 鼠标移入停止切换, 移除继续切换

var main = document.getElementsByClassName("main")[0];
// 定时任务完成自动切换
var no;
function start(){no = window.setInterval("next()",1500);
}
start();
main.onmouseover = function(){clearInterval(no);
}
main.onmouseout = function(){start()
}

使用按钮控制 表格的添加

分析步骤

// 1- 获取到用户在输入框中输入的内容
// 2- 填充到表格分步
// 2-1 创建 4个td 对象, 把文本添加到td对象中
// 2-2 创建tr对象 , 把 td 添加到 tr 中
// 2-3 把tr 对象 添加到 table 中

案例准备

<head><meta charset="UTF-8"><title>Title</title><style>div{width: 400px;margin: 0 auto;text-align: center;background-color: skyblue;}div>table{width: 100%;border-collapse: collapse;}table tr>td,table tr>th{border:1px solid black;}</style>
</head>
<body><!-- 学员统计 --><!--table>((tr>th*4)+(tr>td*4))--><div class="main"><table><caption>学员统计</caption><tr><th>学号</th><th>姓名</th><th>年龄</th><th>操作</th></tr><tr><td>10086</td><td>毕吉伦</td><td>25</td><td><button>删除</button></td></tr></table><hr><br>学号: <input type="text" name="sid"> <br><br>姓名: <input type="text" name="sname"> <br><br>年龄: <input type="text" name="sage"> <br><br><button id="btn"> 提交 </button></div>
</body>
</html>

JS 代码实现

<script>var btn = document.getElementById("btn");btn.onclick = btn_add;function btn_add() {// 1- 获取到用户在输入框中输入的内容var sid = document.getElementsByName("sid")[0];var sname = document.getElementsByName("sname")[0];var sage = document.getElementsByName("sage")[0];// 2- 填充到表格分步// 2-1 创建 4个td 对象, 把文本添加到td对象中var td1 = document.createElement("td");var td2 = document.createElement("td");var td3 = document.createElement("td");var td4 = document.createElement("td");td1.innerText = sid.value;td2.innerText = sname.value;td3.innerText = sage.value;// 把删除按钮创建出来添加到第四个 td 中var but = document.createElement("button");but.innerText = "删除";// 给删除按钮添加事件, 点击事件, 移除当前行// 谁有权利移除一行 (父级标签可以移除子集标签)// 通过but 找到当前行对象but.onclick = function(){// but > td > trvar tr = this.parentNode.parentNode;// tr > table , 通过table 删除 trtr.parentNode.removeChild(tr);}td4.appendChild(but);// 2-2 创建tr对象 , 把 td 添加到 tr 中var tr = document.createElement("tr");tr.appendChild(td1);tr.appendChild(td2);tr.appendChild(td3);tr.appendChild(td4);// 2-3 把tr 对象 添加到 table 中var table = document.getElementsByTagName("table")[0];table.appendChild(tr);}
</script>

二级联动案例

实例图片

环境准备

<body>省份: <select id="province"></select> &nbsp;&nbsp;&nbsp;&nbsp; 城市 : <select id="city"></select>
</body>
<script>// 创建省份数组var province = ["请选择", "北京", "上海", "天津", "重庆", "山东", "河南", "湖北", "湖南", "广东", "河北", "山西", "辽宁", "吉林", "内蒙古", "黑龙江", "江苏", "浙江", "安微", "福建", "江西", "四川", "贵州", "云南", "陕西", "甘肃", "青海", "广西", "西藏", "宁夏", "新疆", "海南", "香港", "澳门", "台湾"];var city = [[],["", "东城", "西城", "海淀", "朝阳", "丰台", "石景山", "通州", "顺义", "房山", "大兴", "昌平", "怀柔", "平谷", "门头沟", "密云", "延庆"],["", "黄浦", "浦东", "徐汇", "长宁", "静安", "普陀", "闸北", "虹口", "杨浦", "闵行", "宝山", "嘉定", "金山", "松江", "青浦", "奉贤", "崇明"],["", "和平", "河西", "南开", "河东", "河北", "红桥", "东丽", "津南", "西青", "北辰", "滨海新区"],["", "万州", "黔江", "涪陵", "渝中", "大渡口", "江北", "沙坪坝", "九龙陂", "南岸", "北碚", "渝北", "巴南", "长区", "江津", "合川", "永川", "南川", "綦江", "大足", "铜梁"],["", "济南", "青岛", "淄博", "枣庄", "东营", "烟台", "潍坊", "济宁", "泰安", "威海", "日照", "滨州", "德州", "聊城", "临沂", "菏泽", "莱芜"],["", "郑州", "开封", "洛阳", "平顶山", "安阳", "鹤壁", "新乡", "焦作", "濮阳", "许昌", "漯河", "三门峡", "商丘", "周口", "驻马店", "南阳", "信阳", "济源"],["", "武汉", "黄石", "十堰", "荆州", "宜昌", "襄阳", "鄂州", "荆门", "黄冈", "孝感", "咸宁", "仙桃", "潜江", "恩施", "神农架", "天门", "随州"],["", "长沙", "株洲", "湘潭", "衡阳", "邵阳", "岳阳", "常德", "张家界", "益阳", "娄底", "郴州", "永州", "怀化", "湘西"],["", "广州", "深圳", "珠海", "汕头", "佛山", "东莞", "中山", "潮州", "惠州", "湛江", "肇庆", "江门", "茂名", "韶关", "揭阳", "云浮", "梅州", "汕尾", "河源", "阳江", "清远"],["", "石家庄", "保定", "沧州", "衡水", "邢台", "邯郸", "张家口", "廊坊", "唐山", "秦皇岛", "承德"],["", "太原", "大同", "阳泉", "长治", "晋城", "朔州", "晋中", "运城", "忻州", "临汾", "吕梁"],["", "沈阳", "大连", "鞍山", "抚顺", "本溪", "丹东", "锦州", "营口", "阜新", "辽阳", "盘锦", "铁岭", "朝阳", "葫芦岛"],["", "长春", "吉林", "四平", "辽源", "通化", "白山", "白城", "松原", "延边", "长白山", "梅河口", "公主岭"],["", "呼和浩特", "包头", "乌海", "赤峰", "通辽", "鄂尔多斯", "呼伦贝尔", "巴彦淖尔", "乌兰察布", "兴安盟", "锡林郭勒", "阿拉善"],["", "哈尔滨", "齐齐哈尔", "鸡西", "鹤岗", "双鸭山", "大庆", "伊春", "佳木斯", "七台河", "牡丹江", "黑河", "绥化", "大兴安岭"],["", "南京", "无锡", "徐州", "常州", "苏州", "南通", "连云港", "淮安", "盐城", "扬州", "镇江", "秦州", "宿州"],["", "杭州", "宁波", "温州", "绍兴", "湖州", "嘉兴", "金华", "衢州", "舟山", "台州", "丽水"],["", "合肥", "芜湖", "蚌埠", "马鞍山", "宿州", "安庆", "淮南", "铜陵", "黄山", "宣城", "池州", "滁州", "淮北", "阜阳", "六安", "毫州"],["", "福州", "厦门", "漳州", "泉州", "三明", "莆田", "南平", "龙岩", "宁德", "平潭"],["", "南昌", "九江", "上饶", "抚州", "宜春", "吉安", "赣州", "景德镇", "萍乡", "新余", "鹰潭"],["", "成都", "绵阳", "自贡", "攀枝花", "泸州", "德阳", "广元", "遂宁", "内江", "乐山", "资阳", "宜宾", "南充", "达州", "雅安", "阿坝", "甘孜", "凉山", "广安", "巴中", "眉山"],["", "贵阳", "六盘水", "遵义", "铜仁", "黔西", "毕节", "安顺", "黔东", "黔南"],["", "昆明", "曲靖", "玉溪", "保山", "昭通", "丽江", "普洱", "临沧", "德宏", "怒江", "迪庆", "大理", "楚雄", "红河", "文山", "西双版纳"],["", "西安", "宝鸡", "咸阳", "渭南", "铜川", "治中", "安康", "商洛", "榆林", "延安", "汉中", "杨陵"],["", "兰州", "嘉峪关", "金昌", "白银", "天水", "酒泉", "张掖", "武威", "定西", "陇南", "平凉", "庆阳", "临夏", "甘南"],["", "西宁", "海东", "海北", "黄南", "海南", "果洛", "玉树", "海西"],["", "南宁", "柳州", "桂林", "梧州", "北海", "防城港", "钦州", "贵港", "玉林", "百色", "贺州", "河池", "来宾", "崇左"],["", "拉萨", "昌都", "日喀则", "山南", "那曲", "阿里", "林芝"], ["", "银川", "石嘴山", "吴忠市", "固原市", "中卫"],["", "乌鲁木齐", "克拉玛依", "吐鲁番", "哈密", "昌吉", "博尔塔", "巴音郭楞", "阿克苏", "克孜勒苏柯尔克", "喀什", "和田", "伊犁", "塔城", "阿勒泰", "石河子", "阿拉尔", "图木舒克", "五家渠", "北屯", "铁门关", "双河市"],["", "海口", "三亚", "三沙"],["", "中西区", "湾仔区", "东区", "南区", "油尖旺", "深水埗", "九龙城", "黄大仙", "观塘", "葵青", "荃湾", "屯门", "元朗", "北区", "大埔", "沙田", "西贡", "离岛"],["", "花地玛堂", "圣安多尼堂", "大堂", "望德堂", "风顺堂", "嘉模堂", "圣方济各堂"], ["", "台北", "新北", "桃园", "台中", "台南", "高雄", "基隆", "新竹", "嘉义"]];</script>

步骤分析

// 1- 页面加载之后需要把省份数组中的所有数据填充到 省份下拉菜单中
// 2- 给省份下拉菜单添加 切换事件
// 3- 获取到用户选择的是哪个省
// 4- 找到该省所对应的所有城市
// 5- 把所有城市添加到对应的城市 下拉菜单中

JS 代码实现

// 1- 页面加载之后需要把省份数组中的所有数据填充到 省份下拉菜单中// 获取省份对象var pro = document.getElementById("province");var ct = document.getElementById("city");function provinceinit(){// 遍历数组for(let i = 0 ; i < province.length ; i++){// 数组中每一个值 都对应一个 optionvar option = document.createElement("option");option.innerText = province[i];// 不要求获取 省份名称, 只需要获取该省份所在的下标, 和城市的下标一一对应option.setAttribute("value",i);// 把每一项 都添加到 省份下拉菜单中pro.appendChild(option);}}provinceinit();
// 2- 给省份下拉菜单添加 切换事件pro.onchange = function(){// 每一次事件切换的时候, 城市下拉菜单内容都需要重置ct.innerHTML = "";// 3- 获取到用户选择的是哪个省// 4- 找到该省所对应的所有城市var cityArr = city[pro.value];console.log(cityArr);// 5- 把所有城市添加到对应的城市 下拉菜单中for(let i in cityArr){// 每循环一次, 需要创建一个option 对象let option = document.createElement("option");option.innerText = cityArr[i];ct.appendChild(option);}}

前端笔记4 JS BOMDOM相关推荐

  1. Web前端笔记-two.js加载图片

    目前关于two.js的资料,国内的不是很多,项目中要加载图片,官方文档上没有关于加载图片的相关资料,但在github生态圈找到了,在此记录下. 如下图片: 图片路径: 在JS文件中导入图片: impo ...

  2. Web前端笔记-two.js实现坐标定位(动画效果非瞬移定位)

    先来看下程序运行截图: 画图相关代码: ;import * as Two from "JS/two"; import * as $ from "JS/jquery&quo ...

  3. Web前端笔记-two.js图形旋转动画的2种实现方式

    这里有两种方式! 第一种是使用setInterval: 代码如下: let time = setInterval(function(){if(sun.sun.rotation >= TWO_PI ...

  4. Web前端笔记-two.js画三角形及画tip含tip旋转

    程序运行截图如下: 旋转下: 代码如下: import * as Two from "JS/two"; import * as $ from "JS/jquery&quo ...

  5. 【前端笔记】js计算两个日期差多少天

    只是粗略的计算,对差额的时分秒毫秒没有做更具体的处理,原理是通过时间戳计算两个时间点的毫秒差,再换算为天 方式1: (new Date('2021/04/22').getTime() - new Da ...

  6. 移动端前端笔记 — 遇到的常见JS与CSS问题及解决方法

    移动端前端笔记 - 遇到的常见JS与CSS问题及解决方法 参考文章: (1)移动端前端笔记 - 遇到的常见JS与CSS问题及解决方法 (2)https://www.cnblogs.com/zhaoda ...

  7. 前端学习笔记(js基础知识)

    前端学习笔记(js基础知识) JavaScript 输出 JavaScript 数据类型 常见的HTML事件 DOM 冒泡与捕获 流程控制语句 for..in 计时器 let,var,const的区别 ...

  8. Henry前端笔记之 Node及npm相关

    Henry前端笔记之 npm入门相关 NodeJs 简介: 1.Nod简介与概述: 2.交互式运行环境:PEPL 3.Node.js模块和包 3.npm包管理工具 npm简介详见:https://dk ...

  9. 1.前端笔记之html

    title: 1.前端笔记之HTML date: 2016-04-04 23:21:52 tags: Python categories: Python --- 作者:刘耀 出处:http://www ...

最新文章

  1. What’s new: Windows Phone 7 与 Windows Phone 6.5功能对比
  2. Java多线程编写简易飞机大战(一)
  3. DPDK — 数据平台优化技术
  4. mac电脑如何与手机同步复制粘贴_苹果换安卓手机如何同步手机自带备忘录便签?...
  5. 原来Rproj还可以这么使用
  6. 山东外贸职业学院王彩霞老师网上考试系统及c语言考试题库》,2019年山东外贸职业学院单独招生考试测试内容及安排...
  7. SQL SERVER 备份数据库到指定路径语句
  8. altiumdesigner的基本你操作
  9. Atitit 数据库结果集映射 ResultSetHandler 目录 1. 常见的四种配置ResultSetHandler 1 2. Dbutil 1 3. Mybatis 致敬 3 4. H
  10. jetty文件服务器,在Jetty中访问Web容器外部的文件
  11. mybatis13--2级缓存
  12. My Firest FireMonkey App
  13. 《MLB棒球创造营》:走近棒球运动·纽约扬基队
  14. 深度挖掘新闻营销带给企业的好处和优势
  15. 如何制作一份优秀的简历?
  16. form表单的enctype
  17. 如何安装KEIL MDK5开发软件
  18. 凯光dk4000说明书_《凯光dk4000烟弹》用户正在提问-魔笛moti行业门户网
  19. 李笑来——关于资本(阅读总结)
  20. bitmap 位图 头结构

热门文章

  1. 零基础制作【武林外传】辅助工具(二)
  2. 解读科学计算助力行业高质量发展|2023 开放原子全球开源峰会科学智能分论坛即将启幕
  3. 原生js实现简化版幸运大转盘
  4. 2022秋 | PTA编程训练(二)
  5. 解决Hexo博客引用网络图片无法显示的问题
  6. 2.2.2进程调度的时机
  7. 缓存的有效期和淘汰策略【Redis和其他缓存】【刘新宇】
  8. 基于STM32的简易密码锁
  9. 九针串口公母对应接口
  10. Servlet生命周期及请求、响应