function objToStr(obj){ obj.t = new Date().getTime(); // 给obj动态增加了一个属性 // 这个给对象添加属性的方法, 会被直接加到键值对里?? /* { "userName":"lnj", "userPwd":"123456", "t":"38439034204" // 随机的时间数值 } */ var res = []; for(var key in obj){ res.push(encodeURIComponent(key)+"="+encodeURIComponent(obj[key])); // 注意这里键值对取值的方式 // encodeURIComponent(); 把中文转码,因为URL里不能出现中文 // URL中只能出现 字母/数字/下划线/ASCII码 } return res.join("&"); // 数组的join方法要看一下!! } function ajax(url, obj, timeout, success, error){ // 0. 将对象转换为字符串 var str = objToStr(obj); // 函数的返回值即为这个字符串str // 1. 创建异步对象 var xmlHttp, timer; if(window.XMLHttpRequest){ xmlHttp = new XMLHttpRequest(); }else{ xmlHttp = new ActiveXObject("Microsoft.XMLHTTP"); } /* 2. 设置请求方式和请求地址 open(method,url,async) method: 请求的类型 GET 或 POST url: 文件在服务器上的位置 async: true(异步) false(同步) */ xmlHttp.open("GET", url+"?"+str, true); // 3. 发送请求 xmlHttp.send(); // 4. 监听状态的变化 xmlHttp.onreadystatechange = function(ev2){ /* 0: 请求未初始化 1: 服务器连接已建立 2: 请求已接收 3: 请求处理中 4:请求已完成,且相应已就绪 */ if(xmlHttp.readyState === 4){ //判断是否请求成功 clearInterval(timer); // 这里有点疑问,readyState状态为4,即清除定时器? if(xmlHttp.status >= 200 && xmlHttp.status < 300 || xmlHttp.status === 304){ // 5. 处理返回的结果 success(xmlHttp); }else{ error(xmlHttp); } } } // 判断外界是否传入了超时时间 if(timeout){ timer = setInterval(() => { xmlHttp.abort(); // abort(); 中止XMLHttpRequest对象的请求 clearInterval(timer); }, timeout); } }
<script src="myAjax.js"></script> <script> window.onload = function(ev){ var oBtn = document.querySelector('button'); //var res = encodeURIComponent('张三'); oBtn.onclick = function(ev1){ ajax('04-ajax-get.php', { "userName":"lnj", "userPwd":"123456" }, 3000, // 设置服务器响应超时时间,到时间还没返回结果,就中止这次请求 function(xhr){ alert(xhr.responseText); }, function(xhr){ alert('请求失败'); }) } } </script>
xhr.open("POST", "04-ajax-get.php", true); // POST 的 URL后面 不能直接拼接参数, 只能通过以下方式: // 注意点:以下代码必须放到open和send之间 xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); xhr.send("userName=zs&userPwd=123"); // POST请求的参数