AJAX

AJAX

  1. 什么是AJAX
    Asynchronous Javascript And Xml
    异步的 JS 和 XML
    通过JS异步的向服务器发送请求并接受响应,响应的数据是XML/JSON格式的

    同步访问: 当客户端浏览器向服务器发送请求是,服务器在处理的过程中,浏览器只能等待
    异步访问: 当客户端浏览器向服务器发送请求时,服务器在处理的过程中,浏览器可以做其他操作,无需一直等待

    AJAX的优点:

    1. 异步访问
    2. 局部刷新

    使用场合:

    1. 搜索建议
    2. 表单验证
    3. 前后端完全分离(SPA)single Page Application
  2. AJAX核心对象 – 异步对象

    1. 异步对象 – XMLHttpRequest
      由JS提供。。。。简称为xhr
      代替浏览器向服务器端发送异步的请求并接受响应
    2. 创建异步对象
      1. 主流的异步对象时XMLHttpRequest类型的(IE7+,Chrome,Firefox)

      2. IE低版本(IE7以及以下)不支持XMLHttpRequest,需要ActiveXObject()来创建异步对象
        创建异步对象

        1. 创建XMLHttpRequest:
          var xhr = new XMLHttpRequest();
        2. 创建ActiveXObject:
          var xhr = new ActiveXObject(“Micorsoft.XMLHttp”);

        练习:
        1. 创建 commom.js
        2. 声明一个函数 – createXhr()
        3. 在函数中根据浏览器的支持性创建对应的异步对象,并返回。

  3. xhr.open(method,url,async)

    1. method
    2. url:请求地址,字符串
    3. async:是否采用异步的方式进行提交
      1. true:异步
      2. false:同步
        示例:以异步的提交方式使用get请求方法向 /01-serveer 的地址发送请求
        xhr.open(“get”,"/01-server",true)
  4. 属性 – readyState
    作用:表示xhr的请求状态,通过不同的状态值来表示xhr与服务器的交互情况

     0: 请求尚未初始化
     1: 已经与服务器建立连接
     2: 服务器端已接收请求
     3:请求正在处理中
     4:表示响应已完成
    
  5. 属性 – status
    作用:服务器端的响应状态码
    200:表示服务器端正确处理所有的请求并给出响应
    404:请求资源不存在
    500:服务器端内部错误

  6. 事件 – onreadystatechange
    作用:每当xhr的readyState值发生改变的时候多要自动触发的一个事件 – 回调函数
    只有当readyState的值为4并且status的值为200的时候则可以正常的接收响应数据了。
    示例:

     	xhr.onreadystatechange = function(){
     		if(xhr.readyState==4 && xhr.status == 200){
     			正常接收响应回来的内容
     			var resTxt = xhr.responseText;
     			//resTxt表示的就是响应回来的数据
     			}
     		}
    
  7. 属性 – responseText
    作用:响应数据
    示例见6。

  8. 方法:send()
    作用:通知xhr向服务器端发送请求
    语法:xhr.send(body)
    body:请求体

    get请求:body的值为null
    xhr.send(null)
    post请求:body的为要提交的数据
    xhr.send(“请求数据”)

from flask import Flask,render_template,request

app = Flask(__name__)


@app.route('/01-ajax-get')
def ajax_get():
    return render_template("01-ajax-get.html")

@app.route("/01-server")
def server():
    return "这是ajax发送的get请求"

@app.route('/02-ajax-get')
def ajax_get02():
    return render_template('02-ajax-get.html')


@app.route("/02-server")
def server02():
    uname = request.args['uname']
    return "欢迎"+uname



if __name__ == '__main__':
    app.run(debug=True)

