ajax学习笔记(一)

AJAX简要札记


a j a x 有了ajax,前端有了一道分水岭

1.0 关于ajax和异步

ajax是什么 axios

​ Ajax 即“Asynchronous Javascript And XML”(异步 JavaScript 和 XML),是指一种创建交互式网页应用的网页开发技术

​ 关键词: 异步,不需要页面跳转局部刷新

__本质: 基于http协议以异步的方式通过 XMLHttpRequest对象 向服务器进行通信__

__作用: 在页面不刷新的情况下,请求服务器,实现局部的渲染数据__

什么是异步

​ 异步的反义词就是同步,同步指在网页的一次请求中,如果不完成这次请求,就不会响应其他的任何操作,效率比较慢;

通过后台处理页面跳转
/*  
	以往方式写出来的页面,是静态的,数据没有办法改变和刷新
	使用php书写:
		a, 所有要操作的文件后缀名改成php, 或者通过提交按钮和a链接跳转到php文件
		b, 参数必须拼在a链接后面或者form表单内部
		b, 书写符合php语法的代码,方法较多难以记忆
		c, 在页面中来来回回的跳转, 发送的请求要等待完成之后才能做其他的操作
*/

前端的register.html文件

<form action="./register.php" method="post">     
	<span id="msg">aaa</span>  
    用户名:<input type="text" id="userName" name="username" >
    昵称:<input type="text" name="nickname" >
    密码: <input type="password" name="password" >   
    <input type="submit" value="注册">
</form>

后台处理的php文件

<?php 
    header('content-type:text/html;charset=utf-8');
    if($_SERVER['REQUEST_METHOD'] == 'POST'){
        //获取用户名
        $name=$_POST['username'];
        //判断数据库中是否已有这个用户名
        $names=['jack','rose','tom','lili'];
        //有则注册失败,否则成功
        if(in_array($name,$names)){
            $str = '这个名字太火了,换一个吧!';
            echo $str;
            header("refresh:10;url=register.html");
        }else{
            $str = '恭喜,名字可用!';
            echo $str;
            header("refresh:2;url=register.html");
        }
    }
?>
通过前端发送ajax请求

​ 异步就是在发起请求之后,不用理会这个过程,等请求结束了,自动返回回来数据,不用进行等待;

/*
	a, 原先是html的文件还是html,不用修改文件类型
	b, 发送请求不再仅仅依靠a链接或者表单元素
	c, 不需要来回跳转页面,用户不需要进行等待
	d, 返回的数据可以在局部进行刷新
*/

前端的register.html文件

<form>     
    <span id="msg">aaa</span>  
    用户名:<input type="text" name="username" id="username">
    昵称:<input type="text" name="nickname" >
    密码: <input type="password" name="password" >   
    <input type="submit" value="注册">
</form>

<!-- 显示ajax请求返回回来的数据 -->
<div class="showmsg"></div>

前端基于http发送的一个异步请求

        document.querySelector("#username").onblur = function(){
            // 1.获取用户数据
            var name = this.value;

            // 2.1 创建异步对象
            var xhr = new XMLHttpRequest();
            // 2.2 请求行发送 open(请求方式,请求url+键值对的参数):
            xhr.open("get","validate.php?username="+name);
          	// 2.3 get请求没有请求头
            // 2.4 请求体:发送请求 
            xhr.send(null);

      		// 2.5 通过readystate发生改变的事件处理响应
            xhr.onreadystatechange = function(){
              	// 2.6 判断请求是否结束后成功返回   判断服务器状态码是否为200
                if(xhr.readyState == 4 && xhr.status == 200){
                  	// 通过xhr对象的responseText接收返回的数据,写入盒子内
                    document.querySelector(".showmsg").innerHTML = xhr.responseText;;
                }
            }
        };

处理后端的php文件

<?php 
    header('content-type:text/html;charset=utf-8');
    if($_SERVER['REQUEST_METHOD'] == 'GET'){
        //获取用户名
        $name=$_GET['username'];
        //判断数据库中是否已有这个用户名
        $names=['jack','rose','tom','lili'];
        //有则注册失败,否则成功
        if(in_array($name,$names)){
            $str = '这个名字太火了,换一个吧!';
            echo $str;
            // header("refresh:10;url=register.html");
        }else{
            $str = '恭喜,名字可用!';
            echo $str;
            // header("refresh:2;url=register.html");
        }
    }
?>

前端的get请求

// 1.1 创建异步对象
var xhr = new XMLHttpRequest();
// 1.2 请求行发送 open(请求方式,请求url+键值对的参数):
xhr.open("get","validate.php?username="+name); // url地址 ? 键=值 & 键=值 & 键=值
// 1.3 get请求没有请求头
// 1.4 请求体:发送请求 
xhr.send(null);

