1.JQuery进阶
1. 动画
默认显示和隐藏方式
1. show([speed,[easing],[fn]]) 显示元素
2. hide([speed,[easing],[fn]]) 隐藏元素
3. toggle([speed],[easing],[fn]) 显示与隐藏元素反复切换
三个参数:
1. speed:动画的速度。三个预定义的值("slow","normal", "fast")或表示动画时长的毫秒数值(如:1000)
2. easing:用来指定切换效果,默认是"swing",可用参数"linear"
* swing:动画执行时效果是 先慢,中间快,最后又慢
* linear:动画执行时速度是匀速的
3. fn:在动画完成时执行的函数方法,每个元素执行一次。传递的是一个方法对象
代码示例
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="../js/jquery-3.3.1.min.js"></script>
<script type="text/javascript">
$(function () {
$("#hide").click(function(){
$("p").hide();
});
$("#show").click(function(){
$("p").show();
});
$("#toggle").click(function(){
$("p").toggle();
});
});
</script>
</head>
<body>
<p id="p1">如果点击“隐藏”按钮,我就会消失。</p>
<button id="hide" type="button">隐藏</button>
<button id="show" type="button">显示</button>
<button id="toggle" type="button">切换</button>
</body>
</html>
显示结果
滑动显示和隐藏方式
1. slideDown([speed],[easing],[fn]) 滑动显示
2. slideUp([speed,[easing],[fn]]) 滑动隐藏
3. slideToggle([speed],[easing],[fn]) 反复显示或者隐藏
代码示例
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="../js/jquery-3.3.1.min.js"></script>
<script type="text/javascript">
$(function () {
$(".flip1").click(function(){
$(".panel").slideDown("slow");
});
$(".flip2").click(function(){
$(".panel").slideUp("slow");
});
$(".flip3").click(function(){
$(".panel").slideToggle("slow");
});
});
</script>
<style type="text/css">
div.panel,p.flip
{
margin:0px;
padding:5px;
text-align:center;
background:#e5eecc;
border:solid 1px #c3c3c3;
}
div.panel
{
height:120px;
display:none;
}
</style>
<body>
<div class="panel">
<p>W3School - 领先的 Web 技术教程站点</p>
<p>在 W3School,你可以找到你所需要的所有网站建设教程。</p>
</div>
<div class="flip1" style="border: 2px red solid">请点击这里,显示</div>
<div class="flip2" style="border: 2px red solid">请点击这里,隐藏</div>
<div class="flip3" style="border: 2px red solid">请点击这里,显示或隐藏</div>
</body>
</html>
淡入淡出显示和隐藏方式
1. fadeIn([speed],[easing],[fn]):淡入元素
2. fadeOut([speed],[easing],[fn]):淡出元素
3. fadeToggle([speed,[easing],[fn]]):淡入或者淡出矩形框
代码示例
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="../js/jquery-3.3.1.min.js"></script>
<script type="text/javascript">
$(function () {
//淡入矩形框
$("#fadeIn").click(function(){
$("#div1").fadeIn();
});
//淡出矩形框
$("#fadeOut").click(function(){
$("#div1").fadeOut();
});
//淡入或者淡出矩形框
$("#fadeToggle").click(function(){
$("#div1").fadeToggle();
});
});
</script>
</head>
<body>
<button id="fadeIn">点击这里,淡入矩形框</button>
<button id="fadeOut">点击这里,淡出矩形框</button>
<button id="fadeToggle">点击这里,淡入或者淡出矩形框</button>
<br><br>
<div id="div1" style="width:80px;height:80px;display:none;background-color:red;"></div>
<br>
</body>
</html>
三个参数
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="../js/jquery-3.3.1.min.js"></script>
<script type="text/javascript">
$(function () {
$("button").click(function (){
//先慢,中间快,最后又慢
$("#div1").fadeIn("swing");
//动画执行时速度是匀速的
$("#div2").fadeIn("linear");
//动画时长的3秒
$("#div3").fadeIn(3000);
});
});
</script>
</head>
<body>
<p>演示带有不同参数的 fadeIn() 方法。</p>
<button>点击这里,使三个矩形淡入</button>
<br><br>
<div id="div1" style="width:80px;height:80px;display:none;background-color:red;"></div>
<br>
<div id="div2" style="width:80px;height:80px;display:none;background-color:green;"></div>
<br>
<div id="div3" style="width:80px;height:80px;display:none;background-color:blue;"></div>
</body>
</html>
2.遍历
for方式
javascript代码
<script type="text/javascript">
$(function () {
//1.获取所有的ul下的li
var citys = $("#city li");
//2.遍历li
for (var i = 0; i < citys.length; i++) {
//显示内容
alert(i+":"+citys[i].innerHTML);
}
});
</script>
html代码
<ul id="city">
<li>北京</li>
<li>上海</li>
<li>天津</li>
<li>重庆</li>
</ul>
each方式一
1. 语法:
jquery对象.each(function(index,element){});
* index:就是元素在集合中的索引
* element:就是集合中的每一个元素对象
* this:集合中的每一个元素对象
javascript代码
<script type="text/javascript">
$(function () {
//1.获取所有的ul下的li
var citys = $("#city li");
//2. jq对象.each(callback)
citys.each(function (index,element) {
//3.1 获取li对象 第一种方式 this 弹出当前this指向的对象
alert(this.innerHTML);
//当然我们可以把js对象转成jq对象后,在获取内容
alert($(this).html());
});
});
</script>
html代码
<ul id="city">
<li>北京</li>
<li>上海</li>
<li>天津</li>
<li>重庆</li>
</ul>
each方式二
使用回调函数
回调函数返回值:
- true:如果当前function返回为false,则结束循环(break)。
- false:如果当前function返回为true,则结束本次循环,继续下次循环(continue)
javascript代码
<script type="text/javascript">
$(function () {
//1.获取所有的ul下的li
var citys = $("#city li");
//2. jq对象.each(callback)
citys.each(function (index, element) {
//3.2 获取li对象 第二种方式 在回调函数中定义参数 index(索引) element(元素对象)
//js
alert(index + ":" + element.innerHTML);
//js转jq
alert(index + ":" + $(element).html());
});
});
</script>
html代码
<ul id="city">
<li>北京</li>
<li>上海</li>
<li>天津</li>
<li>重庆</li>
</ul>
$.each(被遍历对象, 回调函数)方式
javascript代码
<script type="text/javascript">
$(function () {
//1.获取所有的ul下的li
var citys = $("#city li");
//2. $.each(被遍历对象, [callback])
$.each(citys,function () {
alert(this.innerHTML);
})
});
</script>
html代码
<ul id="city">
<li>北京</li>
<li>上海</li>
<li>天津</li>
<li>重庆</li>
</ul>
for…of方式
for…of: jquery 3.0 版本之后提供的方式
语法:for(元素对象 of 容器对象)
<script type="text/javascript">
$(function () {
//1.获取所有的ul下的li
var citys = $("#city li");
//2.遍历
for(li of citys){
alert($(li).html());
}
});
</script>
3.事件绑定
方式一
1. jquery标准的绑定方式
* jq对象.事件方法(执行函数);
代码示例
<script type="text/javascript">
$(function () {
//标准绑定事件
$("#name").click(function (){
alert("我被点击啦!");
});
});
</script>
</head>
<body>
<input id="name" type="text" value="绑定点击事件">
</body>
方式二
2. on绑定事件/off解除绑定
* jq对象.on("事件名称",回调函数)
* jq对象.off("事件名称")
代码示例
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="../js/jquery-3.3.1.min.js"></script>
<script type="text/javascript">
$(function () {
//1.使用on给按钮绑定单击事件 click
$("#btn").on("click",function () {
alert("我被点击了。。。")
}) ;
//2. 使用off解除btn按钮的单击事件
$("#btn2").click(function () {
//解除btn按钮的单击事件
$("#btn").off("click");
//将组件上的所有事件全部解绑
//$("#btn").off();
});
});
</script>
</head>
<body>
<input id="btn" type="button" value="使用on绑定点击事件">
<input id="btn2" type="button" value="使用off解绑点击事件">
</body>
如果off方法不传递任何参数,则将组件上的所有事件全部解绑
事件切换
事件切换:toggle
* jq对象.toggle(fn1,fn2...)
* 当单击jq对象对应的组件后,会执行fn1.第二次点击会执行fn2.....
代码示例
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="../js/jquery-3.3.1.min.js" type="text/javascript" charset="utf-8"></script>
<script src="../js/jquery-migrate-1.0.0.js" type="text/javascript" charset="utf-8"></script>
<script type="text/javascript">
$(function () {
//获取按钮,调用toggle方法
$("#btn").toggle(function () {
//改变div背景色backgroundColor 颜色为 green
$("#myDiv").css("backgroundColor","green");
},function () {
//改变div背景色backgroundColor 颜色为 pink
$("#myDiv").css("backgroundColor","pink");
});
});
</script>
</head>
<body>
<input id="btn" type="button" value="事件切换">
<div id="myDiv" style="width:300px;height:300px;background:pink">
点击按钮变成绿色,再次点击红色
</div>
</body>
注意:1.9版本 .toggle() 方法删除,jQuery Migrate(迁移)插件可以恢复此功能。
<script src="../js/jquery-migrate-1.0.0.js" type="text/javascript" charset="utf-8"></script>
4.插件
插件:增强JQuery的功能
jq获取对象增强
对jQuery获取的对象,进行方法增强
定义格式:
$.fn.extend({
// 方法名称1:方法实现方式1
方法名称:function (方法参数){
方法实现方式1
},
// 方法名称2:方法实现方式2
方法名称:function (方法参数){
方法实现方式2
}
..........................
});
例如
$.fn.extend({
// 方法名称:方法实现方式
newMethod:function (){
$("body").html("自定义jq方法");
}
});
调用该方法
//2.调用方法
$("#btn-check").newMethod();
html代码
<body>
<div></div>
<input id="btn-check" type="button" value="页面输出一句话" >
<br/>
</body>
jq本身增强
对jq本身,进行方法增强
定义格式:
$.extend({
//方法名称1:方法实现方式1
方法名称:function (参数) {
方法实现的方式
},
//方法名称1:方法实现方式1
方法名称:function (参数) {
方法实现的方式
}
});
例如
$.extend({
max:function (a,b) {
//返回两数中的较大值
return a >= b ? a:b;
},
min:function (a,b) {
//返回两数中的较小值
return a <= b ? a:b;
}
});
调用该方法
//调用全局方法
var max = $.max(4,3);
//alert(max);
var min = $.min(1,2);
alert(min);
对全局方法扩展
2.AJAX
概念: ASynchronous JavaScript And XML 异步的JavaScript 和 XML
异步和同步:客户端和服务器端相互通信的基础上
- 客户端必须等待服务器端的响应。在等待的期间客户端不能做其他操作。
- 客户端不需要等待服务器端的响应。在服务器处理请求的过程中,客户端可以进行其他的操作。
同步
异步
Ajax 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术。
通过在后台与服务器进行少量数据交换,Ajax 可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。
传统的网页(不使用 Ajax)如果需要更新内容,必须重载整个网页页面。
1.简单实现
原生的JS实现方式(了解)
html页面
<head>
<meta charset="UTF-8">
<title>Title</title>
<script>
//定义方法
function fun() {
//发送异步请求
//1.创建核心对象:固定写法
var xmlhttp;
if (window.XMLHttpRequest)
{// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}
else
{// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
//2. 建立连接
xmlhttp.open("GET","ajaxServlet?username=tom",true);
//3.发送请求
xmlhttp.send();
//4.接受并处理来自服务器的响应结果:固定写法
//当xmlhttp对象的就绪状态改变时,触发事件onreadystatechange。
xmlhttp.onreadystatechange=function()
{
//判断readyState就绪状态是否为4,判断status响应状态码是否为200
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
//获取服务器的响应结果
var responseText = xmlhttp.responseText;
//弹出结果
alert(responseText);
}
}
}
</script>
</head>
<body>
<input type="button" value="发送异步请求" onclick="fun();">
<input>
</body>
</html>
xmlhttp.open(“GET”,“ajaxServlet?username=tom”,true);
- 请求方式:GET、POST
- get方式,请求参数在URL后边拼接。send方法为空参
- post方式,请求参数在send方法中定义
- 请求的URL:
- 同步或异步请求:true(异步)或 false(同步)
2.servlet代码
@WebServlet("/ajaxServlet")
public class AjaxServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.获取请求参数
String username = request.getParameter("username");
//2.打印username
System.out.println(username);
//3.响应
response.getWriter().write("hello : " + username);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
当我们点击发送异步请求时,异步请求的java代码会执行,但是整个页面并不会刷新。
JQeury实现方式
$.ajax()
语法:$.ajax({键值对});
代码示例
<script src="js/jquery-3.3.1.min.js"></script>
<script>
//定义方法
function fun() {
//使用$.ajax()发送异步请求
$.ajax({
// 请求路径
url:"ajaxServlet" ,
//请求方式
type:"POST" ,
//请求参数
data:{"username":"jack","age":23},
//响应成功后的回调函数
success:function (data) {
//弹出显示结果
alert(data);
},
//表示如果请求响应出现错误,会执行的回调函数
error:function () {
alert("出错啦...")
},
//设置接受到的响应数据的格式
//dataType:"text"
});
}
</script>
html页面
<body>
<input type="button" value="发送异步请求" onclick="fun();">
<input>
</body>
$.get()
$.get():发送get请求
- 语法:$.get(url, [data], [callback], [type])
- 参数:
- url:请求路径
- data:请求参数
- callback:回调函数
- type:响应结果的类型
代码示例:
<script>
//定义方法
function fun() {
//发送get请求
$.get(
//请求路径
"ajaxServlet",
//请求参数
{username:"rose"},
//回调函数(执行函数)
function (data) {
alert(data);},
//响应结果的类型
"text");
}
</script>
</head>
<body>
<input type="button" value="发送异步请求" onclick="fun();">
<input>
</body>
</html>
$.post()
$.post():发送post请求
- 语法:$.post(url, [data], [callback], [type])
- 参数
- url:请求路径
- data:请求参数
- callback:回调函数
- type:响应结果的类型
代码示例
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="js/jquery-3.3.1.min.js"></script>
<script>
//定义方法
function fun() {
//发送get请求
$.post(
//请求路径
"ajaxServlet",
//请求参数
{username:"rose"},
//回调函数(执行函数)
function (data) {
alert(data);},
//响应结果的类型
"text");
}
</script>
</head>
<body>
<input type="button" value="发送异步请求" onclick="fun();">
<input>
</body>
</html>
3.JSON
概念: JavaScript Object Notation,类似于java中的一个实体对象
例如
java方式
Person p = new Person();
p.setName("张三");
p.setAge(23);
p.setGender("男");
JSON方式
var p = {"name":"张三","age":23,"gender":"男"};
向上面这种形式
JSON的特点
- json现在多用于存储和交换文本信息的语法
- 进行数据的传输
- JSON 比 XML 更小、更快,更易解析。
1.语法规则
1. 基本规则
* 数据在名称/值对中:json数据是由键值对构成的
* 键用引号(单双都行)引起来,也可以不使用引号
* 值得取值类型:
1. 数字 例如(整数或浮点数)
2. 字符串 例如(在双引号中)
3. 逻辑值 例如(true 或 false)
4. 数组(在方括号中)例如 {"persons":[{},{}]}
5. 对象(在花括号中) 例如 {"address":{"province":"陕西"....}}
6. null
* 数据由逗号分隔:多个键值对由逗号分隔
* 花括号保存对象:使用{}定义json 格式
* 方括号保存数组:[]
代码示例
1.基本格式
<script>
//1.定义基本格式(JSON)
//1.1 "name": "张三" 使用双引号
//1.2 age: 23 什么都不使用
//1.3 'gender': true 使用单引号
var person = {"name": "张三", age: 23, 'gender': true};
alert(person);
</script>
2.嵌套格式
<script>
// 2.嵌套格式 {}———> []
var persons = {
"persons": [
{"name": "张三", "age": 23, "gender": true},
{"name": "李四", "age": 24, "gender": true},
{"name": "王五", "age": 25, "gender": false}
]
};
</script>
3.嵌套格式
<script>
//2.嵌套格式 []———> {}
var ps = [
{"name": "张三", "age": 23, "gender": true},
{"name": "李四", "age": 24, "gender": true},
{"name": "王五", "age": 25, "gender": false}
];
</script>
2.获取数据
语法
- json对象.键名
- json对象[“键名”]
- 数组对象[索引]
- 遍历
代码示例
方式一
<script>
//1.定义基本格式
var person = {"name": "张三", age: 23, 'gender': true};
//获取name的值
//方式一
var age = person.age;
//方式二
var name = person["name"];
alert(name);
alert(age);
</script>
方式二
<script>
//2.嵌套格式
var persons = {
"persons": [
{"name": "张三", "age": 23, "gender": true},
{"name": "李四", "age": 24, "gender": true},
{"name": "王五", "age": 25, "gender": false}
]
};
//获取王五值
var name = persons.persons[2].name;
alert(name);
</script>
遍历基本格式
<script>
//1.遍历基本格式
var person = {"name": "张三", age: 23, 'gender': true};
//获取person对象中所有的键和值
//获取键 key
for(var key in person){
//这样的方式获取不行。因为相当于 person."name"
//alert(key + ":" + person.key);
alert(key+":"+person[key]);
}
</script>
遍历数组格式
<script>
//2.遍历数组
var ps = [
{"name": "张三", "age": 23, "gender": true},
{"name": "李四", "age": 24, "gender": true},
{"name": "王五", "age": 25, "gender": false}
];
//获取ps中的所有值
for (var i = 0; i < ps.length; i++) {
var p = ps[i];
for(var key in p){
alert(key+":"+p[key]);
}
}
</script>
4.JSON数据和Java对象的相互转换
JSON解析器
- 常见的解析器:Jsonlib,Gson,fastjson,jackson
1.JSON转为Java对象
1.导入jackson的相关jar包
2.创建Jackson核心对象 ObjectMapper
//2.创建Jackson的核心对象 ObjectMapper
ObjectMapper mapper = new ObjectMapper();
3.调用ObjectMapper的相关方法进行转换
//将对象转为json字符串
String json = mapper.writeValueAsString(p);
System.out.println(json); //显示 {"name":"张三","age":23,"gender":"男"}
//将数据写到d://a.txt文件中
mapper.writeValue(new File("e://a.txt"),p);
4.person实体对象
public class Person {
private String name;
private int age;
private String gender;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
", gender='" + gender + '\'' +
'}';
}
}
writeValue(参数1,obj):方法
参数1
File:将obj对象转换为JSON字符串,并保存到指定的文件中
Writer:将obj对象转换为JSON字符串,并将json数据填充到字符输出流中
OutputStream:将obj对象转换为JSON字符串,并将json数据填充到字节输出流中obj
obj表示我们需要转换的对象
writeValueAsString(obj):方法
将对象转为json字符串
2.使用注解实现
@JsonIgnore:排除属性。
@JsonFormat:属性值得格式化
@JsonIgnore
在person实体对象中添加如下属性
@JsonIgnore //排除属性
private Date birthday;
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
执行如下代码
@Test
public void test02() throws Exception {
//1.创建Person对象
Person p = new Person();
p.setName("张三");
p.setAge(23);
p.setGender("男");
p.setBirthday(new Date());
//2.创建Jackson的核心对象 ObjectMapper
ObjectMapper mapper = new ObjectMapper();
//3.转换
String json = mapper.writeValueAsString(p);
System.out.println(json);
}
可以看到没有显示
@JsonFormat
在person实体对象中添加如下属性
@JsonFormat(pattern = "yyyy-MM-dd") //标准格式转换
private Date birthday;
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
执行如下代码
@Test
public void test02() throws Exception {
//1.创建Person对象
Person p = new Person();
p.setName("张三");
p.setAge(23);
p.setGender("男");
p.setBirthday(new Date());
//2.创建Jackson的核心对象 ObjectMapper
ObjectMapper mapper = new ObjectMapper();
//3.转换
String json = mapper.writeValueAsString(p);
System.out.println(json);
}
执行结果
我们可以看到有生日的格式显示
如果不添加JsonFormat标准格式转换,那么就只会显示毫秒值
3.复杂java对象转换
List数组
@Test
public void test03() throws Exception {
//1.创建Person对象,并添加到一个集合中去
Person p1 = new Person();
p1.setName("张三");
p1.setAge(23);
p1.setGender("男");
p1.setBirthday(new Date());
Person p2 = new Person();
p2.setName("张三");
p2.setAge(23);
p2.setGender("男");
p2.setBirthday(new Date());
Person p3 = new Person();
p3.setName("张三");
p3.setAge(23);
p3.setGender("男");
p3.setBirthday(new Date());
//创建List集合
List<Person> ps = new ArrayList<Person>();
ps.add(p1);
ps.add(p2);
ps.add(p3);
//2.创建Jackson的核心对象 ObjectMapper
ObjectMapper mapper = new ObjectMapper();
//3.转换
String json = mapper.writeValueAsString(ps);
System.out.println(json);
}
显示结果
[
{"name":"张三","age":23,"gender":"男","birthday":"2021-02-15"},
{"name":"张三","age":23,"gender":"男","birthday":"2021-02-15"},
{"name":"张三","age":23,"gender":"男","birthday":"2021-02-15"}
]
Map集合
@Test
public void test4() throws Exception {
//1.创建map对象
Map<String,Object> map = new HashMap<String,Object>();
map.put("name","张三");
map.put("age",23);
map.put("gender","男");
//2.转换
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(map);
System.out.println(json);//{"gender":"男","name":"张三","age":23}
}
显示结果
{"gender":"男","name":"张三","age":23}
4.JSON字符串转为Java对象
- 导入jackson的相关jar包
- 创建Jackson核心对象 ObjectMapper
- 调用ObjectMapper的相关方法进行转换
@Test
public void test5() throws Exception {
//1.初始化JSON字符串
String json = "{\"gender\":\"男\",\"name\":\"张三\",\"age\":23}";
//2.创建ObjectMapper对象
ObjectMapper mapper = new ObjectMapper();
//3.转换为Java对象 Person对象
Person person = mapper.readValue(json, Person.class);
System.out.println(person);
}