Javascript入门(下)

内容介绍

  • 使用JS完成表单校验

  • 使用JS完成表格的隔行换色

  • 使用JS完成复选框的全选效果

  • 使用JS完成省市联动效果

内容学习目标

使用JS可以编写各种事件(掌握)

使用JS可以获得指定元素(掌握)

使用JS可以创建元素(理解)

使用JS可以对元素的属性进行操作(掌握)

使用JS可以对元素的标签体进行操作(掌握)

课堂笔记

1、 完善注册表单校验

1.1、 案例介绍

昨天我们已经完成了表单数据校验,整个实现过程存在几处不足的地方:

  1. 使用弹出框进行提示,用户体验不友好,可以将错误提示信息显示在对应的表单元素后面。

  2. 校验过于简单。

  3. 在编写程序时存在多处重复代码,为了达到代码的重复利用,将进行内容抽取成,编写自定义函数。

1.2、 相关知识点

1.2.1、 DOM概述

DOM对象:Document Object Model 文档对象模型

作用:通过DOM对象可以访问和操作html文件的每一个标签。

最简单的html文件:

<!DOCTYPE html>
<html><head><title>文档标题</title></head><body><a href="xxxx">我的链接</a><h1>我的标题</h1></body>
</html>

html文件对应的DOM树内存图:

说明:

1)document对象表示html整个页面的文档对象,要想获取页面中的某个标签必须使用document对象;

2)最上面的根元素是document对象;

1.2.2、 DOM对象中的属性、方法介绍 (重点)

1.2.2.1、 标签属性的操作:

属性名 描述
element.getAttribute(属性的名称); 根据标签的属性的名字来获取属性的值
element.setAttribute(属性的名称, 值); 给标签设置一个属性
element.removeAttribute(属性的名称); 根据标签的属性的名字来删除属性
element.children; 获取当前元素(标签)的子元素注意:获取的子级(一层),不管嵌套(不包括孙子,只包括儿子)
element.nodeName/tagName; 获取标签名 注意:获取的是大写的字符串的标签名
element.innerHTML; 获取当前元素(标签)的文本内容

哈哈

说明:

1)上述element表示具体的元素或者标签。例如:div、p标签等。

2)我们也会将标签叫做节点。

练习一:

<input type="text" name="username" id="txt" value="java" />

需求1:获取属性 name的值

需求2: 给文本框设置一个属性 hello, 值是world

需求3:删除属性 value

代码实现:

<!DOCTYPE html>
<html><head><meta charset="UTF-8"><title></title></head><body>练习一:<input type="text" name="username" id="txt" value="java" /><!--需求1:获取属性 name的值需求2: 给文本框设置一个属性 hello, 值是world需求3:删除属性 value--><script type="text/javascript">//需求1:获取属性 name的值//获取input标签var oName=document.getElementById('txt');var username=oName.getAttribute('name');console.log(username);//username// 需求2: 给文本框设置一个属性 hello, 值是worldoName.setAttribute('hello','world');//获取设置的属性hello的值console.log(oName.getAttribute('hello'));//world// 需求3:删除属性 valueoName.removeAttribute('value');</script></body>
</html>

实现效果:

练习二:

<div id="div">我是div</div>

需求一:获取标签体的内容

需求二:设置标签体的内容:

<b>我是加粗的</b>

代码示例(标签体的内容):

<!DOCTYPE html>
<html><head><meta charset="UTF-8"><title></title></head><body><div id="div">我是div</div><!--需求一:获取标签体的内容需求二:设置标签体的内容:<b>我是加粗的</b>--><script type="text/javascript">// 获取div标签var oDiv = document.getElementById('div');// 需求一:获取标签体的内容 // innerHTML 区分字母大小写
//          console.log(oDiv.innerHTML);// 需求二:设置标签体的内容:<b>我是加粗的</b>//说明innerHTML既可以获取文本内容也可以修改文本内容
//          oDiv.innerHTML='div的内容被修改了';
//          console.log(oDiv.innerHTML);// 设置标签体的内容:<b>我是加粗的</b>oDiv.innerHTML='<b>我是加粗的</b>';console.log(oDiv.innerHTML);</script></body>
</html>

实现效果:

练习三:

<ul id="ul1"><li>aaa<ul><li>111</li><li>222</li><li>333</li></ul></li><li>bbb</li>
</ul>

需求一:获取ID为ul1的所有的子级

需求二:获取ID为ul1下面第一个li的标签名和内容

代码示例(子级):

<!DOCTYPE html>
<html><head><meta charset="UTF-8"><title></title></head><body><ul id="ul1"><li>aaa<ul><li>111</li><li>222</li><li>333</li></ul></li><li>bbb</li></ul><!--需求一:获取ul的所有的子级需求二:获取ID为ul1下面第一个li的标签名和内容--><script type="text/javascript">// 获取ul标签var oUl=document.getElementById('ul1');//使用children属性获取ul的所有子集console.log(oUl.children);//输出数组长度console.log(oUl.children.length);//2//需求二:获取id为ul1下面第一个li的标签名和内容console.log(oUl.children[0].nodeName);//获取标签名 'LI' 大写的/**  aaa<ul><li>111</li><li>222</li><li>333</li></ul>*/console.log(oUl.children[0].innerHTML);//获取标签内容</script></body>
</html>

实现效果:

1.2.2.2、 标签(元素)的操作:

1、获取元素对象(查)

