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);
}

/*
  总结
    封装的目的
      让我们把精力集中在逻辑
      页面的交互效果
      基础的部分不用每次都来一遍
    封装的步骤
      固定的部分 抽取
      不固定的部分 作为参数
      参数很多==>
        使用对象 来优化
    封装的好坏
      功能能否正常执行
      代码的简洁程度(可读性)
      考虑的问题是否足够多,兼容性问题,异常处理
*/

原文地址:https://www.cnblogs.com/qtbb/p/11875826.html

时间: 2024-10-02 06:37:57

ajax_封装函数_升级_传递多个参数和传递一个参数的相关文章

ajax_封装函数_步骤1

<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>title</title> </head> <body> </body> </html> <script> /* 封装的过程 重复的代码写出来 不能固定的 作为 参数 ajax工具函数 回调函

38 py改变函数参数的值关键字参数和参数默认值函数中可变参数将序列中的元素值作为函数对应的参数值传

第五课:改变函数参数的值 一个python函数可以有任意多个参数,在一个函数的外部来定义变量,然后把变量作为参数传入到函数内,并且在函数的内部来修改函数的参数值,函数结束之后,这些变量的值在如何变化呢? 给函数传递值有2种:1种是值传递,1种是引用传递 # 改变函数参数的值 # 值传递(数值.字符串.布尔 这些都是值传递) 在函数的内部修改变量值,不改变原参数定义的参数值,解释为: 这个在函数中不会改变原来定义(函数外部)的值 这是因为函数里面会有一个占的概念,外边的变量的值会复制给 占 里面,

Effective C++_笔记_条款09_绝不在构造和析构过程中调用virtual函数

(整理自Effctive C++,转载请注明.整理者:华科小涛@http://www.cnblogs.com/hust-ghtao/) 为方便采用书上的例子,先提出问题,在说解决方案. 1 问题 1: class Transaction{ 2: public: 3: Transaction(); 4: virtual void LogTransaction() const = 0 ; 5: ... 6: }; 7:  8: Transaction::Transaction() //Base cl

『TensorFlow』函数查询列表_神经网络相关

神经网络(Neural Network) 激活函数(Activation Functions) 操作 描述 tf.nn.relu(features, name=None) 整流函数:max(features, 0) tf.nn.relu6(features, name=None) 以6为阈值的整流函数:min(max(features, 0), 6) tf.nn.elu(features, name=None) elu函数,exp(features) - 1 if < 0,否则featuresE

Effetive C++_笔记_条款06_若不想使用编译器自动生成的函数,就该明确拒绝

(整理自Effctive C++,转载请注明.整理者:华科小涛@http://www.cnblogs.com/hust-ghtao/) 通常如果你不希望class支持某一特定机能,只要不声明对应函数就是了.但这个策略对copy构造函数和copy assignment操作符却不起作用,你如果不声明它们,而某些人尝试调用它,编译器会为你声明它们. 这把你逼到了一个困境.如果你不声明copy构造函数和copy assignment操作符,编译器可能为你产出一份,于是你的clas支持copying.如果

python基础-函数_递归_内置函数

一 数学定义的函数与python中的函数 二 为何使用函数 背景提要 三 函数和过程 四 函数参数 五 局部变量与全局变量 六 前向引用之'函数即变量' 七 嵌套函数 八 递归 九 匿名函数 十 函数式编程 十一 内置函数 十二 本节作业 一.数学定义的函数与python中的函数 初中数学函数定义:一般的,在一个变化过程中,如果有两个变量x和y,并且对于x的每一个确定的值,y都有唯一确定的值与其对应,那么我们就把x称为自变量,把y称为因变量,y是x的函数.自变量x的取值范围叫做这个函数的定义域

[C/C++标准库]_[初级]_[如何实现std::string自己的Format(sprintf)函数]

场景: 1.  C语言有自己的sprintf函数,但是这个函数有个缺点,就是不知道需要创建多大的buffer, 这时候可以使用snprintf函数来计算大小,只要参数 buffer为NULL, count为0即可. 2.  这里实现std::string自己的sprintf也是用了snprintf的特性,先计算大小,再创建空间,之后存入std::string. 3.  还使用了C的可变参数特性. std::wstring Format(const wchar_t *format,...) { v

day4-字符串格式化_集合_函数

字符串格式化msg='i am %s my hobby is %s' % ('lhf','alex')print(msg) msg='i am %s my hobby is %s' % ('lhf',1)msg='i am %s my hobby is %s' % ('lhf',[1,2])print(msg)name='lhf'age=19msg='i am %s my hobby is %s' % (name,age)print(msg) 打印浮点数tpl = "percent %.2f&q

IOS_地图_定位_天气预报_Block回调_单例

H:/1021/00_block回调.h /* 通过block回调 定义block代码块,目的是解析完成之后调用 返回值是 void 参数是 数组,里面的每个成员是一个NSString*/ typedef void(^WeatherFinishedBlock)(NSArray *dataList); @interface WeatherXMLPaser : NSObject // 解析器解析数据,参数1是要解析的数据,参数2是解析完毕回调的代码块 - (void)parserWeatherDat