Ajax

★原生JS中的Ajax方法

日期:2020-8-21

看了一些博文以及自己的理解,我整理的一些东西只根据自己的适合情况来整理。

针对Ajax的整理,
1、首先得知道Ajax是什么
2、Ajax经常用在哪儿
3、跟Ajax有关的(同步+异步,get和post请求方式)的概念
4、Ajax的使用

一、Ajax是什么

Ajax是指异步的JavaScript和XML。

以异步的方式使得浏览器与服务器进行数据通信,用户一边在输入或浏览JavaScript编写的页面,后台在另一边悄悄地收发数据,由于数据类型有很多(简单类型+引用类型),所以采用一种通用的数据交换格式,即发过来的数据以XML的形式给浏览器,浏览器再翻译成它认识的JavaScript语言,使得后台发过来的数据在当前正在浏览的页面显示给用户,不用刷新加载以及其他事件操作才能看到,增强用户体验感。
由于XML格式以及解析啥的实在繁琐,已处于淘汰边缘,这时候Json上场了。

二、Ajax使用场景

1、注册账号时,表单即时发送后台对其内容或者格式等进行校验判断,然后将结果立即返回给用户;
2、下拉框联动,比如选择江苏省,市那边联动出来江苏省的13市; 3、百度,微博等搜索时补全功能

三、跟Ajax有关的概念

1、 同步+异步:

这边对于同步和异步的理解,我觉得最直观的理解就是,
异步:用户在与浏览器页面交互的时候,会悄悄发数据给后台,用户感受不到后台的执行操作,只需要管好当前自己的操作即可;
同步:用户自己跟浏览器打交道的时候,后台就在那儿等着,等用户喊他,喊完之后,才懒洋洋的来工作,他工作的时候,用户也只能等着,等后台来交差,这样听起来效率就好低。

针对这边,我存在的疑问:有必要用Ajax来执行同步操作吗,有可能是我理解不够深入,所以存在这个疑问,我后面再来研究一下我的这个疑惑。
解惑:Ajax默认异步, 可以点击这个查看设置同步的解释

2、get和post:(浏览器向服务器的请求方式)
(1)get和post:

向服务器提交数据的两种方式,主要区别在报文中的请求头,请求行,请求体中有所体现。

(2)get和post提交表单数据的区别:

get:1. 会把发送的数据放到地址栏中, 这样不安全, 会显示出敏感信息
2. 数据放到地址栏中, 地址栏中字符有长度限制
post:1. 不会把发送的数据放到地址栏中, post方式提交数据比get方式更安全些.
2. post方式来提交数据, 是没有大小限制

(3)鉴于两者的区别,大概区分了一下get和post使用的场景:

两者都可以向服务器发送请求,将浏览器数据发送给服务器,也可以接收服务器响应来的数据。
get:多用于想用来获取服务器的数据
post:多用于向服务器提交数据(可能是因为涉及到密码等安全性方面的信息)

(4)报文对比
  get和post请求报文的对比:
    请求报文: 行、 头、 体

    1、 请求行:
       //   get: 请求方式GET 发送的数据拼接到url地址后面,用 ? 隔开
       //   post: 请求方式POST 没有拼接发送的数据

    2、 请求头:
      //   基本上头信息都是浏览器自动添加上的
      //   get 和 post 请求头不一样的地方
      //   post多个 content-type 请求头,不写的话得到的数据带有一串乱七八糟的字符
      //   content-type: application/x-www-form-urlencoded

	3、 请求体: 放浏览器发送的数据
      //    get: get方式把数据拼接到url地址后面, 所以get请求体为空
      //    post: 有请求体, 放的发送的数据,没有?来连接

四、Ajax的使用(针对简单数据类型)