方法名 描述
document.getElementById(id名称); 通过元素(标签)的id属性值获取标签对象,返回的是单个的标签对象注意:只能从document下面去获取
document.getElementsByName(name属性名称); 通过元素(标签)的name属性值获取标签对象,返回的是标签对象的数组。注意:只能从document下面去获取
document/parentNode.getElementsByTagName(标签名); 通过元素(标签)的名称获取标签的对象,返回的是标签对象的数组。注意:可以从document或者某一个父级标签下面去获取
document/parentNode.getElementsByClassName(类名); 通过元素(标签)的class属性获取标签对象,返回的是标签对象的数组。注意:可以从document或者某一个父级标签下面去获取

练习一:

<div class="red">div1</div>
<div>div2</div>
<div class="red">div3</div><p>p1</p>
<p class="red">p2</p>
<p>p3</p><form action="#">用户名:<input type="text" name="username" value="suoge"/>密码: <input type="password" name="password" value="123"/>性别:<input type="radio" name="gender" value="male" />男<input type="radio" name="gender" value="female" />女<input type="submit" value="提交" />
</form>

​ ​

需求1:让页面上所有div字体颜色变蓝色

需求2:让页面上所有class为red的元素背景色变红色

需求3: 获取页面上name为 username 和 gender的元素,并输出其value属性的值

代码示例如下所示:

<!DOCTYPE html>
<html><head><meta charset="UTF-8"><title></title></head><body><!--练习一:--><div class="red">div1</div><div>div2</div><div class="red">div3</div><p>p1</p><p class="red">p2</p><p>p3</p><form action="#">用户名:<input type="text" name="username" value="suoge"/> 密码: <input type="password" name="password" value="123"/> 性别:<input type="radio" name="gender" value="male" />男<input type="radio" name="gender" value="female" />女<input type="submit" value="提交" /></form><!--需求1:让页面上所有div字体颜色变蓝色 需求2:让页面上所有class为red的元素背景色变红色 需求3: 获取页面上name为 username 和 gender的元素,并输出其value属性的值--><script type="text/javascript">//需求1:让页面上所有div字体颜色变蓝色 //获取所有的div标签 获取之后是一个数组var aDiv = document.getElementsByTagName('div');//遍历数组for(var i=0;i < aDiv.length;i++){aDiv[i].style.color='blue';}//需求2:让页面上所有class为red的元素背景色变红色 //获取所有的class为red的标签var aRed = document.getElementsByClassName('red');//遍历数组for(var i=0;i<aRed.length;i++){aRed[i].style.backgroundColor='red';}//需求3: 获取页面上name为 username 和 gender的元素,并输出其value属性的值//确定页面只有一个name是username的标签可以按照如下方式书写,获取的是input标签
//          var oUsername = document.getElementsByName('username')[0];var aUsername = document.getElementsByName('username');console.log(aUsername[0].value);
//          console.log(oUsername.value);//根据input标签获取value值//获取name是gender的标签var aGender = document.getElementsByName('gender');console.log(aGender[0].value);console.log(aGender[1].value);</script></body>
</html>

实现效果:

2、新增元素(增)

方法名 描述
document.createElement(元素名称) 在页面上根据标签名来创建元素,返回创建的标签(元素)对象注意:只能从document下面去创建元素
parentNode.appendChild(要添加的元素对象); 在某一个父级元素(标签)下面去添加一个元素,每次添加到父级元素的最后面,相当于一个追加的操作
parentNode.insertBefore(要添加的元素对象,在谁的前面添加); 在某一个父级元素(标签)下面去添加一个元素,可以指定在哪一个子元素(标签)的前面添加

练习二:

<ul><li>bbb</li>
</ul>

需求1: 创建一个li添加到ul的最后面

需求2: 再次添加一个li要求添加到ul的第一个位置

代码示例:

<!DOCTYPE html>
<html><head><meta charset="UTF-8"><title></title></head><body><!--练习二:--><ul><li>bbb</li></ul><!--需求1: 创建一个li添加到ul的最后面 需求2: 再次添加一个li要求添加到ul的第一个位置--><script type="text/javascript">//需求1: 创建一个li添加到ul的最后面 //创建li标签var oLi = document.createElement('li');//给li标签添加文本oLi.innerHTML='ccc';//将li标签添加到ul的最后面//获取ul标签 /** 在一个页面中无论书写多少个body标签,最后浏览器读取的时候* 都会将所有的内容放到一个body标签中。所以我们可以根据* document对象直接调用body标签来获取body标签。* document.body.children[0] 表示获取body标签的第一个孩子*/var oUl = document.body.children[0];//将上述的li标签添加到ul标签的最后面oUl.appendChild(oLi);// 需求2: 再次添加一个li要求添加到ul的第一个位置//创建li标签var oLi2 = document.createElement('li');//给li标签添加文本oLi2.innerHTML='aaa';// 再次添加一个li要求添加到ul的第一个位置//父级.insertBefore(要添加的元素,在谁前面添加);oUl.insertBefore(oLi2,oUl.children[0]);</script></body>
</html>

说明:

在一个页面中无论书写多少个body标签,最后浏览器读取的时候都会将所有的内容放到一个body标签中。所以我们可以根据document对象直接调用body标签来获取body标签。

document.body.children[0] 表示获取body标签的第一个孩子。

实现效果:

3、删除元素(删)

方法名 描述
element.remove(); 删除当前的元素(标签)掌握
parentNode.removeChild(要删除的子元素); 通过父级元素(标签)删除子元素(标签)

练习三:

<ul><li>aaa</li><li>bbb</li><li>ccc</li>
</ul>

