参考:前端基础之BOM和DOM
 JavaScript分为 ECMAScript,DOM,BOM。

BOM(Browser Object Model)是指浏览器对象模型,它使 JavaScript 有能力与浏览器进行“对话”。

DOM (Document Object Model)是指文档对象模型,通过它,可以访问HTML文档的所有元素。

Window对象是客户端JavaScript最高层对象之一,由于window对象是其它大部分对象的共同祖先,在调用window对象的方法和属性时,可以省略window对象的引用。例如:window.document.write()可以简写成:document.write()。

BOM

JS基础-BOM和DOM - 图1

看上面的例子你会发现,name直接封装到了window对象上,了解一下就可以了。

所有浏览器都支持 window 对象。它表示浏览器窗口。

BOM模型中有一些与浏览器对话的命令,这里不展开写(不重要),感兴趣的话可以阅读前端基础之BOM和DOM

这里

location对象

window.location 对象用于获得当前页面的地址 (URL),并把浏览器重定向到新的页面。

  1. location.href // 获取URL
  2. location.href="URL" // 跳转到指定页面
  3. location.reload() // 重新加载页面,就是刷新一下页面

弹出框

可以使用js代码在网页中创建三种消息框:警告框、确认框、提示框。

1、警示框

警告框经常用于确保用户可以得到某些信息。

当警告框出现后,用户需要点击确定按钮才能继续进行操作。

语法:

alert("你看到了吗?");

2、确认框

确认框用于使用户可以验证或者接受某些信息。

当确认框出现后,用户需要点击确定或者取消按钮才能继续进行操作。

如果用户点击确认,那么返回值为 true。如果用户点击取消,那么返回值为 false。

语法:

confirm("你确定吗?")

我们可以根据返回的true和false来判断一下,然后根据这个值来使用location去跳转对应的网站。

3、提示框

提示框经常用于提示用户在进入页面前输入某个值。

当提示框出现后,用户需要输入某个值,然后点击确认或取消按钮才能继续操纵。

如果用户点击确认,那么返回值为输入的值。如果用户点击取消,那么返回值为默认值,就是第二个参数,如果没有默认值那么返回null。

语法:

prompt("请在下方输入","你的答案")

可以通过用户输入的内容来判断我们怎么去进行后面的操作.

除了那个警告框(用的也不多),其他的都很少用,比较丑陋,了解一下就行!

计时器

通过使用 JavaScript,我们可以在一定时间间隔之后来执行代码,而不是在函数被调用后立即执行。我们称之为计时事件。

setTimeout():一段时间后做一些事情

语法:

var t=setTimeout("JS语句",毫秒)  
/*
第一个参数js语句多数是写一个函数,不然一般的js语句到这里就直接执行了,
先用函数封装一下,返回值t其实就是一个id值(浏览器给你自动分配的)
*/

setTimeout() 方法会返回某个值。在上面的语句中,值被储存在名为 t 的变量中。假如你希望取消这个 setTimeout(),你可以使用这个变量名来指定它。

setTimeout() 的第一个参数是含有 JavaScript 语句的字符串。这个语句可能诸如 “alert(‘5 seconds!’)”,或者对函数的调用,诸如 alertMsg()”。

第二个参数指示从当前起多少毫秒后执行第一个参数(1000 毫秒等于一秒)。

示例:

JS基础-BOM和DOM - 图2

function f1() {
    console.log('我是一个函数')
    prompt('请在下方输入','我草啊')
}
setTimeout('f1()',5000)    // 如果写 函数名(),则必须用引号引起来,否则setTimeout会失效,函数会立即执行
’
‘我是一个函数

function f1() {
    console.log('我是一个函数')
    prompt('请在下方输入','我啊')
}
setTimeout(f1,5000)        // 也可以函数名不加括号,则不用引号引起来。
‘‘
’我是一个函数

clearTimeout():取消计时时间

语法:

clearTimeout(setTimeout_variable)

举个栗子:

function f1() {
    console.log('我是一个函数')
    prompt('请在下方输入','我啊')
}
var timer = setTimeout(f1,5000)      // 定义一个变量,用于接收计时事件的id

 // 上面是一个计时事件,但在它执行前,我不想它执行了,那么可以通过以下指令来终止:
clearTimeout(timer);      // 需要指定要终止的计时事件的ID。

setInterval() 每隔一段时间做一些事情