// 1.5 通过readystate发生改变的事件处理响应
xhr.onreadystatechange = function(){
    // 1.6 判断请求是否结束后成功返回   判断服务器状态码是否为200
    if(xhr.readyState == 4 && xhr.status == 200){
        // 通过xhr对象的responseText接收返回的数据,写入盒子内
        document.querySelector(".showmsg").innerHTML = xhr.responseText;
    }
}

前端的post请求

// 1.1 创建异步对象
var xhr = new XMLHttpRequest();
// 1.2 设置请求行 open(请求方式,请求url)
// post请求不需要拼接参数
xhr.open("post","validate.php");
// 1.3 设置请求头:setRequestHeader()
xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
// 1.4 设置请求体 send()
// post的参数在这个函数中设置(如果有参数)
xhr.send("username="+name);

// 1.5 通过readystate发生改变的事件处理响应
xhr.onreadystatechange = function(){
    // 1.6 判断请求是否结束后成功返回   判断服务器状态码是否为200
    if(xhr.readyState == 4 && xhr.status == 200){
        // 通过xhr对象的responseText接收返回的数据,写入盒子内
        document.querySelector(".showmsg").innerHTML = xhr.responseText;
    }
}

关于get请求和post的请求区别是什么

1、GET没有请求主体,使用xhr.send(null)
2、GET可以通过在请求URL上添加请求参数
3、POST可以通过xhr.send(‘name=itcast&age=10’)
4、POST需要设置 Content-type:application/x-www-form-urlencoded


2.0 使用异步对象发送读取JSON文件

​ 在项目开发过程中,用的最多的方式就是json

json格式的数据和特点

[
    {
       "src":"./images/nav_1.png" ,
       "text":"京东超市"
    },
    {
        "src":"./images/nav_2.png" ,
        "text":"全球购物"
     },
     {
        "src":"./images/nav_3.png" ,
        "text":"京东市场"
     }
]
规则和特点
关于json的描述
1,一组花括号表示一个对象,一个对象通过键值对写入一堆相关数据
2,一组方括号表示一个数组,多组对象通过数组的方式装载
3,对象的所有属性都必须加上双引号,值没有undefined
4,文件后缀名为.json,json格式的数据内不允许写注释
操作json的方法
前端操作json的方式
JSON.parse(json字符串) 将json格式的字符串转换为数组或者对象
JSON.stringify(对象或者数组) 将字面量对象或者数组转换为json格式的字符串
php操作json的方式
json_decode(json字符串) 将json格式的字符串转换为php的数组或者对象
json_encode(关联数组) 将php的数组转换为json字符串

关于json的操作

​ 拿到数据之后,大部分情况下是一个装了很多数据的数组,里面是一个个对象

所以需要对数组进行循环遍历

通过for循环,拿到每一个对象,通过在循环中,拿到当前对象某个属性对应的值

data[i].src data[i]["src"]

例如:

xhr.onreadystatechange = function(){
	if(xhr.status == 200 && xhr.readyState == 4){
		var result = xhr.responseText;
        // 通过操作json的方法获取到data数组
        var data = JSON.parse(result);
		
		var arr = [];
        for(var i=0;i<data.length;i++){
        	var str = "<li>"
            		+ '<a href="#">'
            		+ '<img src="' + data[i].src + '" alt="">'
            		+ '<p>' + data[i].text + '</p>'
            		+ '</a>'
            		+ '</li>';
            arr.push(str)    
		}
        // 将生成的页面结构添加到dom元素中
		document.querySelector("ul").innerHTML = arr.join("");
	}
}

后端处理php文件的代码

<?php
    echo file_get_contents("../data/nav.json");
?>

3.0 xml语法和文件操作

​ 以前比较频繁的数据传输方式就是xml的文件格式,它是html的一个扩展

xml文件格式的创建

<?xml version="1.0" encoding="utf-8"?>
<!-- 上面这一句必须是整个xml文档的第一句,否则格式错误 -->
    <root>
        <!-- 标签名称 以字母和下划线开头,不能有空格,不能包含特殊字符,区分大小写 -->
        <items>
            <!-- 说明下面的内容需要描述为数组 -->
            <item>
                <!-- 描述数组中的具体的成员值 -->
                <src>./images/nav_1.png</src>
                <text>京东超市</text>
            </item>
            <item>
                <!-- 描述数组中的具体的成员值 -->
                <src>./images/nav_2.png</src>
                <text>全球购物</text>
            </item>
            <item>
                <!-- 描述数组中的具体的成员值 -->
                <src>./images/nav_3.png</src>
                <text>京东市场123</text>
            </item>
        </items>
    </root>