需求:删除第一个li标签。

代码示例如下所示:

<!DOCTYPE html>
<html><head><meta charset="UTF-8"><title></title></head><body><!--练习三:--><ul><li>aaa</li><li>bbb</li><li>ccc</li></ul><!--需求:删除第一个li标签。--><script type="text/javascript">//方式一:直接删除element.remove();
//          document.getElementsByTagName('li')[0].remove();//方式二:父级标签.removeChild(子级标签名)//获取父级标签ulvar oUl = document.body.children[0];//oUl.children[0] 表示ul的第一个li标签oUl.removeChild(oUl.children[0]);</script></body>
</html>

实现效果:

1.2.3、 事件概述(掌握)

JS 是事件驱动的语言。

1.2.3.1、 什么是事件

我们在浏览器中做的所有的操作,例如:鼠标的点击、鼠标悬停、敲击键盘等等。简单的理解:事件就是用户的操作。

1.2.3.2、 什么是事件驱动

JS中会有内部机制监听这一系列的事件,当这些事件发生,JS会响应并且调用与事件相关的函数去处理该事件。

1.1.2、 常用的事件

事件名 描述
onload 某个页面或图像被完全加载之后触发
onsubmit 当表单提交时触发该事件—注意事件源是表单form
onclick 鼠标点击某个对象
ondblclick 鼠标双击某个对象
onblur 元素失去焦点(输入框)
onfocus 元素获得焦点(输入框)
onchange 用户改变域的内容。一般使用在select标签中。
onkeydown 某个键盘的键被按下
onkeypress 某个键盘的键被按下或按住,一直按住
onkeyup 某个键盘的键被松开
onmousedown 某个鼠标按键被按下
onmouseup 某个鼠标按键被松开
onmouseover 鼠标被移到某元素之上
onmouseout 鼠标从某元素移开
onmousemove 鼠标被移动

1.1.3、 事件绑定的方式

1.1.3.1、 静态绑定(了解)

静态绑定:直接在标签上拿事件名作为标签的属性名,属性名对应的属性值是一个方法。

语法格式:

<标签 事件名 = "函数名()" ... ></标签>
例如:
<div οnclick= "show();"></div>

需求:

1、给div标签绑定单击事件,输出div的文本

2、给div标签绑定鼠标悬浮事件,使其背景颜色变红

3、给div标签绑定鼠标移出事件,使其背景颜色变蓝

说明:定义一个div,并给div设置宽、高和背景颜色灰色:#ccc。

设置div的代码:

<style type="text/css">div {width: 200px;height: 200px;background-color: #ccc;/*灰色*/}
</style>

Js的代码实现:

<!DOCTYPE html>
<html><head><meta charset="UTF-8"><title></title><style type="text/css">div{width: 200px;height: 200px;background-color: #ccc;/*灰色*/}</style></head><body><!--       需求:1、给div标签绑定单击事件,输出div的文本2、给div标签绑定鼠标悬浮事件,使其背景颜色变红3、给div标签绑定鼠标移出事件,使其背景颜色变蓝说明:定义一个div,并给div设置宽、高和背景颜色。this表示当前函数属于哪个标签,那么这个this就代表哪个标签或者对象--><div onclick="show(this);" onmouseover="fnOver(this);" onmouseout="fnOut(this);">我是div</div><script type="text/javascript">//1、给div标签绑定单击事件,输出div的文本//定义函数,点击div时触发function show(obj){console.log(obj.innerHTML);}//2、给div标签绑定鼠标悬浮事件,使其背景颜色变红function fnOver(obj){obj.style.backgroundColor='red';}//3、给div标签绑定鼠标移出事件,使其背景颜色变蓝function fnOut(obj){obj.style.backgroundColor='blue';}</script></body>
</html>

说明:this表示当前函数属于哪个标签,那么这个this就代表哪个标签或者对象。

实现效果:

鼠标点击div和移到div上面时触发的。

鼠标移除之后触发的:

1.1.3.2、 动态绑定(掌握)

通过静态绑定事件,我们发现html代码和js事件放到一起了,耦合性强。所以我们在开发中一般很少使用静态绑定,我们一般都使用动态绑定。

动态绑定:事件不是直接写到标签中,即不是拿事件作为标签的属性名了。而是通过DOM技术来获取元素(标签),然后直接给标签添加事件,而事件一般后面跟着一个匿名函数。

语法结构:

var oDiv = document.getElementById(“div”);
oDiv.onclick = function() {// JS逻辑代码
};

需求:使用动态绑定完成。

1、给div标签绑定单击事件,输出div的文本

2、给div标签绑定鼠标悬浮事件,使其背景颜色变红

3、给div标签绑定鼠标移出事件,使其背景颜色变蓝

说明:定义一个div,并给div设置宽、高和背景颜色。

设置div的代码:

<style type="text/css">div {width: 200px;height: 200px;background-color: #ccc;/*灰色*/}
</style>

示例代码:

<!DOCTYPE html>
<html><head><meta charset="UTF-8"><title></title><style type="text/css">div {width: 200px;height: 200px;background-color: #ccc;/*灰色*/}</style></head><body><div>我是div</div><!--需求:使用动态绑定完成。1、给div标签绑定单击事件,输出div的文本2、给div标签绑定鼠标悬浮事件,使其背景颜色变红3、给div标签绑定鼠标移出事件,使其背景颜色变蓝说明:定义一个div,并给div设置宽、高和背景颜色。--><script type="text/javascript">//获取div标签var oDiv = document.getElementsByTagName('div')[0];//1、给div标签绑定单击事件,输出div的文本//由于使用oDiv对象调用onclick事件,所以这里的this就表示oDiv对象oDiv.onclick = function(){console.log(this.innerHTML);};//2、给div标签绑定鼠标悬浮事件,使其背景颜色变红oDiv.onmouseover = function(){this.style.backgroundColor='red';};//3、给div标签绑定鼠标移出事件,使其背景颜色变蓝oDiv.onmouseout = function(){this.style.backgroundColor='blue';};</script></body>
</html>

说明:由于使用oDiv对象调用onclick事件,所以这里的this就表示oDiv对象。

实现效果:

鼠标点击div和移到div上面时触发的。

鼠标移除之后触发的:

1.1.4、 JS中的对象

1.1.4.1、 Array对象(重点)

Array对象是数组对象,跟java中的数组一个意思,但是使用语法上稍微有些区别。

说明:java属于强类型语言,而js属于弱类型语言。

1、创建数组对象的方式:

​ 1)创建一个空数组: var arr = new Array(); var arr = []; √

​ 2)创建一个指定大小的数组: var arr = new Array(size);举例:var arr = new Array(5);创建数组大小是5的数组。

​ var arr2=[10];//这里的10表示arr2数组中的数据,数组长度是1

​ 3)创建数组并填充元素: var arr = new Array(element0, element1, …, elementn);

4)直接创建元素数组: var arr = [element0, element1, …, elementn]; √