Ajax发送请求和获取响应的总结
(1)步骤:
    1. 创建ajax对象 ==> var xhr = new XMLHttpRequest();
    2. ajax 发送的是http协议 (请求 + 响应)
    3. 请求报文(行、 头、 体)
      //      请求行: xhr.open(方式, 地址)
      //      请求头: 不用处理
      //      请求体: xhr.send(请求体数据)
    4. 响应报文(行、 头、 体)
      //      响应行(状态行): 状态码  xhr.status :200 ok /404 not Found /500
      //      响应头:   
      //          xhr.getAllResponseHeaders()  获取所有的响应头
      //          xhr.getResponseHeader("xxxx")  获取指定的响应头d
      //      响应体: 响应的内容     xhr.responseText
    
    // xhr 状态变化
    //  只需要关注4 ==> 响应结束, 需要给xhr注册readystatechange事件
    //  状态 ==> xhr.readyState
(2)代码:
1) 请求:
		//get方式:
            var xhr = new XMLHttpRequest();
           // 请求行
            xhr.open("GET", "01.php?username=lw" );
            // 请求体
            xhr.send(null);
            
		//post方式:
		 	var xhr = new XMLHttpRequest();
		  
	        // 请求行
	        // post方式, url后面没有发送的数据 , 数据在请求体中
       	 	xhr.open("POST", "./01.php");
       	 	
	        // 请求头
	        // post方式比get方式多个content-type 请求头
	        //  xhr.setRequestHeader()  设置请求头
       		xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");

	        // 请求体
        	xhr.send("username=lw&age=10"); // 注意点: 不要带?

2) 响应: 获取响应内容的时机( 应该是服务器响应结束后才来获取)
 // 处理响应
 			// 需要给xhr注册readystatechange事件: 当xhr对象状态发生改变的时候触发
           xhr.onreadystatechange = function () {
                if(xhr.readyState === 4){
                    // ===4表示响应结束了
                    
                    if(xhr.status === 200){
                        //状态码===200表示响应是成功的
                        
                        // console.log( xhr.responseText );//接收打印返回来的数据

						//对返回来的数据进行判断执行操作
                        if(xhr.responseText === "yes"){
                            // 注册过了
                            span.innerText = "该用户名已被注册";
                        }else{
                            // 可以注册
                            span.innerText = "√";
                        }
                    }else{
                        // 响应失败了
                        alert("网络繁忙, 请稍后再试!");
                    }
                }
            } 

说明: xhr对象状态:在代码中, 通过xhr.readyState来查看到状态
// 0: ajax对象初始化了, 还未open
// 1: 已经open, 但还未发送请求, 还未send
// 2: 已经发送请求, 正在处理
// 3: 正在响应, 但还未结束
// 4: 响应结束了

响应还有第二种简单一点的写法,合并了第一行第二行代码,但是存在兼容问题,IE不识别。如下:

    // onload注册:等同于 注册了readystatechange && readyState === 4
            xhr.onload = function () {
                // 响应结束了
                
              if(xhr.status === 200){
                        //状态码===200表示响应是成功的
                        
                        // console.log( xhr.responseText );//接收打印返回来的数据

						//对返回来的数据进行判断执行操作
                        if(xhr.responseText === "yes"){
                            // 注册过了
                            span.innerText = "该用户名已被注册";
                        }else{
                            // 可以注册
                            span.innerText = "√";
                        }
                    }else{
                        // 响应失败了
                        alert("网络繁忙, 请稍后再试!");
                    }
            }

五、Ajax的使用(针对复杂数据类型)

日期:2020-08-23

以上整理的情况都是后端响应的是简单数据类型,浏览器能够直接识别的,由于XML几乎淘汰,不整理,所以下面整理关于JSON数据格式交互的情况。

1、JSON 数据

    // 1. JSON 数据本质上是个字符串
    // 2. 字符串里面是键值对格式(数组或者对象)
    // 3. 键名必须使用双引号包裹(不使用引号或者是单引号都不行的)
    // 4. 多个键值对使用逗号隔开, 最后一个键值对不需要有逗号.
    
    // var str = "{name: 'lw', age: 19}"; // 不符合
    // var str = "{'name': 'lw', 'age': 19}"; // 不符合
    // var str = '{"name": "lw", "age": 19}'; // 符合
    // var str = "[10, 20, 30]"; // 符合 // 这么去理解  '{"0": 10, "1": 20, "2": 30}'
    //注意:只是符合json字符串格式,浏览器并没有办法直接识别。

