• Ajax第三篇:基础应用案例


    第一章:浏览器端使用模板引擎

    在浏览器中使用art-template模板引擎

    1. 先去官网下载template-web.js。官网
    2. 使用script标签定义模块,设置type属性为text/html,并设置id
    3. 在script标签中使用art-template模板引擎语法
    4. 调用template方法传入模板标识和数据,产生关联,返回关联后的结果
    5. 将模板引擎生产后的结果写入页面中

    代码演示

      <div id="box"></div>
      <!-- 导入template-web.js文件 -->
      <script src="./template-web.js"></script>
      <!-- 定义模板 -->
      <script type="text/html" id="test">
        <h1>{{title}}</h1>
        <ol>
          {{each list}}
          <li>{{$value}}</li>
          {{/each}}
        </ol>
      </script>
      <!-- 使用模板引擎 -->
      <script>
        // 定义数据
        var data = { title: '模板引擎的使用', list: [
          '先去官网下载template-web.js', 
          '使用script标签定义模块,设置type属性为text/html,并设置id', 
          '在script标签中使用art-template模板引擎语法', 
          '调用template方法传入模板标识和数据,产生关联,返回关联后的结果', 
          '将模板引擎生产后的结果写入页面中'] 
        }
        // 调用模板引擎方法
        var str = template('test', data);
        // 把结果追加到页面id为box的div中
        box.innerHTML = str;
    
      </script>
    

    第二章:Ajax案例练习

    2.1-账号唯一验证

    效果

    • 在文本框中输入账号
    • 先验证格式是否符合邮箱格式
    • 若不符合,则提示“格式不正确”
    • 若符合,则向服务端发送请求验证是否存在
      • 返回1:不存在,可以注册
      • 返回0:存在,不可以注册

    后端接口程序

    const express = require('express')
    const path = require('path')
    
    const app = express();
    app.use(express.static(path.join(__dirname,'/public')))
    // 模拟验证
    app.get('/checkemail', (req, res) => {
      if (req.query.email == 'admin@blog.cn') {
        res.send('0')
      } else {
        res.send('1')
      }
    })
    
    
    app.listen(80, "localhost")
    

    前端页面程序

      <input type="text" id="email">
      <span id="message"></span>
      <script src="./myajax.js"></script>
      <script>
        email.onblur = function() {
          var val = this.value;
          var reg = /^w+@w+.w+$/;
          if(reg.test(val)) {
            ajax({
              url:'http://localhost/checkemail',
              data: {
                email: val
              },
              success:function(data){
                console.log(data)
                if(data==1) {
                  message.style.color = 'green';
                  message.innerText = '可以注册'
                }else {
                  message.style.color = 'red';
                  message.innerText = '该账号已经存在'
                }
              }
            })
          }else {
            message.style.color = 'red';
            message.innerText = '邮箱格式不正确';
          }
        }
      </script>
    

    2.2-搜索框智能提示

    效果

    • 输入关键词
    • 输入的过程中,800毫秒后,请求服务端,获取相关的热词
    • 获取热词列表后,动态生成列表,显示在网页中

    后端接口程序

    const express = require('express')
    const path = require('path')
    
    const app = express();
    app.use(express.static(path.join(__dirname,'/public')))
    // 模拟热词接口
    app.get('/words', (req, res) => {
      var word = req.query.word;
      var data = ['开发网站', '生命不息', '开发周期', '狗的生命', '软件开发', '狗子', '开发程序', '狗的毛色', '狗肉', '卖狗犯法吗', '生命周期'];
      var result = data.filter(val => val.indexOf(word) != -1)
      res.send(result)
    })
    
    
    app.listen(80, "localhost")
    

    前端页面程序

      <div class="box">
        <input type="text" id="content">
        <ul id="ul">
        </ul>
        <script src="./myajax.js"></script>
        <script src="./template-web.js"></script>
        <!-- 列表模板 -->
        <script type="text/html" id="words">
          {{each list}}
          <li>{{$value}}</li>
          {{/each}}
        </script>
        <script>
          var timer = null;
          content.oninput = function () {
            clearTimeout(timer)
            var word = this.value;
            if (word.trim().length == 0) return ul.style.display = 'none'
            timer = setTimeout(function () {
              ajax({
                url: 'http://localhost/words',
                data: { word: word },
                success: function (data) {
                  var html = template('words', { list: JSON.parse(data) })
                  ul.style.display = 'block'
                  ul.innerHTML = html;
                }
              })
            }, 800)
          }
        </script>
    

    第三章:FormData对象

    3.1-概述

    FormData对象的作用:

    • 模拟HTML表单,相当于将HTML表单映射成表单对象,自动将表单对象中的数据拼接成请求参数的格式。
    • 异步上传二进制文件

    注意事项:

    1. Formdata 对象不能用于 get 请求,因为对象需要被传递到 send 方法中,而 get 请求方式的请求参数只能放在请求地址的后面。
    2. 服务器端 bodyParser 模块不能解析 formData 对象表单数据,我们需要使用 formidable 模块进行解析。

    3.2-FormData对象基本使用

    服务端程序接口

    const express = require('express')
    var formidable = require('formidable')
    
    
    const app = express();
    app.use(express.static(path.join(__dirname,'/public')))
    
    app.post('/login', (req, res) => {
      var form = new formidable.IncomingForm();
      form.parse(req, (err, fields, files) => {
        res.send(fields);
      })
      
    })
    
    app.listen(80, "localhost")
    

    前端页面程序

      <form id="login">
        <p>账号:<input type="text" name="username"></p>
        <p>密码:<input type="password" name="pwd"></p>
      </form>
      <button id="btn">提交</button>
      <script>
        var form = document.querySelector('#login')
        var btn = document.querySelector('#btn')
    
        btn.onclick = function () {
          var xhr = new XMLHttpRequest();
          xhr.open('post', 'http://localhost/login');
          // 创建FormData对象,可传入表单元素对象
          var formData = new FormData(login)
          // 发送请求,并传入FormData对象实例
          xhr.send(formData)
          xhr.onload = function () {
            console.log(xhr.responseText)
          }
        }
      </script>
    

    3.3-FormData实例常用方法

    方法

    1. formData.get('key'); 获取表单对象中属性的值
    2. formData.set('key', 'value'); 设置表单对象中属性的值
    3. formData.delete('key'); 删除表单对象中属性的值
    4. formData.append('key', 'value'); 向表单对象中追加属性值

    注意:set 方法与 append 方法的区别是,在属性名已存在的情况下,set 会覆盖已有键名的值,append会保留两个值。

    代码

      <form id="login">
        <p>账号:<input type="text" name="username"></p>
        <p>密码:<input type="password" name="pwd"></p>
      </form>
      <button id="btn">提交</button>
      <script>
        var form = document.querySelector('#login')
        var btn = document.querySelector('#btn')
    
        btn.onclick = function () {
          var xhr = new XMLHttpRequest();
          xhr.open('post', 'http://localhost/login');
          // 创建FormData对象,可传入表单元素对象
          var formData = new FormData(login)
          // 添加其他字段
          formData.set('age','10');
          // 删除其他字段
          formData.delete('pwd');
          // 发送请求,并传入FormData对象实例
          xhr.send(formData)
          xhr.onload = function () {
            console.log(xhr.responseText)
          }
        }
      </script>
    

    3.4-文件上传及上传进度

    案例效果

    后端接口程序代码

    const express = require('express')
    const path = require('path')
    var formidable = require('formidable')
    
    
    const app = express();
    app.use(express.static(path.join(__dirname, '/public')))
    
    app.post('/upload', (req, res) => {
      var form = new formidable.IncomingForm();
      // 设置文件上传路径
      form.uploadDir = path.join(__dirname, './public/uploads')
      // 保留上传文件的后缀名
      form.keepExtensions = true;
      // 设置文件上传的大小限制
      form.maxFileSize = 6 * 1024 * 1024 * 1024;
      // 解析表单数据
      form.parse(req, (err, fields, files) => {
        // 文件名路径
        const uploadUrl = files.fName.path.split('public\')[1];
        // 返回上传后的文件路径,实现预览
        res.send(uploadUrl);
      })
      
    })
    
    
    app.listen(80, "localhost")
    

    前端页面程序

      <input type="file" id="photos" >
      <div style=" 500px; display: inline-block;">
        上传进度:
        <div id="processDom" style="height: 5px; background: deepskyblue;  0%;"></div>
      </div>
      <strong id="processNum"></strong>
      <!-- 预览图片 -->
      <div id="open_photo"></div>
    
      <script>
        photos.onchange = function() {
          // 创建FormData对象
          var formdata = new FormData();
          // 二进制文件添加到表单对象中
          formdata.append('fName',this.files[0])
          
          var xhr = new XMLHttpRequest();
          xhr.open('post','http://localhost/upload')
          // 监听上传进度-xhr.upload.onprogress事件
          xhr.upload.onprogress = function(ev) {
            // loaded已经上传的大小,total总大小
            var goNum = (ev.loaded/ev.total)*100;
            processDom.style.width = goNum + '%';
            processNum.innerText = parseInt(goNum) + '%';
          }
          // 发送请求
          xhr.send(formdata);
          xhr.onload = function() {
            console.log(xhr.responseText)
            var img = document.createElement('img');
            img.style.width = '100px';
            img.src = xhr.responseText;
            open_photo.appendChild(img);
          }
          
          
        }
      </script>
    
  • 相关阅读:
    js的解构
    Go函数
    文件 & IO 操作
    并发编程 & 网络编程
    结构体 & 方法
    Go基础
    go 包
    接口
    JAVA周报4
    JAVA周报6
  • 原文地址:https://www.cnblogs.com/lpl666/p/12873336.html
Copyright © 2020-2023  润新知