2、数组中元素的获取:

跟java一样通过索引和数组名的方式获得数组中的元素:

获得数组中的一个元素:arr[下标] 从0开始

遍历获得数组中的所有元素:

for(var i=0;i<arr.length;i++){alert(arr[i]);}

数组的代码演示如下所示:

<!DOCTYPE html>
<html><head><meta charset="UTF-8"><title></title></head><body><script type="text/javascript">//定义一个数组
//          var arr=new Array(10);//这里的10表示arr数组中的长度var arr=new Array('a');//这里表示数组arr中的数据是a,数组长度是1var arr2=[10];//这里的10表示arr2数组中的数据console.log(arr.length);//10
//          console.log(arr2.length);//1//定义数组var arr3=['aaa','bbb','ccc'];//遍历数组for(var i=0;i<arr3.length;i++){console.log(arr3[i]);}</script></body>
</html>

1.1.4.2、 RegExp对象(重点)

创建正则表达式:regulation expression
第一种方式:var reg = new RegExp(“正则表达式”);
第二种方式:var reg = /正则表达式/; √

使用正则对象调用的验证字符串的方法:

reg.test(字符串);
验证通过返回true
验证不通过返回false

说明: 正则表达式一般 需要加上 ^ $ 行首和行尾 表示要从头到尾匹配。

补充:^ 表示以什么开始 $ 以什么结束

需求:使用正则表达式验证指定的字符串是否满足长度是6.

次数:

? 0 1

* 0 1 n

+ 1 n

代码示例:

<!DOCTYPE html>
<html><head><meta charset="UTF-8"><title></title></head><body><script type="text/javascript">/** 需求:使用正则表达式验证指定的字符串是否满足长度是6.* 说明:在js中正则表达式的开头使用^  结尾使用$ 表示边界词* regExp.test(str) 验证字符串的合法性* 如果合法,返回true。如果不合法,返回false*///定义字符串var str='abcdef';
//          方式一:创建正则表达式对象 .
//          var reg = new RegExp('^[0-9a-zA-Z]{6}$');//方式二:创建正则表达式对象 var reg=/^[0-9a-zA-Z]{6}$/;//调用方法判断str字符串的长度是否是6console.log(reg.test(str));</script></body>
</html>

1.3、 注册验证案例相关事件

事件名 描述
onsubmit 提交表单时被触发
onblur 元素失去焦点时触发

**1.4、**案例分析

编写步骤:

1、 添加错误提示显示区域

例如:

<span id="usernamespan"></span> 校验不通过,红色字体提示

2、 失去焦点时判断用户输入的信息是否合法

3、 点击注册按钮验证所有项

要求:

1、 用户名必须是6-10位的字母或者数字

2、 密码长度必须6位任意字符

3、 两次输入密码要一致

1.5、 案例实现

1.5.1、 书写注册页面的html,并在html页面中添加错误显示区域

浏览器中显示的页面如下图所示:

分析:该注册页面主要由6行2列的table组成。

具体的html代码如下所示:

<!DOCTYPE html>
<html><head><meta charset="UTF-8"><title></title></head><body><!--注册页面--><form action="#" method="post"><!--6行2列--><table><tr><td>用户名</td><td><input type="text" name="username" id="username"/></td><!--接收用户名的错误信息--><td><span id="usernamespan"></span></td></tr><tr><td>密码</td><td><input type="password" name="password" id="password"/></td><!--接收密码的错误信息--><td><span id="passwordspan"></span></td></tr><tr><td>确认密码</td><td><input type="password" name="repassword" id="repassword"/></td><!--接收确认密码的错误信息--><td><span id="repasswordspan"></span></td></tr><tr><td>性别</td><td><input type="radio" name="gender" value="male" />男<input type="radio" name="gender" value="female" />女</td><!--接收性别的错误信息--><td><span id="genderspan"></span></td></tr><tr><td>爱好</td><td><input type="checkbox" name="hobby" value="sing" />唱歌<input type="checkbox" name="hobby" value="dance" />跳舞<input type="checkbox" name="hobby" value="code" />写代码</td><!--接收爱好的错误信息--><td><span id="hobbyspan"></span></td></tr><tr><td></td><td><input type="submit" value="注册" /><input type="reset" value="重置" /></td></tr></table></form></body>
</html>

