• Ajax第五篇:JQuery中使用Ajax


    第一章:常用API

    1.1-ajax方法使用格式

    $.ajax({
        	// 请求地址
            url: 'http://localhost/find',  
        	// 请求方式
            type: 'POST',
            // 一对“文件名-文件值”在本机设置XHR对象。例如,如果需要的话,你可以用它来设置withCredentials为true的跨域请求。
            xhrFields: {widthCredentials:true},
            // 请求发送之前的处理函数
            beforeSend: function(){},
        	// 响应成功后的处理函数
            success: function(response){},
        	// 异常处理函数
            error: function(ex){},
            // 请求参数 可以是“key=value&key=value”、{key:value,key:value}、FormData对象
            data: formData,
            // 是否缓存
            cache: false,
        	// 发送给服务器的编码类型,默认application/x-www-form-urlencoded
            contentType: 'application/x-www-form-urlencoded',
        	// JSONP跨域
        	dataType: 'JSONP',
        	// (默认: true) 默认情况下,通过data选项传递进来的数据,如果是一个对象(技术上讲只要不是字符串),都会处理转化成一个查询字符串,以配合默认内容类型 "application/x-www-form-urlencoded"。如果要发送 DOM 树信息或其它不希望转换的信息,请设置为 false。
            processData: false
        });
    

    1.2-get和post方法

    作用:$.get方法用于发送get请求,$.post方法用于发送post请求。

    $.get('http://www.example.com', {name: 'zhangsan', age: 30}, function (response) {}) $.post('http://www.example.com', {name: 'lisi', age: 22}, function (response) {})
    
    

    1.2-案例-登录

    服务端程序

    const express = require('express')
    const path = require('path')
    const bodyParser = require('body-parser')
    
    const app = express();
    
    app.use(express.static(path.join(__dirname, './public')))
    app.use(bodyParser.urlencoded({ extend: false }))
    
    // 登录接口
    app.post('/login', (req, res) => {
      const user = req.body;
      if (user.name == 'admin' && user.pwd == '111') {
        res.send('登录成功')
      } else {
        res.send('账号或密码错误')
      }
    })
    
    
    app.listen(80, "localhost")
    

    前端程序

      <p>账号:<input type="text" id="userDom"></p>
      <p>密码:<input type="password" id="pwdDom"></p>
      <p><button id="btn">登录</button></p>
      <script src="./lib/jquery.js"></script>
      <script>
        btn.onclick = function() {
          $.ajax({
            type: 'post',
            url: 'login',
            data: {name:userDom.value, pwd:pwdDom.value},
            success:function(response){
              alert(response)
            },
            error: function(e) {
              console.log(e)
            }
          })
        }
      </script>
    

    1.3-案例-账号唯一验证

    服务端程序

    const express = require('express')
    const path = require('path')
    
    const app = express();
    
    app.use(express.static(path.join(__dirname, './public')))
    
    // 账号唯一验证接口
    app.get('/check', (req, res) => {
      if (req.query.user=='admin') {
        res.send('该用户名已经存在,请更换')
      } else {
        res.send('可以使用')
      }
    })
    
    app.listen(80, "localhost")
    

    前端程序

      <p>账号:<input type="text" id="userDom"></p>
      <script src="./lib/jquery.js"></script>
      <script>
        userDom.onblur = function() {
          $.ajax({
            url: 'check',
            data: {user:userDom.value},
            success:function(response){
              console.log(response)
            },
            error: function(e) {
              console.log(e)
            }
          })
        }
      </script>
    

    1.4-案例-文件上传

    后端程序

    const express = require('express')
    const path = require('path')
    
    const app = express();
    const formidable = require('formidable')
    
    app.use(express.static(path.join(__dirname, './public')))
    
    // 文件上传接口
    app.post('/upload', (req, res) => {
      // 创建formidable对象
      const form = new formidable.IncomingForm();
      // 保留上传文件的后缀名
      form.keepExtensions = true;
      // 设置上传文件大小最大限制
      form.maxFileSize = 2 * 1024 * 1024 * 1024;
      // 设置文件保存路径
      form.uploadDir = path.join(__dirname, './public/upload');
      // 解析表单
      form.parse(req, (err, fields, files) => {
        res.send(files.photo.path.split('public\')[1])
      })
    })
    
    app.listen(80, "localhost")
    

    前端程序

      <input type="file" id="photos"><br>
      <div style=" 500px; border:1px solid #ccc; height: 5px; border-radius: 5px;display: inline-block;">
        <!-- 上传进度条 -->
        <div id="processDom" style="margin: 0;  0%; background: deepskyblue; height: 100%; border-radius: 5px;"></div>
      </div>上传进度<strong id="processNum">0%</strong>
      <p id="preview">
       
      </p>
      <script src="./lib/jquery.js"></script>
      <script>
        photos.onchange = function () {
          console.log(photos.files)
          if (photos.files.length != 0) {
            // 创建FormData对象
            var fromData = new FormData();
            // 将文件数据追加表单中
            fromData.append('photo', photos.files[0])
            // 发送ajax请求
            $.ajax({
              type: 'post',
              url: 'upload',
              contentType: false,   // 不设置内容类型
              processData: false,   // 不序列化参数
              xhr: function () {
                // 获取原生的XMLHttpRequest对象
                var xhr = $.ajaxSettings.xhr()
                if (xhr.upload) {
                  xhr.upload.addEventListener("progress", function (e) {
                    // 计算上传进度百分比
                    var num = (e.loaded / e.total) * 100;
                    // 设置进度条
                    processDom.style.width = num + '%';
                    // 更新进度数值
                    processNum.innerText = parseInt(num) + '%'
    
                  })
                }
                return xhr; // 一定要返回
              },
              data: fromData,
              success: function (response) {
                var img = document.createElement('img');
                img.src = response;
                img.style.width="100px";
                preview.append(img)
              },
              error: function (e) {
                console.log(e)
              }
            })
          }
        }
      </script>
    

    第二章:全局方法

    2.1-ajax相关全局事件

    概述

    只要页面中有Ajax请求被发送,对应的全局事件就会被触发

    • ajaxStart(callback) 当请求开始发送时触发
    • ajaxComplete(callback) AJAX 请求完成时执行函数。Ajax 事件。

    对于ajax相关的全局事件,事件源设置给document

    第三方插件介绍:NProgress纳米进度条

    • NProgress.start(); // 进度条开始运动
    • NProgress.done(); // 进度条结束运动

    代码演示

      <p>账号:<input type="text" id="userDom"></p>
      <p>密码:<input type="password" id="pwdDom"></p>
      <p><button id="btn">登录</button></p>
      <link rel="stylesheet" href="./lib/nprogress.css">
      <script src="./lib/jquery.js"></script>
      <script src="./lib/nprogress.js"></script>
      <script>
        btn.onclick = function () {
          $.ajax({
            type: 'post',
            url: 'login',
            data: { name: userDom.value, pwd: pwdDom.value },
            success: function (response) {
              console.log(response)
            },
            error: function (e) {
              console.log(e)
            }
          })
        }
        // ajax开始发送请求
        $(document).on('ajaxStart', function () {
          console.log('开始')
          NProgress.start();
        })
        // ajax响应完毕
        $(document).on('ajaxComplete', function () {
          NProgress.done();
          console.log('结束')
        })
      </script>
    

    2.2-表单序列化方法

    • serialize() 序列表表格内容为字符串,用于 Ajax 请求。
      • 格式:name=value&navme=value
    • serializeArray() 序列化表格元素 (类似 '.serialize()' 方法) 返回 JSON 数据结构数据。
      • 格式:[{name: 'firstname', value: 'Hello'}]
      <form id="info">
        <p>用户名:<input type="text" name="username"></p>
        <p>密码:<input type="password" name="pwd"></p>
        <p>验证码:<input type="text" name="code"></p>
      </form>
      <button id="btn">注册</button>
      <script src="./lib/jquery.js"></script>
      <script>
        btn.onclick= function(){
          console.log($('#info').serialize())
          // username=admin&pwd=123456&code=00Cn2f
    
          var arr = $('#info').serializeArray();
          console.log(arr)
          // [{name:'username',value:'admin'}, {…}, {…}]
    
          // 将[{name:'username',value:'admin'}, {…}, {…}]转换为 {key:value,key:value}
          var obj = {};
          for(var i = 0; i < arr.length; i++) {
            var item = arr[i];
            obj[item.name] = item.value;
    
          }
          console.log(obj)
          // {username: "admin", pwd: "123456", code: "00Cn2f"}
        }
      </script>
    

    第三章:RESTful API

    要弄清楚什么是RESTful API,首先要知道REST是什么。

    REST,表示性状态转移(representation state transfer)。简单来说,就是用URI表示资源,用HTTP方法(GET, POST, PUT, DELETE)表征对这些资源的操作。

    • Resource: 资源,即数据,存在互联网上的可被访问的实体
    • Representation: 数据的某种表现形式,如HTML, JSON。
    • State Transfer:状态变化,HTTP方法实现

    RESTful API 就是REST风格的API。现在终端平台多样,移动、平板、PC等许多媒介向服务端发送请求后,如果不适用RESTful API,需要为每个平台的数据请求定义相应的返回格式,以适应前端显示。但是RESTful API 要求前端以一种预定义的语法格式发送请求,那么服务端就只需要定义一个统一的响应接口,不必像之前那样解析各色各式的请求。

    RESTful 是典型的基于HTTP的协议。它有哪些设计原则和规范呢?

    1. 资源。首先要明确资源就是网络上的一个实体,可以是文本、图片、音频、视频。资源总是以一定的格式来表现自己。文本用txt、html;图片用JPG、JPEG等等。而JSON是RESTful API中最常用的资源表现格式。

    2. 统一接口。对于业务数据的CRUD,RESTful 用HTTP方法与之对应。

    1. URI。统一资源标识符,它可以唯一标识一个资源。注意到,URL(统一资源定位符)是一种URI,因为它可以唯一标志资源。但URL != URI。应该说URL 是URI的子集。因为URL使用路径来唯一标识资源,这只是唯一标识资源的一种方式。还可以用一个唯一编号来标识资源,如example.html.fuce2da23。只不过这种方式并不被广泛使用。总之,要在概念上对URL和URI有所区分。

    2. 无状态。 所谓无状态是指所有资源都可以用URI定位,而且这个定位与其他资源无关,不会因为其他资源的变动而变化。这里引入一个幂等性的概念:无论一个操作被执行一次还是多次,执行后的效果都相同。比如对某资源发送GET请求,如果访问一次和访问十次获得的数据一样,那么就说这个请求具有幂等性。

    3. URL中只能有名词,不能出现动词。这是因为在REST要求对资源的操作由HTTP 方法给出,而方法是由HTTP 请求报文头部给出的,自然不需要在URL中暴露操作方式。

    还有一些属于业务决定型规则,比如应该将版本加到URL中,对返回记录进行限制过滤。不是强制的,但是比较建议这么做。

    代码演示

    后端程序

    const express = require('express')
    const path = require('path')
    const bodyParser = require('body-parser')
    
    const app = express();
    
    app.use(express.static(path.join(__dirname, './public')))
    app.use(bodyParser.urlencoded({ extend: false }))
    
    // http://localhost/user
    app.get('/user', (req, res) => {
      res.send('get-查找所有用户')
    })
    // http://localhost/user/1
    app.get('/user/:id', (req, res) => {
      res.send(`get-查找id为${req.params.id}用户`)
    })
    // http://localhost/user
    app.post('/user', (req, res) => {
      res.send(`post-添加用户`)
    })
    // http://localhost/user/1
    app.delete('/user/:id', (req, res) => {
      res.send(`delete-删除id为${req.params.id}用户`)
    })
    // http://localhost/user/1
    app.put('/user/:id', (req, res) => {
      res.send(`put-修改id为${req.params.id}用户`)
    })
    
    app.listen(80, "localhost")
    

    前端程序

      <button id="btn1">get1</button>
      <button id="btn2">get2</button>
      <button id="btn3">post</button>
      <button id="btn4">delete</button>
      <button id="btn5">put</button>
      <script src="./jquery.js"></script>
      <script>
        // 查找所有用户
        btn1.onclick = function () {
          $.ajax({
            url: 'http://localhost/user',
            type: 'get',
            success: function (response) {
              console.log(response)
            }
          })
        }
        // 查找id为1用户
        btn2.onclick = function () {
          $.ajax({
            url: 'http://localhost/user/1',
            type: 'get',
            success: function (response) {
              console.log(response)
            }
          })
        }
        // 添加用户
        btn3.onclick = function () {
          $.ajax({
            url: 'http://localhost/user',
            type: 'post',
            success: function (response) {
              console.log(response)
            }
          })
        }
        // 删除id为2的用户
        btn4.onclick = function () {
          $.ajax({
            url: 'http://localhost/user/2',
            type: 'delete',
            success: function (response) {
              console.log(response)
            }
          })
        }
        // 修改id为1的用户
        btn5.onclick = function () {
          $.ajax({
            url: 'http://localhost/user/1',
            type: 'put',
            success: function (response) {
              console.log(response)
            }
          })
        }
    
      </script>
    
  • 相关阅读:
    经典音乐插曲推荐![附地址]
    广播电台常用51首背景音乐——绝对经典
    酒吧..夜店常用歌曲~潮人必备音乐噢~【附下载地址】
    ASP与ASP.NET互通COOKIES的一点经验
    linux进程状态浅析
    常用的酒吧经典乐曲106首
    呼和浩特电视台媒资管理系统的设计与分析
    不再为DataGrid生成的表格的单无格中的内容过长、自动折行、表格撑开等问题而烦恼
    Linux shell脚本全面学习
    ASP.NET文件管理显示信息
  • 原文地址:https://www.cnblogs.com/lpl666/p/12873380.html
Copyright © 2020-2023  润新知