如果对于上一次的封装还有一点点印象,那么对于jQuery中的ajax就能很快熟悉
只是关于jQuery中的ajax,功能更多,使用更加高效和频繁
如果要使用自己封装的函数,那么需要引入自己封装的ajaxTools.js文件
$.ajax({
type: 'post',
url: './server/nav-json.php',
data: {},
success: function (result){
var data = JSON.parse(result);
var arr = [];
for(var i=0;i<data.length;i++){
var str = ""
+ ''
+ '+ data[i].src + '" alt="">'
+ ''
+ data[i].text + ''
+ ''
+ '';
arr.push(str)
}
// 将生成的页面结构添加到dom元素中
document.querySelector("ul").innerHTML = arr.join("");
}
});
有意思的是,如果将自己封装的文件,替换成jquery-1.12.2.min.js文件,发现没任何不妥
也就是说,jquery的使用方式跟上面是差不多的,只是jquery中,还可以在内部有更多的参数和功能,而如果在自己封装的文件上,加入再多的功能,对于难度上来讲是一个挑战,对于实际应用上来说没有必要
$.ajax({这里传入一个字面量对象}) | 参数说明 |
---|---|
url | 接口地址 |
type | 请求方式 |
timeout | 请求超时,单位是毫秒 |
dataType | 服务器返回的格式, json / xml / jsonp |
data | 发送请求的数据 |
beforeSend: fucntion() { …code } | 请求发起前的调用 |
success: fucntion() { …code } | 成功响应后的调用 |
error: fucntion() { …code } | 错误响应时的调用,e参数为报错信息 |
complete: fucntion() { …code } | 响应完成时的调用 |
$.ajax({
type: 'post',
url: './server/nav-json.php',
data: {}, //请求需要传递的参数
// 设置请求超时:单位为毫秒,如果服务器的响应时间超过指定的时候,请求失败
timeout: 3000,
dataType:'json', // 设置响应数据的格式 xml json text html script jsonp
// 发送请求之前的回调
beforeSend:function(){
// 在这个回调函数中,如果return false,那么本次请求会中止
// return false;
},
success: function() {
//请求成功之后的回调
},
// 请求失败之后的回调
error:function(e){
if(e.statusText == "timeout"){
alert("请求超时,请重试");
}
},
// 无论请求是成功还是失败都会执行的回调
complete:function(){
console.log('实现一些全局成员的释放,或者页面状态的重置....');
}
});
本质上只能发送get请求
$.get(url, data, success, datatype) | 说明 |
---|---|
url | 所请求的url |
data | 请求所传递的数据 |
success: function() { …code } | 成功之后的回调 |
datatype: | 需要返回的数据类型 |
$.get("./server/nav-json.php", function() {
// 成功回调之后的函数
}, "json")
参数一致,用法一直,目的一致
代码略.
跟着练习思考使用ajax解决问题的思路
$arr = array('12345','23456','34567','45678');
/*生成一个随机索引 array_rand:可以生成指定的数组长度内的索引*/
$index = array_rand($arr);
sleep(2);
echo $arr[$index];
?>
[
{"name":"jack","pass":"rose","mobile":"12345678901"},
{"name":"rose","pass":"123","mobile":"12345678902"},
{"name":"tom","pass":"123","mobile":"12345678909"},
{"name":"lili","pass":"123","mobile":"1234"},
{"name":"lili","pass":"123","mobile":"1234"},
{"name":"lili","pass":"123","mobile":"1234"},
{"name":"lili","pass":"123","mobile":"1234"},
{"name":"lili","pass":"123","mobile":"1234"},
{"name":"lili","pass":"123","mobile":"1234"},
{"name":"lili","pass":"123","mobile":"1234"},
{"name":"lili","pass":"123","mobile":"1234"}
]
if($_SERVER['REQUEST_METHOD'] == 'GET'){
/*1.读取文件*/
$dataStr = file_get_contents('data.json');
/*2.转换为数组,因为我们需要判断数组中的成员的name属性是否是指定的用户名--遍历*/
$dataArr = json_decode($dataStr);
/*3.遍历*/
for($i=0;$i<count($dataArr);$i++){
if($dataArr[$i] -> name == $_GET['name']){
$arr = array(
'code'=>0, //状态码
'msg'=>'用户名已存在' //状态信息
);
echo json_encode($arr);
return;
}
}
}
?>
$name = $_POST['name'];
$pass = $_POST['pass'];
$mobile = $_POST['mobile'];
/*创建需要进行存储的当前用户注册对象*/
$obj = array(
'name' => $name,
'pass' => $pass,
"mobile" => $mobile
);
/*php无法直接将一个数据存储到文件,它需要先将数据写入到数组,再将数组写入到文件*/
$arr = file_get_contents('data.json'); //字符串
$dataArr = json_decode($arr); //将json格式字符串转换为php数组
/*向数组中添加数据*/
$dataArr[] = $obj;
/*将数据写入到文件,写入到文件的数据只能是字符串*/
$resultStr = json_encode($dataArr); //将数组转换为json格式字符串
file_put_contents('data.json',$resultStr);
echo json_encode(array('code'=>1,"msg"=>'注册成功'));
?>
引入jQuery文件,创建开始任务的js标签
<script src="jquery-1.12.2.min.js" >script>
<script> // 1.0 获取验证码 // 2.0 完成验证操作 // 3.0 提交表单,进行上传操作 script>
步骤1: 为按钮添加单击事件
步骤2:收集手机号,向服务器发送获取验证码的请求
步骤3:接收验证码,给出响应的提示信息
$(".verify").on("click", function() {
// 判断当前的请求是否正在进行
if($(this).hasClass("disabled")) {
return;
}
var phone = $(".mobile").val();
// 发送请求
$.ajax({
type: "get",
url: "./getCode.php",
data: {"phone": phone},
beforeSend: function() {
var reg = /^1\d{10}$/;
// 在请求发送之前,进行验证手机号是否合法
if(!reg.test(phone)) {
// 元素慢慢出来,提示完之后,再慢慢消失
$(".tips > p").fadeIn().delay(2000).fadeOut().text("请输入正确的手机号码!")
}
// 验证成功 则不可以再次点击
$(".verify").addClass("disabled");
var total = 5;
var timerId = setInterval(function() {
total--;
$(".verify").val(total + "s之后重新获取")
if(total <= 0) {
$(".verify").val("重新获取").removeClass("disabled");
clearInterval(timerId)
}
}, 1000)
},
success: function(res) {
alert(res)
}
})
})
步骤1:添加事件,onblur
步骤2:收集用户数据,发送请求
步骤3:接收响应,给出提示
$(".name").on("blur", function() {
var name = $(this).val();
$.ajax({
type: "get",
url: "./server/validataUsername.php",
data: {"name":name},
dataType: "json", // 接收到的就是一个js的对象,不然就是一个字符串
success: function(res) {
// console.log(res)
if(res && res.code == 0) {
$(".tips > p").text(res.msg).fadeIn().delay(2000).fadeOut()
}
}
})
})
步骤1:添加注册事件
步骤2:收集用户数据
步骤3:发起ajax请求
步骤4:接收响应,给出提示
$(".submit").on("click", function() {
if($(this).hasClass("disabled")) {
return;
}
// 通过表单序列化的方式来收集用户数据
var data = $("#ajaxForm").serialize();
$.ajax({
type: "post",
url: "./server/register.php",
data: data,
dataType: "json",
beforeSend: function() {
// 用户输入合法的验证
// 如果验证通过,开启节流阀,避免重复提交
$(".submit").addClass("disabled").val("正在注册中");
},
success: function(res) {
if(res && res.code == 1) {
$(".tips > p").text(res.msg).fadeIn().delay(2000).fadeOut()
}
},
error: function() {
$(".tips > p").text("注册失败").fadeIn().delay(2000).fadeOut()
}, // 不管成功还是失败都会执行
complete: function() {
$(".submit").removeClass("disabled").val("注册");
}
})
})
在php文件最后加一句
echo json_encode(array('code'=>1, 'msg'=>'注册成功'));
jquery的表单序列化方法 | |
---|---|
$("#ajaxForm").serialize(); | |
可以将表单中所有name属性的表单元素的值收集,生成key=value&key=value | |
在ajax中,支持两种格式的参数(1,对象,2,参数格式字符串) |
渲染数据是开发中常见的活儿
准备静态页面,准备json
[
{
"id": 1,
"title": "平凡之路",
"singer": "朴树",
"album": "平凡的生命",
"src": ".\/mp3\/zhangsan.mp3"
},
{
"id": 2,
"title": "为了遇见你",
"singer": "薜之谦",
"album": "为了遇见你",
"src": ".\/mp3\/See You Again.mp3"
},
{
"id": 3,
"title": "故乡",
"singer": "许巍",
"album": "许巍-作品全集",
"src": ".\/mp3\/See You Again.mp3"
}
]
// 服务器读取json文件
echo file_get_contents("music.json");
?>
<script src="jquery-1.12.2.min.js">script>
<script> // 发送ajax请求 $.ajax({ url: "./music.php", dataType: 'json', success: function (result) { var html = ""; // 生成动态页面结构 for (var i = 0; i < result.length; i++) { html += ''; html += ''+result[i].title+' '; html += ''+result[i].singer+' '; html += ''+result[i].album+' '; html += ' '; html += ''; html += '+result[i].id+'" class="btn btn-primary">编辑'; html += '+result[i].id+'" class="btn btn-danger">删除'; html += ' '; html += ' '; } $("tbody").html(html); } }); script>
有了模板引擎,再也不用那么复杂的去拼接字符串了
作用: 为了动态渲染的时候,简化拼接字符串
关键词语:创建模板标签
、循环遍历
、<% 逻辑语句 %>
、<%= 输出语句 %>
<script src="./js/template-native.js">script>
<script type="text/template" id="navTemp"> <li> <a href="#"> <img src="<%= src %>" alt=""> <p><%= text %></p> </a> </li> script>
<script> var obj = { "src": "./images/nav-1.png", "text": "京东超市" } // 调用函数 templete(模板id, 数据(对象)) 返回替换后的DOM结构 var html = template(navTemp, obj); document.querySelector("ul").innerHTML = html; script>
<script type="text/template" id="navTemp"> <% for(var i = 0; i < items.length; i++) { %> <li> <a href="#"> <img src="<%= items[i].src %>" alt=""> <p><%= items[i].text %></p> </a> </li> <% } %> script>
如果是数组,那么在传入的时候需要包装为一个对象
<script> var arr = [ { "src": "./images/nav-1.png", "text": "京东超市" }, { "src": "./images/nav-2.png", "text": "全球购物" }, { "src": "./images/nav-3.png", "text": "京东市场" } ] // !!!!! 把数组转换为一个对象的方式 var html = template(navTemp, {"items": arr}); document.querySelector("ul").innerHTML = html; script>
<script type="text/template" id="musicTemp"> {{ each items as value index }} <tr> <td>{{ items[index].title }}</td> <td>{{ value.singer }}</td> <td>{{ value.album }}</td> <td> <audio src="{{ value.src }}" controls></audio> </td> <td> <a href="./edit.php?id={{ value.id }}" class="btn btn-primary">编辑</a> <a href="./edit.php?id={{ value.id }}" class="btn btn-danger">删除</a> </td> </tr> {{ /each }} script>
$.ajax({
url: "./music.php",
dataType: "json",
success: function(res) {
var html = temlpate("musicTemp", {"items": res});
$("tbody").html(html);
}
})
如果参数是对象,就直接传入对象,
如果参数是数组,就包装成数组