setInterval() 方法可按照指定的周期(以毫秒计)来调用函数或计算表达式。

setInterval() 方法会不停地调用函数,直到 clearInterval() 被调用或窗口被关闭。由 setInterval() 返回的 ID 值可用作 clearInterval() 方法的参数。

语法:

setInterval("JS语句",时间间隔)

示例如下:

setInterval("console.log('wocao')",3000)

clearInterval():取消由setInterval()设置的timeout

clearInterval() 方法的参数必须是由 setInterval() 返回的 ID 值。

语法:

clearInterval(setinterval返回的ID值)

举个例子:

// 每隔一段时间就执行一次相应函数
var timer = setInterval(function(){console.log(123);}, 3000)
// 取消setInterval设置
clearInterval(timer);

DOM

DOM(Document Object Model)是一套对文档的内容进行抽象和概念化的方法。

当网页被加载时,浏览器会创建页面的文档对象模型(Document Object Model)。

HTML DOM 模型被构造为对象的树。

JS基础-BOM和DOM - 图3

DOM标准规定HTML文档中的每个成分都是一个节点(node):

  • 文档节点(document对象):代表整个文档
  • 元素节点(element 对象):代表一个元素(标签)
  • 文本节点(text对象):代表元素(标签)中的文本
  • 属性节点(attribute对象):代表一个属性,元素(标签)才有属性
  • 注释是注释节点(comment对象)

JavaScript 可以通过DOM创建动态的 HTML:

  • JavaScript 能够改变页面中的所有 HTML 元素
  • JavaScript 能够改变页面中的所有 HTML 属性
  • JavaScript 能够改变页面中的所有 CSS 样式
  • JavaScript 能够对页面中的所有事件做出反应(鼠标点击事件,鼠标移动事件等)

查找标签

和css一样,你想使用js去操作某个标签需要先找到它。

直接查找
document.getElementById           // 根据ID获取一个标签
document.getElementsByClassName      // 根据class属性获取(可以获取多个元素,所以返回的是一个数组)
document.getElementsByTagName        // 根据标签名获取标签合集

示例如下:

html文件如下:

<div class="cs" id="dd">
    <div class="cs" id="d1">
        窗前明月光,疑是地上霜!
    </div>
    <div class="cs" id="d2">
        举头望明月,低头思故乡!
    </div>
</div>

页面效果如下:

JS基础-BOM和DOM - 图4

document.getElementById("d1")     // 根据ID获取一个标签,输出如下:
<div class="cs" id="d1"> 窗前明月光,疑是地上霜! </div>