1.5.2、 使用JS代码开始验证注册页面

1)校验用户名是否合法。—》用户名必须是6-10位的字母或者数字。

当鼠标离开文本输入框的时候就会触发的事件,所以我们需要在用户名的input标签中添加一个离焦事件onblur,用来验证用户名是否合法。

代码如下:

验证用户名是否满足:用户名必须是6-10位的字母或者数字。的js代码如下所示:

<script type="text/javascript">//定义函数根据任意标签的id获取标签,防止根据标签id获取标签的代码重复function getId(id){return document.getElementById(id);}//定义函数用来验证用户名是否合法//用户名必须是6-10位的字母或者数字function checkUser(){//              alert("haha");//鼠标离开时获取用户名的值var userVal=getId('username').value;//获取正则表达式对象,6-10位的字母或者数字var reg=/^[0-9a-zA-Z]{6,10}$/;//判断用户输入的用户名是否符合上述正则表达式对象if(reg.test(userVal)){//返回true,说明符合,输入正确 合法getId('usernamespan').innerHTML='';//这里返回true,提交表单的时候要使用return true;}else{//非法getId('usernamespan').innerHTML='用户名必须是6-10位的字母或者数字';//提示信息是红色的getId('usernamespan').style.color='red';//提交表单的时候要使用return false;}}
</script>

2)验证密码。密码长度必须6位的任意字符。

当鼠标离开文本输入框的时候就会触发的事件,所以我们需要在密码的input标签中添加一个离焦事件onblur,用来验证密码是否合法。

代码如下:

验证密码是否满足:密码长度必须6位的任意字符。的js代码如下所示:

//验证密码 --->密码长度必须6位的任意字符function checkPassword(){//鼠标离开时获取密码的值var passwordVal=getId('password').value;//获取正则表达式对象,密码长度必须6位的任意字符var reg=/^.{6}$/;//判断用户输入的密码是否符合上述正则表达式对象if(reg.test(passwordVal)){//返回true,说明符合,输入正确 合法getId('passwordspan').innerHTML='';//这里返回true,提交表单的时候要使用return true;}else{//非法getId('passwordspan').innerHTML='密码长度必须6位的任意字符';//提示信息是红色的getId('passwordspan').style.color='red';//提交表单的时候要使用return false;}}

3)验证确认密码。两次输入密码要一致。

当鼠标离开文本输入框的时候就会触发的事件,所以我们需要在确认密码的input标签中添加一个离焦事件onblur,用来验证确认密码是否合法。

代码如下:

验证确认密码是否满足:两次输入密码要一致。的js代码如下所示:

//验证确认密码。两次输入密码要一致。function checkRpassword(){//鼠标离开时获取确认密码的值var rePasswordVal=getId('repassword').value;//获取密码的值var passwordVal=getId('password').value;//判断两次输入的密码是否一致if(rePasswordVal != passwordVal){//不一致//非法getId('repasswordspan').innerHTML='两次输入密码不一致';//提示信息是红色的getId('repasswordspan').style.color='red';//提交表单的时候要使用return false;}else{//一致//返回true,说明符合,输入正确 合法getId('repasswordspan').innerHTML='';//这里返回true,提交表单的时候要使用return true;}}

4)校验表单是否可以提交。如果上述条件都满足,才可以提交表单,只要有一个不满足就不能提交表单。

那么如何验证表单是否可以提交呢?在js中有一个事件叫做onsubmit事件可以验证,该事件是在提交form表单按钮时触发。

给form表单添加一个id,代码如下所示:

验证表单是否可以提交的代码如下所示:

//验证表单是否可以提交getId('registerForm').onsubmit = function(){//              alert('haha');if(checkUser() && checkPassword() && checkRpassword()){//可以提交表单,返回truereturn true;}else{//不可以提交return false;}}

效果:

2、 表格隔行换色

2.1、 案例描述

开发中,需要使用表格陈列数据,数据过多不易查看,通常使用隔行换色进行表示。

说明:一般表头不会换颜色。

2.2、 案例实现

将下面的html复制到页面中,完成隔行换色即可。

<!DOCTYPE html>
<html><head><meta charset="UTF-8"><title></title></head><body style="margin: 50px;"><table border="1" width="1000"><tr style="background-color: #999;"><th><input type="checkbox"></th><th>分类ID</th><th>分类名称</th><th>分类描述</th><th>操作</th></tr><tr><td align="center"><input type="checkbox" name="chekbox"></td><td>1</td><td>手机数码</td><td>手机数码类商品</td><td><a href="">修改</a>|<a href="">删除</a></td></tr><tr><td align="center"><input type="checkbox" name="chekbox"></td><td>2</td><td>电脑办公</td><td>电脑办公类商品</td><td><a href="">修改</a>|<a href="">删除</a></td></tr><tr><td align="center"><input type="checkbox" name="chekbox"></td><td>3</td><td>鞋靴箱包</td><td>鞋靴箱包类商品</td><td><a href="">修改</a>|<a href="">删除</a></td></tr><tr><td align="center"><input type="checkbox" name="chekbox"></td><td>4</td><td>家居饰品</td><td>家居饰品类商品</td><td><a href="">修改</a>|<a href="">删除</a></td></tr></table></body>
</html>

Js代码实现如下:

分析:通过上述结果观察出,第一行表头不需要变颜色,所以获取到所有的tr之后,索引i需要从1开始,i是奇数时行的背景是白色,i是偶数时,行的背景是蓝色。

<script type="text/javascript">//获取所有的trvar aTr = document.getElementsByTagName('tr');//遍历数组 表头不用换颜色,所以i从1开始for(var i=1;i<aTr.length;i++){//是奇数时是白色,i是偶数时是蓝色if(i%2 == 1){//奇数 背景颜色是白色aTr[i].style.backgroundColor='white';}else{//偶数 背景颜色是蓝色aTr[i].style.backgroundColor='blue';}}
</script>

实现效果:

3、 复选框全选/全不选

3.1、 案例描述

开发中,经常需要对表格数据进行“批量处理”,就需要快速的对列表项进行操作,本案例我们来完成“全选和全不选”。

3.2、 案例相关的JS属性介绍

3.2.1、 单选/复选选中

ele.checked:  表示元素是否选中
true: 表示选中
false: 表示没有选中
例如:ele.checked = true;   // 设置元素被选中。

3.3、 案例实现

书写html页面,一个复选框和一个div,并在div中书写多个复选框。

<!DOCTYPE html>
<html><head><meta charset="UTF-8"><title></title></head><body><input type="checkbox" id="ck" /><hr /><div id="div"><input type="checkbox"/><br /><input type="checkbox" /><br /><input type="checkbox" /><br /><input type="checkbox" /><br /><input type="checkbox" /></div></body>
</html>

使用js来实现复选框的全选和全不选的功能。

分析:

我们希望当我们选择最上面的复选框时,下面的所有复选框全部选择。 如果最上面的复选框没有选择,那么下面所有的复选框也不会全选。

问题:怎样确定最上面的复选框是选择的呢?

在复选框的标签中有个属性checked=‘checked’,表示复选框勾选。并且当checked='checked’时,输出的结果是true。

如果最上面复选框选择,则下面所有都选择,如果最上面不选择,则下面不选择。也就是说最上面的oCK.checked 是true,那么下面所有的checked值都是true。反之上面是false,下面都是false。

<script type="text/javascript">//获取最上面的复选框var oCK = document.getElementById('ck');//获取div中的所有复选框var aCK = document.getElementById('div').getElementsByTagName('input');/** 分析:* 我们希望当我们选择最上面的复选框时,下面的所有复选框全部选择* 如果最上面的复选框没有选择,那么下面所有的复选框也不会全选* 问题:怎样确定最上面的复选框是选择的呢?* 在复选框的标签中有个属性checked='checked',表示复选框勾选* 并且当checked='checked'时,输出的结果是true*/
//          console.log(oCK.checked);//false
//           oCk.οnclick=function () {//上面复选框被选中输出true,没被选中输出false
//                console.log(oCk.checked);
//            }//给oCK绑定点击事件oCK.onclick=function(){//循环div中的所有复选框for(var i=0;i<aCK.length;i++){//如果最上面复选框选择,则下面所有都选择,如果最上面不选择,则下面不选择//也就是说最上面的oCK.checked 是true,那么下面所有的checked值都是true//反之上面是false,下面都是falseaCK[i].checked=oCK.checked;}};
</script>

实现效果:

4、 省市二级联动

4.1、 案例介绍

在日常应用中,我们需要完善个人信息,“所在地”要求选择省市,当选择省时,该省对应的市将自动的更新。

4.2、 相关知识点

4.2.1、 JSON

JSON 英文全称 JavaScript Object Notation(标记、格式)。JSON 是一种轻量级的数据交换格式。JSON 是用于存储和传输数据的格式。JSON 通常用于服务端和网页之间传递数据的。 JSON 使用 JavaScript 语法,但是 JSON 格式仅仅是一个文本。文本可以被任何编程语言读取以及作为数据格式传递。

JSON在JS里面其实就是一个对象:

定义JSON:

var json = { key1: value1, key2:value2…};

说明:按照语法规则,key如何书写都可以,但是为了规范,key最好写在双引号中,这样,在后面我们使用的时候便不会出现获取数据的问题。

使用JSON:

json.key1 来访问键对应的值

演示JSON的代码示例:

<!DOCTYPE html>
<html><head><meta charset="UTF-8"><title></title></head><body><script type="text/javascript">//定义一个jsonvar json={"name":"锁哥","age":18,"address":"上海"};//输出年龄
//          console.log(json.age);//18//上述只是存储一个人的信息,如果存储多个人的信息,可以使用数组进行存储var jsonArray = [{"name":"锁哥","age":18,"address":"上海"},{"name":"黑旋风","age":19,"address":"黑龙江"},{"name":"助教","age":29,"address":"北京"}];//访问黑旋风的地址address 由于是数组,所以索引从0开始console.log(jsonArray[1].address);//黑龙江</script></body>
</html>

说明:

如果存储多个人的信息:

var jsonArray = [{“name”:“锁哥”,“age”:18,“address”:“上海”},{“name”:“黑旋风”,“age”:19,“address”:“黑龙江”},{“name”:“助教”,“age”:29,“address”:“北京”}];

实现效果:

注意:标准格式的JSON键要用双引号引起来,值如果是字符串也必须要双引号引起来。我们后面做数据交互的时候一定要书写标准格式的JSON

4.2.2、 下拉框

下拉框代码:

<select id="province" name="province"><option value="">--请选择省--</option><option value="sh">上海</option>
</select>

事件:

onchange : 当下拉框的内容发生改变的时候触发的事件。