xml文件的规则和特点
关于xml数据格式的规则
1,文件后缀名必须得为.xml格式
2,必须得在头部声明那样一句话,相当于doctype声明
3,内容都以双标签包裹,可以嵌套和并列,不能交叉
4,标签名称以字母和下划线开头,叫什么,多长的名称无所谓

关于xml的操作

前端获取xml文件的内容

​ 在响应成功后,通过responseXML来接收当前的数据,会拿到一长串标签

​ 此时可以使用js中选择器,选择对应的标签 xhr.responseXML.querySelector(“标签名称”)

​ 如果获取到的是多个元素,则需要遍历,也是可以通过获取元素内的数据传递给其他标签

xhr.onreadystatechange = function(){
	if(xhr.status == 200 && xhr.readyState == 4){
		// responseText:接收普通字符串 responseXML:专门用来接收服务器返回的xml数据的
		var result = xhr.responseXML;
		// 将获取到的数据生成动态的页面结构
		var items = result.querySelectorAll("item");

		var arr = [];
        for(var i=0;i<items.length;i++){
          	// 获取到标签内部的数据
          	var src = items[i].querySelector("src").innerHTML;
            var text = items[i].querySelector("text").innerHTML;
        	var str = "<li>"
            		+ '<a href="#">'
            		+ '<img src="' + src + '" alt="">'
            		+ '<p>' + text + '</p>'
            		+ '</a>'
            		+ '</li>';
            arr.push(str)    
		}
        // 将生成的页面结构添加到dom元素中
		document.querySelector("ul").innerHTML = arr.join("");
	}
}

后端php文件处理xml文件的请求

<?php
    // 默认返回数据的类型
    // header("Content-Type:text/html;charset=utf-8");
    // 如果需要返回数据为xml,那么标准的响应头的写法应该是
    header("Content-Type:application/xml;charset=utf-8");
    echo file_get_contents("../data/nav.xml");
?>

4.0 改进和封装工具

便 使 封装的目的是为了方便更高效的使用,一次封装多次调用

代码的封装

​ 关于代码的封装,重点在于要知道怎么使用,具体的封装过程等到了一定的开发经验再把玩

var dilireba = {
    // 将{"name":"jack","age":20} 的参数要转换为 ?name=jack&age=20
    getpa:function(data){
        if(data && typeof data == "object"){
            var str = "?";
            for(var key in data){
                str = str + key + "=" + data[key] + "&";
            }
            str = str.substr(0,str.length-1);
        }
        return str;
    },
    ajax:function(option){
        // 接收用户参数进行相应处理
        var type = option.type || 'get';
        // location.href 可以获取当前文件的路径 
        var url = option.url || location.href;
        // 接收参数:在js中最方便收集的数据类型为对象,所以我们就规定传递的参数必须是对象
        var data = this.getpa(option.data) || "";
        // 响应成功之后的回调函数 => 这个函数一般就是处理字符拼接,标签渲染的函数
        var success = option.success;
        
      	// 创建异步对象
        var xhr = new XMLHttpRequest();
        // 请求行  如果是get请求就需要拼接参数
        if(type == "get"){
            url += data;
            data = null; // 拼接后设置data为null,在send()方法中就不会再次发送
        }
        xhr.open(type,url);
        // 请求头  如果是post才需要请求头
        if(type == "post"){
            xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
        }
        // 请求体
        xhr.send(data);
        // 让异步对象接收响应
        xhr.onreadystatechange = function(){
            // 一个成功的响应有两个条件:1.服务器成功响应 2.数据解析完毕可以使用
            if(xhr.status == 200 && xhr.readyState == 4){
                // 接收响应的返回值 responseText   responseXML
                var rh = xhr.getResponseHeader("Content-Type");
                if(rh.indexOf("xml") != -1){
                    var result = xhr.responseXML;
                }
                else if(rh.lastIndexOf("json") != -1){
                    var result = JSON.parse(xhr.responseText);
                }else{
                    var result = xhr.responseText;
                }
                // 接收数据之后,调用回调函数
                success && success(result)
            }
        }
    },
}

封装代码的使用

dilireba.ajax({
    type:'post',
    url:'./server/nav-json.php',
    data:{},
    success: function (result){
        var arr = [];
        for(var i=0;i<data.length;i++){
        	var str = "<li>"
            		+ '<a href="#">'
            		+ '<img src="' + data[i].src + '" alt="">'
            		+ '<p>' + data[i].text + '</p>'
            		+ '</a>'
            		+ '</li>';
            arr.push(str)    
		}
        // 将生成的页面结构添加到dom元素中
		document.querySelector("ul").innerHTML = arr.join("");
    }
}); 

猜你喜欢

转载自blog.csdn.net/denghuocc/article/details/89339049