document.getElementsByClassName("cs")    //  根据class属性获取(可以获取多个元素,所以返回的是一个数组)
HTMLCollection(3) [div#dd.cs, div#d1.cs, div#d2.cs, dd: div#dd.cs, d1: div#d1.cs, d2: div#d2.cs]

document.getElementsByTagName("div")     // 根据标签名获取标签合集
HTMLCollection(4) [div#dd.cs, div#d1.cs, div#d2.cs, div#chrome_websiteIP.chrome_websiteIP_right, dd: div#dd.cs, d1: div#d1.cs, d2: div#d2.cs, chrome_websiteIP: div#chrome_websiteIP.chrome_websiteIP_right]


// 如果想要获取集合中的某个元素,可以用一个变量来接收这个数组,然后通过索引进行取值,如下:
var a=document.getElementsByTagName("div")
undefined
a[0]
<div class="cs" id="dd">…</div>
a[1]
<div class="cs" id="d1"> 窗前明月光,疑是地上霜! </div>

// 可以通过如下来对网页进行更改
a[1].innerText="日照香炉生紫烟,遥看瀑布挂前川。"

更改后的网页效果如下(它改的只是浏览器上显示的内容,不会改动你服务端的网页源文件):

JS基础-BOM和DOM - 图5

间接查找
parentElement            // 父节点标签元素
children                 // 所有子标签
firstElementChild        // 第一个子标签元素
lastElementChild         // 最后一个子标签元素
nextElementSibling       // 下一个兄弟标签元素
previousElementSibling   // 上一个兄弟标签元素

示例:

var d1Ele=document.getElementById('d1')    // 获取id为d1的元素
undefined
d1Ele.previousElementSibling;    // 查找上一个兄弟标签元素(没有,所以返回null)
null
d1Ele.nextElementSibling;  // 查找下一个兄弟标签元素
<div class="cs" id="d2"> 举头望明月,低头思故乡! </div>
d1Ele.parentElement;      // 查找父节点标签元素
<div class="cs" id="dd">…</div>

如果查找出来的内容是个数组,那么就可以通过索引来取对应的标签对象:

var dd=document.getElementById('dd')       // 获取最外层的div标签
undefined
dd.children[0]           // 获取第一个索引位置的标签
<div class="cs" id="d1"> 窗前明月光,疑是地上霜! </div>
dd.children[1]            // 获取第二个索引位置的标签
<div class="cs" id="d2"> 举头望明月,低头思故乡! </div>

上面说的这些查找标签的方法,以后我们很少用,等学了JQuery,会有很好用、更全的查找标签的功能。

节点操作

节点操作所有章节中使用的html文件还是下面的:

<div class="cs" id="dd">
    <div class="cs" id="d1">
        窗前明月光,疑是地上霜!
    </div>
    <div class="cs" id="d2">
        举头望明月,低头思故乡!
    </div>
</div>

页面效果如下:

JS基础-BOM和DOM - 图6

创建节点

创建节点也就是创建标签,语法如下:

createElement(标签名)

示例:

var aEle = document.createElement("a");      // 创建节点

aEle              // 查看标签
<a></a>
aEle.innerText = "百度"      // 标签添加文字
"百度"
aEle          // 再次查看标签
<a>百度</a>
aEle.href = "https://www.baidu.com"      // 标签添加href属性
"https://www.baidu.com"
aEle           // 查看创建的标签最终效果
<a href="https://www.baidu.com">百度</a>

添加节点

语法:

// 追加一个子节点(作为最后的子节点)
somenode.appendChild(newnode);

// 把增加的节点放到某个节点的前边
somenode.insertBefore(newnode,某个节点);

示例:

// 创建一个节点,并设置相关属性
var aEle = document.createElement("a");
aEle.innerText="百度"
"百度"
aEle.href = "https://www.baidu.com"
"https://www.baidu.com"

// 再创建一个节点,并设置相关属性
var aEle2=document.createElement("a")
aEle2.innerText="京东"
"京东"
aEle2.href="https://www.jd.com"
"https://www.jd.com"


// 查找div标签
var dd=document.getElementById("dd");

// 将上面创建好的第一个节点插入为查到的div标签中最后一个子节点
dd.appendChild(aEle);
<a href="https://www.baidu.com">百度</a>

// 将创建的第二个节点插入到id为d1的节点后面
var dd=document.getElementById("dd");    // 找到父级标签
var d1=dd.children[0]    // 获取腹肌标签下的某个儿子标签

dd.insertBefore(aEle2,d1);     // 将创建的aEle2标签插入到上面的那个儿子标签的前面

上述新建的节点添加后,页面效果如下:

JS基础-BOM和DOM - 图7

删除节点

语法:

获得要删除的元素,通过父元素调用该方法删除。

// 获得要删除的元素,通过父元素调用该方法删除。
somenode.removeChild(要删除的节点)

示例:

// 找到要删除的标签的父级标签
var dd=document.getElementById("dd");

// 找到要删除的元素
var aEle2=dd.children[0];

// 通过调用父元素的方法,移除相应的元素
dd.removeChild(aEle2);

替换节点

语法:

/* 
somenode是父级标签,然后找到这个父标签里面的要被替换的子标签,
然后用新的标签将该子标签替换掉
*/
somenode.replaceChild(newnode, 某个节点);

示例:

var dd = document.getElementById('dd');        // 找到父级标签
var a = document.createElement('a');          // 创建a标签
a.innerText = '百度';  
var d1 = dd.children[0];          // 找到要被替换的子标签
dd.replaceChild(a,d1);          // 替换

文本操作

获取文本节点的值
var divEle=document.getElementById("d1");       // 获取元素

divEle.innerText     // 获取该标签和内部所有标签的文本内容
"窗前明月光,疑是地上霜!"
divEle.innerHTML      // 获取该标签内的所有内容,包括文本和标签
"\n        窗前明月光,疑是地上霜!\n    "

/*
自带的属性还可以直接.属性名来获取和设置,
如果是自定义的属性,是不能通过.来获取属性值的
*/

设置文本节点的值
var divEle = document.getElementById("d1")
divEle.innerText="1"          // 会将等号后面的值作为字符串进行修改
divEle.innerHTML="<a href=''>百度</a>";       // 能识别标签

属性操作

var divEle=document.getElementById("dd")    // 找到要操作的标签的父级标签

var d1=divEle.children[0]      // 获取要操作的标签

d1.getAttribute('href')      // 获取标签的href属性值
"www.baidu.com"
d1.removeAttribute('href')     // 移除标签的href属性值

d1.setAttribute('href','www.baidu.com')      // 设置标签的href属性值

值操作

语法:

elementNode.value

/*
适用于以下标签(用户输入或者选择类型的标签):
1.input   
2.select
3.textarea 
*/

示例:

<!--    html代码如下 -->
    用户名:<input type="text" id="inp">
    <select name="st" id="ss">
        <option value="1">北京</option>
        <option value="2">上海</option>
        <option value="3">天津</option>
    </select>
    <textarea name="tt" id="tt" cols="30" rows="10"></textarea>
var iEle= document.getElementById("inp")           // 查找到input标签

console.log(iEle.value);    // 如果在浏览器页面上输入值,那么这里就可以获取到
VM4998:1 zhangsan

var iEle= document.getElementById("ss")        // 查找到select标签

console.log(iEle.value);      // 获取到的是option中设置的value值,如果没有设置value值,则获取到的是option标签中的文字内容
VM5043:1 1

iEle.value=3       // 可以通过这种方式操作浏览器页面中显示的值


var iEle= document.getElementById("tt")      // 找到textarea标签

iEle.value                  // 如果浏览器页面中输入了内容,那么就可以获取到
"假装这是一条评论"
iEle.value="这是通过value属性修改后的评论"                  // 同样可以对其进行修改
"这是通过value属性修改后的评论"

最后页面内容如下:

JS基础-BOM和DOM - 图8

class操作

示例代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>lvjianzhao</title>
    <style>
        .d1 {
            background-color: red;
            height: 200px;
            width: 200px;
        }

        .d2 {
            background-color: blue;
            height: 400px;
            width: 400px;
            border-radius: 50%;
        }
    </style>
</head>
<body>
<div class="d1" id="dd">

</div>
</body>
</html>
// 下面是支持的class操作
var d = document.getElementById('dd'); 
d.classList;        // 获得这个标签的class属性的所有的值
d.classList.add('d2');        // 添加class值
d.classList.remove('d2');        // 删除class值
d.classList.contains('d2');         // 判断是否有某个class值,有返回true,没有返回false
d.classList.toggle('d2');          // 有就删除并返回false,没有就增加并返回true


/*
可以通过如下来实现一个简单的动画效果
就是每0.5秒执行一次dd.classList.toggle('d2') 指令,来实现div的变化
*/ 

var dd=document.getElementById('dd')
function f1() {   
    dd.classList.toggle('d2')
}
setInterval(f1,500)

css操作

obj.style.backgroundColor="red"         // 语法

示例:
var ee=document.getElementById("dd")     // 获取要操作的标签对象

ee.style.backgroundColor="blue"       // 直接改动该对象的背景颜色为 蓝色

JS操作CSS属性的规律:
1.对于没有中横线的CSS属性一般直接使用style.属性名即可。如:

obj.style.margin
obj.style.width
obj.style.left
obj.style.position

2.对含有中横线的CSS属性,将中横线后面的第一个字母换成大写即可。如:

obj.style.backgroundColor       // 在css代码中写的话,此属性名为 background-color
obj.style.marginTop
obj.style.borderLeftWidth
obj.style.zIndex
obj.style.fontFamily

上面所说的这些修改样式的方法,应该应用在用户的某些操作上,如果用户点击了某个内容,让它变变颜色之类的,给用户一些好看的效果或者指示的效果啊,所以这就要和“事件”结合起来要做的事情,通过事件+上面的样式修改来实现。

事件

HTML 4.0 的新特性之一是有能力使 HTML 事件触发浏览器中的动作(action),比如当用户点击某个 HTML 元素时启动一段 JavaScript。下面是一个属性列表,这些属性可插入 HTML 标签来定义事件动作。

常用事件 作用
onclick 当用户点击某个对象时调用的事件句柄
ondblclick 当用户双击某个对象时调用的事件句柄。
onfocus 元素获得焦点。
onblur 元素失去焦点。
onchange 域的内容被改变。(一般用于select标签做联动效果)
onkeydown 某个键盘按键被按下。如:当用户在最后一个输入框按下回车按键时,表单提交.
onkeypress 某个键盘按键被按下并松开。
onkeyup 某个键盘按键被松开。
onload 一张页面或一幅图像完成加载。
onmousedown 鼠标按钮被按下。
onmousemove 鼠标被移动。
onmouseout 鼠标从某元素移开
onmouseover 鼠标移到某元素之上
onselect 在文本框中的文本被选中时发生
onsubmit 确认按钮被点击,使用的对象是form

绑定事件

方式一(不常用,多数选择用方式二)
<div id="d1" class="c1" onclick="f1();"></div>

<script>
    function f1() {
        var d = document.getElementById('d1');
        d.style.backgroundColor = 'yellow';
    }

</script>

示例(下面示例代码的作用是,当点击div标签时,则触发changecolor函数,changecolor函数用于改变标签的背景颜色):

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>lvjianzhao</title>
    <style>
        .d1 {
            background-color: red;
            height: 200px;
            width: 200px;
        }
    </style>
</head>
<body>
<div class="d1" id="dd" onclick="changecolor()">

</div>
<script>
    function changecolor() {
        var dd = document.getElementById("dd")
        dd.style.backgroundColor = "yellow"
    }
</script>
</body>
</html>

方式二
<div id="d1" class="c1"></div>

<script>
    var d = document.getElementById('d1');
    d.onclick = function () {
          d.style.backgroundColor = 'yellow';
     }
</script>

之所以使用方式二,是因为方式二的耦合性没有方式一那么大,调整js样式,不会去修改html代码。

示例:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>lvjianzhao</title>
    <style>
        .d1 {
            background-color: red;
            height: 200px;
            width: 200px;
        }
    </style>
</head>
<body>
<div class="d1" id="dd">

</div>
<script>
    var dd = document.getElementById("dd")        // 查找到需要操作的标签
    dd.onclick = function () {                       // 定义对标签的操作
        dd.style.backgroundColor = "blue"
        dd.style.width = "100px"
        dd.style.height = "100px"
    }
</script>
</body>
</html>

事件中的this

方式一使用this

事件中的this表示的是当前标签,上面两种绑定事件的方式,均可以使用this,如下是使用this的示例:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>lvjianzhao</title>
    <style>
        .d1 {
            background-color: red;
            height: 200px;
            width: 200px;
        }

        .d2 {
            background-color: black;
            height: 150px;
            width: 400px;
        }
    </style>
</head>
<body>
<div class="d1" id="dd" onclick="changecolor(this)">    <!-- 将this传入到函数中,this表示的是本标签 -->
    <div class="d2"></div>
</div>
<script>
    function changecolor(ths) {        // 这里定义个ths来接收传的this参数
        ths.style.backgroundColor = "yellow"       // 这里就可以通过ths来操作触发此函数的标签了
        var dd2 = ths.children[0]                    // 同样可以通过ths来找到它的子标签
        dd2.style.backgroundColor = "green"          // 然后对子标签进行样式的操作
    }
</script>
</body>
</html>

方式二使用this

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>lvjianzhao</title>
    <style>
        .d1 {
            background-color: red;
            height: 200px;
            width: 200px;
        }
    </style>
</head>
<body>
<div class="d1" id="dd">

</div>
<script>
    var dd = document.getElementById("dd")        // 查找到需要操作的标签
    dd.onclick = function () {
        this.style.backgroundColor = "blue"      // 和之前的区别就是这里使用this来对元素的样式进行操作了
    }
</script>
</body>
</html>

onblur和onfocus事件
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>lvjianzhao</title>
    <style>
        .d1 {
            background-color: yellow;
            height: 200px;
            width: 200px;
        }
    </style>
</head>
<body>
用户名:<input type="text" id="inp">
<div class="d1" id="dd">

</div>
<script>
// js效果就是当鼠标点击到输入框后,相应的div标签背景变成蓝色,当鼠标点击其他区域,焦点离开输入框后,相应的div标签背景变成黄色
    var inp = document.getElementById("inp")        // 查找到需要关联事件的标签
    inp.onfocus = function () {      // 定义当标签获取到焦点时的动作(找到某个标签,修改它的属性)
        var dd = document.getElementById("dd")
        dd.style.backgroundColor = "blue"
    }
    inp.onblur = function () {      // 定义当标签失去焦点的动作
        var dd = document.getElementById("dd")
        dd.style.backgroundColor = "yellow"      // 和之前的区别就是这里使用this来对元素的样式进行操作了
    }
</script>
</body>
</html>

onchange事件

onchange事件是当域的内容发生变化时触发。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>lvjianzhao</title>
</head>
<body>
用户名:<input type="text" id="inp">
<select name="" id="teacher">
    <option value="1">张三</option>
    <option value="2">王五</option>
    <option value="3">赵四</option>
</select>

</div>
<script>
    /* 当input的输入框内容发生改变时,则打印输入框中的内容
     (需要按F12,打开浏览器的console窗口才能看到打印的值)
      注意:当输入完内容后,按下回车,或光标离开输入框,才算内容发生了改变
     */
    var inp = document.getElementById("inp")
    inp.onchange = function () {
        console.log(this.value);
    }

    /*同上,当select标签选中的内容发生了改变,则打印指定的信息*/
    var st = document.getElementById("teacher")
    st.onchange = function () {
        console.log(st.options[st.selectedIndex].innerText + "教的好");
    }
</script>
</body>
</html>

定时器结合事件的练习

1、下面是一个input的框,点击开始,则每秒更新下当前时间,点击结束,则可以停止更新时间,页面效果如下四:

JS基础-BOM和DOM - 图9

代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>定时器</title>
</head>
<body>

<input type="text" value="" id="time">
<button id="start">开始</button>
<button id="stop">暂停</button>

<script>
    var intervalId;     //用来保存定时器对象,因为开始定时器是一个函数,结束定时器是一个函数,两个函数都是操作的一个定时器,让他们互相能够操作这个定时器,就需要一个全局变量来接受一下这个对象
    var inp = document.getElementById("time");
    var stt = document.getElementById("start");
    var stp = document.getElementById("stop");

    function start_flush_input_time() {
        var d = new Date();
        var dt = d.toLocaleString();
        inp.value = dt
    }

    stt.onclick = function () {
        if (intervalId === undefined) {
            intervalId = setInterval(start_flush_input_time, 1000)
        }
    };

    stp.onclick = function () {
        clearInterval(intervalId);
        intervalId = undefined
    }
</script>
</body>
</html>

2、下面是一个二级联动的示例,效果是当选择某个省的时候,二级select标签列表中自动转换为对应省下的市,代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>二级联动</title>
</head>
<body>

<select name="" id="province">
    <option value="">请选择省</option>
</select>
省/市
<select name="" id="city">
    <option value="">请选择市</option>
</select>
市/区
<script>
    var data = {"河北": ["廊坊", "邯郸"], "北京": ["朝阳", "海淀"], "山东": ["威海", "烟台"]};   // 准备模拟数据
    var province = document.getElementById("province");
    var city = document.getElementById("city");

    // 页面一加载就把所有的省份都添加到第一个select标签中
    // (设置value值是为了更规范些,在这里value值是可有可无的)
    var num = 0;
    for (var i in data) {
        var opt = document.createElement("option");    // 创建option标签
        opt.innerHTML = i;            // 将省份的数据添加到option标签中
        opt.value = num;
        province.appendChild(opt);  //将option标签添加到select标签中
        num += 1;
    }

    //只要select中选择的值发生变化的时候,就可以触发一个onchange事件,那么我们就可以通过这个事件来完成select标签联动
    province.onchange = function () {
        city.innerHTML = "";    // 清空显示市的那个select标签里面的内容
        // 2、获取省的值
        var pro = (this.options[this.selectedIndex]).innerText;   //this.selectedIndex是当前选择的option标签的索引位置,this.options是获取所有的option标签,通过索引拿到当前选择的option标签对象,然后.innerHTML获取对象中的内容,也就是省份
        var citys = data[pro];   // 3、根据上面获取到的省份去data里面取出该省对应的所有市

        //4、循环所有的市,然后添加到显示市的那个select标签中
        for (var i = 0; i < citys.length; i++) {
            var option_city = document.createElement("option");
            option_city.innerText = data[pro][i];
            option_city.value = i;
            city.appendChild(option_city)
        }
    }


</script>
</body>
</html>