ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
[TOC] >[success] # ajax工具函数封装 <br/> ajax函数封装后可以很方便的使用,不需要每次都重新写一遍重复的代码 <br/> >[success] ## 简单版(post、get函数) <br/> 简单版需要2个函数:`post` 函数和`get`函数,看着臃肿,里面暂时没有做`数据类型的判断` <br/> >[success] ### 前端代码 <br/> 1. index.html ~~~ <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> <script src="./ajax.js"></script> <script> window.onload = function () { // get请求 document.querySelector('.get').onclick = function () { get('./backSendData.php', 'name=jack&friend=rose', function (data) { console.log(data, 'get') }) } // post请求 document.querySelector('.post').onclick = function () { post('./backSendData.php', 'name=jack&friend=rose', function (data) { console.log(data, 'post') }) } } </script> </head> <body> <h2>测试工具函数</h2> <input class="get" type="button" value="测试get"> <input class="post" type="button" value="测试post"> </body> </html> ~~~ 2. ajax.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) // 请求头(get可以省略) // 回调函数 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); // 请求头(get可以省略,post不传参数也可以不写) if (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); } ~~~ <br/> >[success] ### 后端代码 <br/> 1. backSendData.php ~~~ <?php echo '<h2>get</h2>'; print_r($_GET); echo '<h2>post</h2>'; print_r($_POST); ?> ~~~ <br/> >[success] ## 改进版(根据参数来决定请求的接口类型) <br/> 改进后的只需要`一个函数`传入不同的参数即可,缺点:参数必须要有序,顺序不对就会报错,里面暂时没有做`数据类型的判断` <br/> >[success] ### 前端代码 <br/> 1. index.html ~~~ <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> <script src="./ajax.js"></script> <script> window.onload = function () { // 根据参数来决定请求接口类型 document.querySelector('.ajax_test').onclick = function () { ajax_test('./backSendData.php', 'post', 'name=葫芦娃&food=胡萝卜', function (data) { console.log(data, 'asda') }) } } </script> </head> <body> <h2>测试工具函数</h2> <input class="ajax_test" type="button" value="测试ajax_test"> </body> </html> ~~~ <br/> 2. ajax.js ~~~ /** * 根据传入的类型来决定请求接口类型 * @param {*} url 接口url * @param {*} type 请求类型 * @param {*} data 接口参数(key1=value1&key2=value2) * @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); } ~~~ <br/> >[success] ## 最终版 <br/> 将`参数`修改为对象的方式易于维护,而且里面做了`数据类型的判断` <br/> >[success] ### 前端代码 <br/> 1. index.html ~~~ <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> <script src="./ajax.js"></script> <script> window.onload = function () { // 只传一个参数 document.querySelector('.ajax').onclick = function () { ajax({ url: './backSendData.php', type: 'post', data: 'name=葫芦娃&food=胡萝卜', success: function (data) { console.log(data, 'aoligei') } }) } } </script> </head> <body> <h2>测试工具函数</h2> <input class="ajax" type="button" value="测试ajax"> </body> </html> ~~~ <br/> 2. ajax.js ~~~ /** * ajax工具函数 * @param {*} option 参数为对象,值为以下内容 * @param {*} url 接口url * @param {*} type 请求类型 * @param {*} data 接口参数(key1=value1&key2=value2) * @param {*} 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) { var type = xhr.getResponseHeader("Content-Type"); // 获取服务器在header上的信息 if (type.indexOf('json') != -1) { // 判断为json格式信息 option.success(JSON.parse(xhr.responseText)) } else if (type.indexOf('xml') != -1) { // 判断为xml格式信息 option.success(xhr.responseXML) } else { // 普通字符串 option.success(xhr.responseText) } } } xhr.send(option.data); } ~~~ <br/> >[success] # ajax补充 <br/> 1. 设置返回的数据类型 ~~~ '后端'不加'header'情况下,'前端'无法取到'Content-Type'进行条件判断,所以默认返回的数据会是普通 字符串,为了解决这种问题需要设置'responseType'为'json',如果是'jquery'的'ajax',设置'dataType' 为'json/xml'等等 ~~~ <br/> 2. 跨域 ~~~ 解决办法: 1. 'CORS','html5'支持,低版本浏览器用不了 2. 'JSONP',在'jquery'中如果'请求跨域的接口'需要设置'dataType'为'jsonp' ~~~