获取下拉框的所有option:

oSel.options
说明:oSel表示父标签select对象

动态创建option :

var option = new Option(文本,value);
例如:
var option = new Option(‘上海’,‘sh’);

添加option:oProSel.appendChild(option);

oSel.appendChild(option);//将子标签option添加到父标签oSel上

4.3、 代码实现

因为需要加载一些省市,所以已经给大家在课前资料准备好了一份:

代码实现:

第一步:新建一个html页面:

省市联动的html代码如下所示:

<!DOCTYPE html>
<html><head><meta charset="UTF-8"><title></title></head><body><select id="province" name="province"><option value=''>--请选择省--</option></select><select id="city" name="city"><option value=''>--请选择市--</option></select></body>
</html>

第二步:将之前准备好的cities.js文件复制到编辑工具的目录中:

cities.js文件中的代码如下所示:

var china = [{"p_name": "吉林省","p_id": "jl","cities": [{"c_name": "长春","c_id": "cc"},{"c_name": "四平","c_id": "sp"},{"c_name": "通化","c_id": "th"},{"c_name": "松原","c_id": "sy"}]},{"p_name": "辽宁省","p_id": "ln","cities": [{"c_name": "沈阳","c_id": "sy"},{"c_name": "大连","c_id": "dl"},{"c_name": "抚顺","c_id": "fs"},{"c_name": "铁岭","c_id": "tl"}]},{"p_name": "山东省","p_id": "sd","cities": [{"c_name": "济南","c_id": "jn"},{"c_name": "青岛","c_id": "qd"},{"c_name": "威海","c_id": "wh"},{"c_name": "烟台","c_id": "yt"}]},{"p_name": "上海市","p_id": "sh","cities": [{"c_name": "闵行区","c_id": "mh"},{"c_name": "徐汇区","c_id": "xh"},{"c_name": "黄浦区","c_id": "hp"},{"c_name": "浦东新区","c_id": "pd"}]}
];

说明:上述js文件中的数据以json格式存储的。

第三步:在html页面中导入cities.js。

第四步:在html页面书写js代码完成二级联动的功能。

分析:

<script type="text/javascript">//书写js代码完成二级联动//获取省的下拉框var oProSel = document.getElementById('province');//获取市的下拉框var oCitySel = document.getElementById('city');//页面在加载的时候获取省,并将省添加到省的下拉框中//循环china数组获取省for(var i=0;i<china.length;i++){//获取省的名字作为option的文本var p_name=china[i].p_name;//吉林省//获取省的id作为option的valuevar p_id=china[i].p_id;//jl//创建省的option var option=new Option(文本,value);var option=new Option(p_name,p_id);//将上述option添加到省的下拉框中oProSel.appendChild(option);}//每次更改省的时候改变对应省的市//所以我们给省的下拉框添加一个onchange事件,每次改变省的下拉框就会触发oProSel.onchange = function(){//每次改变省加载市的时候先清空市的下拉框
//              oCitySel.innerHTML="<option value=''>--请选择市--</option>";oCitySel.options.length = 1;//只有一个option:<option value=’’>--请选择市--</option>
//              alert("haha");//根据当前下拉框的省加载当前省对应的市//获取当前下拉框的valuevar p_id = this.value;//jl//遍历china数组for(var i=0;i<china.length;i++){//判断取出的p_id是否和当前省获取的p_id是否相等if(p_id == china[i].p_id){//找到省了,获取对应的城市var cityJsonArr = china[i].cities;//遍历城市的数组,依次取出城市for(var j=0;j<cityJsonArr.length;j++){//取出城市的c_name作为文本var c_name = cityJsonArr[j].c_name;//取出城市的c_id作为valuevar c_id = cityJsonArr[j].c_id;//创建城市的optionvar option = new Option(c_name,c_id);//将城市的option添加到城市的下拉框中oCitySel.appendChild(option);}//找到之后,直接结束for循环break;}}};
</script>

实现效果:

5、 总结

= document.getElementById(‘province’);
//获取市的下拉框
var oCitySel = document.getElementById(‘city’);
//页面在加载的时候获取省,并将省添加到省的下拉框中
//循环china数组获取省
for(var i=0;i<china.length;i++)
{
//获取省的名字作为option的文本
var p_name=china[i].p_name;//吉林省
//获取省的id作为option的value
var p_id=china[i].p_id;//jl
//创建省的option var option=new Option(文本,value);
var option=new Option(p_name,p_id);
//将上述option添加到省的下拉框中
oProSel.appendChild(option);
}

     //每次更改省的时候改变对应省的市//所以我们给省的下拉框添加一个onchange事件,每次改变省的下拉框就会触发oProSel.onchange = function(){//每次改变省加载市的时候先清空市的下拉框

// oCitySel.innerHTML="–请选择市–";
oCitySel.options.length = 1;//只有一个option:–请选择市–
// alert(“haha”);
//根据当前下拉框的省加载当前省对应的市
//获取当前下拉框的value
var p_id = this.value;//jl
//遍历china数组
for(var i=0;i<china.length;i++)
{
//判断取出的p_id是否和当前省获取的p_id是否相等
if(p_id == china[i].p_id)
{
//找到省了,获取对应的城市
var cityJsonArr = china[i].cities;
//遍历城市的数组,依次取出城市
for(var j=0;j<cityJsonArr.length;j++)
{
//取出城市的c_name作为文本
var c_name = cityJsonArr[j].c_name;
//取出城市的c_id作为value
var c_id = cityJsonArr[j].c_id;
//创建城市的option
var option = new Option(c_name,c_id);
//将城市的option添加到城市的下拉框中
oCitySel.appendChild(option);
}
//找到之后,直接结束for循环
break;
}

         }};