01-ajax-get.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="/static/js/common.js"></script>
    <script src="/static/js/jquery-1.11.3.js"></script>
    <script>
        $(function () {
            $("#btnget").click(function () {
                {#1.创建xhr对象#}
                var xhr = createXhr();
                {#2.创建请求#}
                xhr.open("get","/01-server",true);
                {#3.设置回调函数#}
                xhr.onreadystatechange = function () {
                    if (xhr.readyState == 4 && xhr.status == 200){
                        $("#show").html(xhr.responseText);
                    }
                };
                {#4.发送请求#}
                xhr.send(null);

            })
        })
    </script>
</head>
<body>
    <a href="/01-server">非ajax请求</a>
    <button id="btnget">ajax请求</button>
    <div id="show"></div>
</body>
</html>

02-ajax-get.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="/static/js/common.js"></script>
    <script src="/static/js/jquery-1.11.3.js"></script>
    <script>
        $(function () {
            $("#btnGet").click(function () {
                var xhr = createXhr();
                var url = "/02-server?uname="+$("#uname").val();
                xhr.open("get",url,true);
                xhr.onreadystatechange = function () {
                    if (xhr.readyState == 4 && xhr.status == 200) {
                        $("#show").html(xhr.responseText);
                    }
                };
                xhr.send(null)
            })
        })
    </script>
</head>
<body>
    用户名:<input type="text" id="uname">
    <button id="btnGet">请求</button>
    <div id="show"></div>
</body>
</html>

练习:

  1. 创建数据库------ajaxDB
  2. 创建实体类 -----User
    id,主键,自增
    uname,用户名
    upwd,密码
    uemail,邮箱
  3. 当光标从用户名的文本框失去焦点的时候,验证用户名的值在数据的uname列中是否存在,并给出提出
class User(db.Model):
    __tablename__ = "user"
    id = db.Column(db.Integer,primary_key=True,)
    uname = db.Column(db.String(30),unique=True)
    upwd = db.Column(db.String(30),nullable=False)
    uemail = db.Column(db.String(80))

@app.route('/03-register',methods=["GET","POST"])
def register():
    return render_template("03-register.html")


@app.route("/03-checkuname")
def checkuname():
    uname = request.args['uname']
    user = User.query.filter_by(uname=uname).first()
    if user:
        return "用户已存在"
    else:
        return "通过"

03-register.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="/static/js/common.js"></script>
    <script src="/static/js/jquery-1.11.3.js"></script>
    <script>
    	{#为#uname绑定失去焦点事件#}
        $(function () {
            $("#uname").blur(function () {
                var xhr = createXhr();
                var url = "/03-checkuname?uname="+this.value;
                xhr.open("get",url,true);
                xhr.onreadystatechange = function() {
                    if (xhr.readyState == 4 && xhr.status == 200) {
                        $("#uname-tip").html(xhr.responseText);
                    }
                };
                xhr.send(null);
            })
        })
    </script>
</head>
<body>
    <p>用户名:  <input type="text" id="uname">
                <span id="uname-tip"></span>
    </p>
    <p>密码:<input type="password" id="upwd"></p>
    <p>邮箱:<input type="email" id="uemail"></p>
    <p><button id="btnReg">注册</button></p>
</body>
</html>
  1. AJAX 发送post请求
    1. 请求数据需要放在send()
      xhr.send(“参数名1=值&参数名2=值2”);
    2. 将Content-Type的值改为
      application/x-www-form-urlencoded
      xhr.setRequestHeader(“Content-Type”,“application/x-www-form-urlencoded”)
      @app.route("/04-post")
      def post():
          return render_template("04-post.html")
      
      @app.route("/04-server",methods=["POST"])
      def server04():
          uname = request.form["uname"]
          return "欢迎"+uname
      
      04-post.html
      <!DOCTYPE html>
      <html lang="en">
      <head>
          <meta charset="UTF-8">
          <title>Title</title>
          <script src="/static/js/common.js"></script>
          <script src="/static/js/jquery-1.11.3.js"></script>
          <script>
              $(function () {
                  $("#btnPost").click(function () {
                      {#创建xhr#}
                      var xhr = createXhr();
                      {#创建请求---post#}
                      xhr.open("post","/04-server",true);
                      {#设置回调函数#}
                      xhr.onreadystatechange = function () {
                          if (xhr.readyState == 4 && xhr.status == 200) {
                              $("#show").html(xhr.responseText)
                          }
                      };
                      {#设置content-type的请求消息头#}
                      xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
                      {#发送请求--有参数#}
                      var uname = $("#uname").val();
                      xhr.send("uname="+uname)
      
      
                  });
              })
          </script>
      </head>
      <body>
          <p>姓名:<input type="text" id="uname">
          <button id="btnPost">提交</button></p>
          <div id="show"></div>
      </body>
      </html>
      

03-register.html的代码 修改,点击注册的时候如果用户不存在则添加到数据库,并将失去焦点封装为函数,

@app.route("/03-checkuname")
def checkuname():
    uname = request.args['uname']
    user = User.query.filter_by(uname=uname).first()
    if user:
    	#修改return返回值。
        # 1表示用户存在
        return "1"
    else:
        # 0表示用户通过
        return "0"


@app.route("/03-reg",methods=['POST'])
def reg():
    uname = request.form['uname']
    upwd = request.form['upwd']
    uemail = request.form['uemail']

    user = User()
    user.uname = uname
    user.upwd = upwd
    user.uemail = uemail
    try:
        db.session.add(user)
        db.session.commit()
        return "成功"
    except:
        return "失败"

03-register.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="/static/js/common.js"></script>
    <script src="/static/js/jquery-1.11.3.js"></script>
    <script>
        {#检查用户名称是否存在,并将提示是信息显示在span上,#}
        {#return 返回用户名称是否存在的结果,true表示名称已经存在,False表示不存在#}
        function checkuname() {
            var ret = false;
            var xhr = createXhr();
            var url = "/03-checkuname?uname="+$("#uname").val();
            xhr.open("get",url,false);
            xhr.onreadystatechange = function() {
                if (xhr.readyState == 4 && xhr.status == 200) {
                    if (xhr.responseText == "1") {
                        $("#uname-tip").html("用户名称已存在");
                        ret = true;
                    } else{
                        $("#uname-tip").html("用户名可以使用");
                        {#ret = false;#}
                        }
                    }
                };
                xhr.send(null);
                return ret;
        }
        $(function () {
            {#为#uname绑定失去焦点事件#}
            $("#uname").blur(function () {
                checkuname();
            });

            $("#btnReg").click(function () {
                {#判断用户是否存在#}
                if (checkuname()) {
                    alert("用户名称已存在")
                } else{
                    alert("可以注册");
                    var xhr = createXhr();
                    var url = "/03-reg";
                    xhr.open("post",url,true);
                    xhr.onreadystatechange = function () {
                        if (xhr.readyState == 4 && xhr.status == 200) {
                            alert(xhr.responseText)
                        }
                    };
                    xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
                    var uname = $("#uname").val();
                    var upwd = $("#upwd").val();
                    var uemail = $("#uemail").val();
                    var params = "uname="+uname+"&upwd="+upwd+"&uemail="+uemail;
                    xhr.send(params);
                }
            });
        })
    </script>
</head>
<body>
    <p>用户名:  <input type="text" id="uname">
                <span id="uname-tip"></span>
    </p>
    <p>密码:<input type="password" id="upwd"></p>
    <p>邮箱:<input type="email" id="uemail"></p>
    <p><input type="button" id="btnReg" value="注册"></p>
</body>
</html>

JSON

  1. JSO
    JavaScript Object
    JS对象的表示方式:

     	1. 使用		{}	表示一个对象
     	2. 在	{}		中,使用key:value的格式来表示 数据 
     	3. 如果value是字符串的话需要用引号。
    
  2. JSON

    1. 什么是JSON
      JavaScript Object Notation
      采用JS对象发的格式所描述出来的字符
    2. JSON表现
      1. JSON表示单个对象

         1. 使用		{}	表示一个对象
         2. 在	{}		中,使用key:value的格式来表示 数据 
         3. 如果value是字符串的话需要用引号。
         4. key必须用""
         5. value如果是字符串的话,必须用""
        
      2. JSON表示一个数组

         1. 使用 [ ]  来表示一个数组
         2. 数组中允许包含若干对象		或		字符串
         var arr = '["小红","小明","小李"]'
         var  arr = '[{"uname":"小红","age":18},{"uname":"小明","age":20}]'
        
    3. JSON串转换为JS对象
      var JS对象 = JSON.parse(JSON串)
    4. Python中JSON的处理
      1. 将对象转换成JSON串
        1. 元组,列表,字典 是可以转换为JSON串的
        2. 元组,列表,字符串必须是
          1. 字符串,数字
          2. 元组,列表,字典
      2. 转换成JSON串
        import json
        json.dumps(元组 | 字典 | 列表)
        return jsonStr
      @app.route("/04-users")
      def users():
          return render_template("04-user.html")
      
      @app.route("/04-server")
      def server04():
          # 查询users信息
          users = User.query.all()
          # 将users信息转换成字典,保存进列表
          list = []
          for u in users:
              list.append(u.to_dict())
          # 列表响应
          return json.dumps(list)
      
      04-user.htm
      <!DOCTYPE html>
      <html lang="en">
      <head>
          <meta charset="UTF-8">
          <title>Title</title>
          <script src="/static/js/common.js"></script>
          <script src="/static/js/jquery-1.11.3.js"></script>
          <script>
              $(function () {
                  $("#btnShow").click(function () {
                      var xhr = createXhr();
                      xhr.open("get","/04-server",true);
                      xhr.onreadystatechange = function() {
                          if (xhr.readyState == 4 && xhr.status == 200) {
                              {#将responText转换为JSON数组#}
                              var users = JSON.parse(xhr.responseText);
                              {#解析数组拼tr,td显示到contenth中#}
                              var html = "";
                              for (var i=0;i<users.length;i++) {
                                  html += "<tr>";
                                  html += "<td>"+users[i].uname+"</td>";
                                  html += "<td>"+users[i].upwd+"</td>";
                                  html += "<td>"+users[i].uemail+"</td>";
                                  html += "</tr>";
      
                              }
                              $("#content").html(html)
                          }
                      };
                      xhr.send(null)
      
                  })
              })
          </script>
      </head>
      <body>
          <button id="btnShow">显示</button>
          <table border="1" width="300">
              <tr>
                  <th>用户名</th>
                  <th>密码</th>
                  <th>邮箱</th>
              </tr>
              <tbody id="content"></tbody>
          </table>
      </body>
      </html>
      
  3. jq 对 ajax 的支持

    1. $obj.load(url,data,callback);
      $obj:通过jq选择器获取到的页面元素
      URL:请求地址
      data:发送到服务器端的参数数据
      callback:请求成功时的回调

      @app.route("/05-load")
      def load_biews():
          return render_template("05-load.html")
      

      05-load.html

      <!DOCTYPE html>
      <html lang="en">
      <head>
          <meta charset="UTF-8">
          <title>Title</title>
          <script src="/static/js/jquery-1.11.3.js"></script>
          <script>
              $(function () {
                  $("#btnLoad").click(function () {
                      $("#show").load("/04-users")
                  })
              })
          </script>
      </head>
      <body>
          <button id="btnLoad">load()</button>
          <h2>使用load()加载/04-users到当页面</h2>
          <div id="show"></div>
      </body>
      </html>
      
    2. $.get(url,data,callback,type)

      @app.route("/06-jq-get")
      def jq_get():
          return render_template("06-jq-get.html")
      
      @app.route("/06-server")
      def server06():
          # 方式1 的处理
          # return "使用$.get()发送的get请求"
      
          # 方式2的处理
          # uname = request.args['uname']
          # uage = request.args['uage']
          # return f"姓名:{uname},年龄:{uage}"
      
          # 方式3:返回JSON的格式
          list = [
              {
                  "uname": "小明",
                  "uage": 20,
              },
              {
                  "uname": "嫦娥",
                  "uage": 25
              },
              {
                  "uname": "刘姥姥",
                  "uage": 88
              },
          ]
          return json.dumps(list)
      

      06-jq-get.html

      <!DOCTYPE html>
      <html lang="en">
      <head>
          <meta charset="UTF-8">
          <title>Title</title>
          <script src="/static/js/jquery-1.11.3.js"></script>
          <script>
              $(function () {
                  $("#btnGet").click(function () {
                      {#$.get("/06-server",function (data) {#}
                          {#data表示服务器端响应回来的数据#}
                      {#    $("#show").html(data);#}
                      {#  })     #}
      
                      {#方式2:有请求参数的处理#}
                      {#向/06-server发送请求并传递两个参数的服务器#}
                      {#参数1:uname = TeacherQi#}
                      {#参数2:uage = 26#}
                      /**var params = "uname=TeacherQi&uage=26";
      
                      $.get("/06-server",params,function (data) {
                          $("#show").html(data);
                      });
                      **/
                      {#方式3:响应过来的数据是JSON的#}
                      $.get("/06-server",function (data) {
                          for (var i=0;i<data.length;i++) {
                              console.log("姓名:"+data[i].uname+",年龄"+data[i].uage)
                          }
                      },"json")
                  })
              })
          </script>
      </head>
      <body>
          <button id="btnGet">发送get请求</button>
          <div id="show"></div>
      </body>
      </html>
      
    3. $.ajax()

      语法:$.ajax({请求设置对象})
      请求设置对象中的属性:

       1. url:字符串,表示异步请求的地址。
       2. type:字符串,表示请求方式  取值为  get   post  
       3. data: 表示传递到服务器端的参数
       	1. 字符串:"key=value&key=value"
       	2. JS对象:{key:"value",key:"value"}
       4. async:是否使用异步方式进行请求,
       	true:使用异步
       	false:使用同步
       5. dataType:字符串。表示响应回来的数据的格式
       	1. "html"
       	2. "text"
       	3. "xml"
       	4. "json"
       	5. "script"
       	6. "jsonp"
       6. success:请求成功是的回调函数
       	success:function(data) {
       		data表示的是请求成功后的响应数据
       	}
       7. error:请求失败是的回调函数
       8. beforeSend:发送请求之前的回调函数,
       	返回true:则正常发送AJAX请求
       	返回false:则终止本次请求的发送
      
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值