zoukankan      html  css  js  c++  java
  • ajax_封装函数_升级_传递多个参数和传递一个参数

    HTML:
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
        <meta charset="UTF-8">
        <title>title</title>
    </head>
    <body>
      <h2>测试工具函数</h2>
      <input class='get' type="button" value='测试get'>
      <input class='post' type="button" value='测试post'>
      <input class='ajax_test' type="button" value='测试ajax_test'>
      <input class='ajax' type="button" value='测试ajax'>
      <input class='json' type="button" value='获取json'>
      <input class='xml' type="button" value='获取xml'>
    </body>
    </html>
    <!-- 导入 js   -->
    <script  src="./ajax.js"></script>
    <!-- 自己的js  -->
    <script>
      // get请求
      document.querySelector('.get').onclick = function(){
        // 直接调用 get方法
        //function get(url, data, success)
        get('../00.backData/01.backSendData.php','name=jack&friend=rose',function(data){
          console.log(data);
        })
      }
    
      // post请求
      document.querySelector('.post').onclick = function(){
        // 直接调用 get方法
        //function post(url, data, success)
        post('../00.backData/01.backSendData.php','name=rose&friend=青椒',function(data){
          alert(data);
        })
      }
    
      // ajax 自选get post
      document.querySelector('.ajax_test').onclick = function(){
        // ajax_test('../00.backData/01.backSendData.php','get','name=葫芦娃&food=胡萝卜',function(data){
        //   alert('葫芦娃');
        //   alert(data);
        // })
        ajax_test('../00.backData/01.backSendData.php','post','name=蛇精&food=爷爷',function(data){
          alert('蛇精');
          alert(data);
        })
      }
    
      // ajax 只传递一个参数
      document.querySelector('.ajax').onclick = function(){
        ajax({
          type:'get',
          data:'skill=爱吃西兰花和芹菜蹦蹦跳跳好可爱&name=兔子',
          success:function(data){
            document.body.innerHTML = data;
          },
          url:'../00.backData/01.backSendData.php'
        });
      }
    
      // 获取json
      document.querySelector('.json').onclick = function(){
        ajax({
          type:'get',
          url:'../00.backData/backJSON.php',
          success:function(data){
            console.log(data);
          }
        })
      }
    
      // 获取 xml
        document.querySelector('.xml').onclick = function(){
        ajax({
          type:'post',
          url:'../00.backData/backXML.php',
          success:function(data){
            console.log(data);
          }
        })
      }
    </script>

     JS封装:

    /**
     * ajax工具函数-get
     * @param {*} url 
     * @param {*} data(key1=value1&key2=value2) 
     * @param {*} success 
     */
    function get(url, data, success) {
      var xhr = new XMLHttpRequest();
      if (data) {
        url += '?';
        url += data;
      }
      xhr.open('get', url);
      xhr.onreadystatechange = function () {
        if (xhr.readyState == 4 && xhr.status == 200) {
          success(xhr.responseText);
        }
      }
      xhr.send(null);
    }
    
    /**
     * ajax工具函数-post
     * @param {*} url 
     * @param {*} data (key1=value1&key2=value2) 
     * @param {*} success 
     */
    function post(url, data, success) {
      var xhr = new XMLHttpRequest();
      xhr.open('post', url);
      if (data) {
        xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
      }
      xhr.onreadystatechange = function () {
        if (xhr.readyState == 4 && xhr.status == 200) {
          console.log(xhr.responseText);
          success(xhr.responseText);
        }
      }
      xhr.send(data);
    }
    
    /**
     * 参数越来越多之后 用户如果要传递参数 必须遵循
     * @param {*} url 
     * @param {*} type 
     * @param {*} data 
     * @param {*} success 
     */
    function ajax_test(url, type, data, success) {
      var xhr = new XMLHttpRequest();
      // 如果是get 并且有数据
      if (type == 'get' && data) {
        url += '?';
        url += data;
        data = null; // 这样最后直接send data即可 
      }
      xhr.open(type, url);
      // post请求 并且有数据
      if (type == 'post' && data) {
        xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
      }
      xhr.onreadystatechange = function () {
        if (xhr.readyState == 4 && xhr.status == 200) {
          success(xhr.responseText);
        }
      }
      xhr.send(data);
    }
    
    // 只传递一个参数
    // 用户传入的是 对象
    /*
      键名
        url
        type
        data
        success
      用户不需要记忆 参数的顺序 只需要记忆 参数的属性名即可
      大部分的框架 都是这么做的
    */
    function ajax(option) {
      var xhr = new XMLHttpRequest();
      // 如果是get 并且有数据
      if (option.type == 'get' && option.data) {
        option.url += '?';
        option.url += option.data;
        option.data = null; // 这样最后直接send data即可 
      }
      xhr.open(option.type, option.url);
      // post请求 并且有数据
      if (option.type == 'post' && option.data) {
        xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
      }
      xhr.onreadystatechange = function () {
        if (xhr.readyState == 4 && xhr.status == 200) {
          // option.success(xhr.responseText);
          // console.log(xhr.getResponseHeader('Content-Type'));
          var type = xhr.getResponseHeader('Content-Type');
          // 是否为json
          if (type.indexOf('json') != -1) {
            option.success(JSON.parse(xhr.responseText));
          }
          // 是否为xml
          else if (type.indexOf('xml') != -1) {
            option.success(xhr.responseXML);
          }
          // 普通字符串
          else {
            option.success(xhr.responseText);
          }
        }
      }
      xhr.send(option.data);
    }
    
    
    /*
      总结
        封装的目的
          让我们把精力集中在逻辑
          页面的交互效果
          基础的部分不用每次都来一遍
        封装的步骤
          固定的部分 抽取
          不固定的部分 作为参数
          参数很多==>
            使用对象 来优化
        封装的好坏
          功能能否正常执行
          代码的简洁程度(可读性)
          考虑的问题是否足够多,兼容性问题,异常处理
    */
  • 相关阅读:
    DataItem,gridview,repeater数据控件数据绑定
    repeater没有数据显示暂无数据,无记录
    Javascript操作Cookie的脚本 — CookieHelper
    <script>标签应该放到</body>标签之前
    IEnumerable 和 IQueryable 区别
    【three.js练习程序】鼠标滚轮缩放
    【three.js练习程序】动画效果,100个方块随机运动
    【three.js练习程序】随机生成100个方块
    树莓派练习程序(寻迹模块)
    树莓派练习程序(声音检测)
  • 原文地址:https://www.cnblogs.com/qtbb/p/11875826.html
Copyright © 2011-2022 走看看