参考:前端基础之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
看上面的例子你会发现,name直接封装到了window对象上,了解一下就可以了。
所有浏览器都支持 window 对象。它表示浏览器窗口。
BOM模型中有一些与浏览器对话的命令,这里不展开写(不重要),感兴趣的话可以阅读前端基础之BOM和DOM。
这里
location对象
window.location 对象用于获得当前页面的地址 (URL),并把浏览器重定向到新的页面。
location.href // 获取URL
location.href="URL" // 跳转到指定页面
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 毫秒等于一秒)。
示例:
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 模型被构造为对象的树。
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>
页面效果如下:
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="日照香炉生紫烟,遥看瀑布挂前川。"
更改后的网页效果如下(它改的只是浏览器上显示的内容,不会改动你服务端的网页源文件):
间接查找
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>
页面效果如下:
创建节点
创建节点也就是创建标签,语法如下:
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标签插入到上面的那个儿子标签的前面
上述新建的节点添加后,页面效果如下:
删除节点
语法:
获得要删除的元素,通过父元素调用该方法删除。
// 获得要删除的元素,通过父元素调用该方法删除。
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属性修改后的评论"
最后页面内容如下:
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的框,点击开始,则每秒更新下当前时间,点击结束,则可以停止更新时间,页面效果如下四:
代码如下:
<!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>