2、json字符串与js对象的相互转换

(1)把json字符串转成js对象:后端服务器响应给浏览器json字符串 ,浏览器自行解析成js对象

借助JSON对象
// JSON.parse(json字符串);
// parse 有解析的含义

 <script>
// 这是后端响应给前端的数据 (json字符串格式)
 var jsonStr = '{"name": "xm", "age": 19}';
 var jsObj = JSON.parse(jsonStr);
 console.log( jsObj );
 </script>
(2)把js对象转成json字符串:前端浏览器给后端发送复杂数据类型时,将js对象转成json字符串发送

借助JSON对象
// JSON.stringify(js对象);
// stringify 字符串化

  <script>
  var obj = {
            name: "lw",
            age: 20,
            hobby: [
                "abc",
                "def"
            ]
        };
 var jsonStr = JSON.stringify(obj);
 console.log( jsonStr );
 </script>

★jQuery中的Ajax方法

日期:2020-8-23

<script>
        $(function () {
            // jQuery中ajax方法 ==> $.ajax({}); // 参数是个对象, 在对象中配置
            // 请求方式, 请求地址, 需要发送的数据 ...

            // $("div").ajax(); // error

            /*$.ajax({
                // type; 请求方式( get post, 默认是get),
                // url : 请求地址,
                // success: function (data) {
                //     // 响应成功的时候执行的回调函数
                // },
                // error: function(){
                //     // 响应失败的时候执行的回调函数  
                // }
            })*/


			 // 在发送ajax请求之前,来取做表单的校验
            	/*if (true) {
                	// if成立, 表单校验不通过了.
               		 return;

	                // return 和 return false;区别
	                // return 没有返回值的, 主要就是借助return后面代码不执行
	                // return false 有返回值, 返回值是false
	                
          	  }*/
            $.ajax({
                type: "post",
                url: "05.php",
                data: {
                    name: "xm",
                    age: 19
                    // 需要发送的数据, data的值可以是个对象,也可以是字符串
                    // jQuery不会直接把data这个对象直接发送到服务器端, jQuery内部会根据请求方式去做不同的处理
                },
                // data: "name=xm&age=19",//字符串形式
 				// dataType: 预期服务器响应的数据类型(text json xml),这样浏览器就能根据预期判断是否需要进行解析  
                // dataType: "json", //如果后端php帮我们配置写了响应来的是json格式了的话,这边可不用配置
   				beforeSend: function () {
                    // 在发送ajax请求之前,执行的回调函数
                    // console.log("在发送ajax请求之前,执行的回调函数");

                    //  该回调函数的作用: 
                    //  可以在该回调函数中进行表单校验的(在上面的if语句中进行校验也是一样的), 如果校验不通过, 可以用return false来阻止ajax请求的方式
                    //  固定写法: return false;
                    // return false;
                    //这个回调函数里面进行表单校验不通过的话,必须是加上false,因为jQuery中规定了需要返回值,如果不在这儿进行校验,在上面的if语句校验时,不成立可返回return
                },
                success: function (info) {
                    // 形参data就是服务器响应发送来的数据

                    console.log("响应成功了", info); //响应来的数据具体是什么格式,建议打印一遍看一下
                    // console.log( JSON.parse( info ) ); //如果是json格式,还得格式转换一下进行使用
                    // 如果指定了dataType为json, 那么获取到info就是个js对象, 都不用自己手动进行 JSON.parse();
                },
                error: function () {  
                //error回调函数其实有形参,具体参数去“$.ajaxSetup() : 为所有的AJAX请求设置默认值”这篇文章找
                    console.log("失败了");
                },
                 complete: function () {
                    // 响应完成了就会执行的回调函数
                    // 不论是响应成功还是失败都会执行的
                    // console.log( "complete 响应完成了" );

                    // 作用: 可以在该回调函数中, 将页面中的loading将其隐藏掉
                }
            })
            })
        })
    </script>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值