```

实现效果:

[外链图片转存中…(img-1jDjtnRm-1562499453310)]

5、 总结

[外链图片转存中…(img-oUhh6Duf-1562499453310)]

前端-javascript(下)相关推荐

  1. Web前端-JavaScript基础教程下

    Web前端-JavaScript基础教程下 <script>有6个属性: async对外部脚本有效,可以用来异步操作,下载东西,不妨碍其他操作. charset为src属性指定字符集. d ...

  2. 视频教程-主流前端框架下ArcGIS API for JavaScript的开发-其他

    主流前端框架下ArcGIS API for JavaScript的开发 毕业于中国矿业大学地理信息科学专业.现就任于全球领先的GIS公司,主要担任地理平台研发工作,日常工作任务是ArcGIS JS A ...

  3. Web前端-JavaScript基础教程上

    Web前端-JavaScript基础教程 将放入菜单栏中,便于阅读! JavaScript是web前端开发的编程语言,大多数网站都使用到了JavaScript,所以我们要进行学习,JavaScript ...

  4. 判断字符串 正则_(重学前端 - JavaScript(模块一)) 14、引用类型之 RegExp (正则)(详述)...

    上一篇文章介绍了 JavaScript 中的 Date 类型,从地理方面的原理知识开始入手,如果大家认真看过上一篇文章,相信 JavaScript 中的 Date 类型已经难不住大家了!!! 但是今天 ...

  5. js html 导出word 不用activexobject,javascript下用ActiveXObject控件替换word书签,将内容导出到word后打印第2/2页...

    javascript下用ActiveXObject控件替换word书签,将内容导出到word后打印第2/2页 更新时间:2008年06月21日 22:57:31   作者: 由于时间比较紧,没多的时候 ...

  6. Web前端JavaScript笔记(4)节点

    如何获取元素节点的属性: 在Web前端JavaScript笔记(3)对象中,介绍了访问行间属性的方法,除此之外,系统还提供了三个方法访问元素的属性: 1. setAttribute: 2. getAt ...

  7. 前端 JavaScript 之『节流』的简单代码实现

    前戏 首先,总结一下上一篇文章--<前端 JavaScript 之『防抖』的简单代码实现>的内容:「防抖」就是在高频率触发事件停止触发后,延时执行某个处理逻辑. 防抖虽然在一定程度上对性能 ...

  8. 详解升讯威在线客服系统前端 JavaScript 脚本加密技术(1)

    我在业余时间开发维护了一款免费开源的升讯威在线客服系统,也收获了许多用户.对我来说,只要能获得用户的认可,就是我最大的动力. 这段时间有几个技术小伙伴问了我一个有意思的问题:"你的前端脚本是 ...

  9. 能在多种前端框架下使用的表格控件

    近几年Web前端框架特别流行,比如AngularJS.AngularJS 2.ReactJS.KnockoutJS.VueJS等.表格控件是我们在开发中经常要用到的控件.有没有能够在多种前端控件下都能 ...

  10. 浅析微前端架构下的Web性能分析

    我们都知道Web性能关乎用户体验,进一步影响用户留存.转化率,显然用户体验不友好,最终导致流失.可见Web页面性能对用户和企业而言,可谓举足轻重. 因此,对Web页面的性能分析相关性能优化,是开发者不 ...

最新文章

  1. 用 python 解决汉诺塔问题并附带演示过程
  2. 1045 Favorite Color Stripe (30 分)【难度: 中 / 知识点: DP】
  3. centos6.9下安装composer
  4. 全新尝试|ComponentOne WinForm和.NET Core 3.0
  5. 扫盲丨关于区块链你需要了解的所有概念
  6. iPhone的mysql客户端_适用于iPhone的MySQL C API库
  7. ip_conntrack: table full, dropping packet的问题
  8. keepass+onedrive打造密码管理器
  9. 关于raw_input()和sys.stdin.readline()的区别
  10. 点聚AIP电子签章在Chrome、Edge新内核、360系列、FireFox、IE、Opera等浏览器中实现网页内嵌效果案例(一)
  11. 【kali技巧】kali更新系统
  12. shell脚本练习题(编程题)。
  13. matlab不能使用syms,matlab syms什么意思
  14. 棠玥寕在剧组被拍,典雅古装照流出!
  15. 张量、向量、标量的区别
  16. idea插件,在idea中听云音乐
  17. Scratch3.0 二次开发(4)修改界面字体大小
  18. 端口映射、SNAT(源网络地址转换)
  19. 梦幻手游服务器维护摆摊公示时间,梦幻西游手游5月27日维护公告
  20. 我所收藏的重点大学BBS资源

热门文章

  1. Android Vibrator 震动器
  2. 解决 IDEA 下 struts.xml 中 extends=“struts-default“ 报红的问题
  3. S7-1200_1500PLC程序块的密码保护功能介绍
  4. html rgb 16进制转换,rgb转16进制 rgb对应的16进制是多少
  5. 基于Java+SpringBoot+Vue大创管理系统设计和实现
  6. fsck exited with status code 4
  7. 1455D. Sequence and Swaps(思维)
  8. 来自平凡世界而不平凡的他---飞扬浩天(feiyanghaotian) >>点开详细页
  9. [UOJ500]任意基DFT
  10. 主机mysql在哪里找_虚拟主机数据库在哪里