JS 操作 AJAX
Table of Contents
API
onreadystatechange | 指定当 readyState 属性改变时的事件处理句柄 |
readyState | 返回当前请求的状态 |
responseBody | 将回应信息正文以 unsigned byte 数组形式返回 |
responseStream | 以 Ado Stream 对象的形式返回响应信息 |
responseText | 将响应信息作为字符串返回 |
responseXML | 将响应信息格式化为 Xml Document 对象并返回 |
status | 返回当前请求的 http 状态码 |
statusText | 返回当前请求的响应行状态 |
abort | 取消当前请求 |
getAllResponseHeaders | 获取响应的所有 http 头 |
getResponseHeader | 从响应信息中获取指定的 http 头 |
open | 创建一个新的 http 请求,并指定此请求的方法、URL 以及验证信息(用户名/密码) |
send | 发送请求到 http 服务器并接收回应 |
setRequestHeader | 单独指定请求的某个 http 头 |
readyState:
0: unset
1: opened
2: headers_received
3: loading
4: done
同步和异步
<script type="text/javascript"> var xhr = new XMLHttpRequest(); xhr.open(‘get‘, ‘test.php?id=2‘, false); xhr.send(); alert(xhr.responseText); </script>
if (!empty($_GET[‘id‘])) { echo ‘id = ‘, $_GET["id"]; } else { echo ‘fail‘; }
open 的第三个参数, 表示是否使用异步, false 表示使用同步
如果上面的 js 代码, 使用 true, 也就是异步, 那么将会 alert ‘‘
异步表示函数还没有执行完成, 可以继续执行 alert(xhr.responseText)
, 那么 responseText
还没来得及返回
同步和异步的就像是打电话叫人办一点事, 如果是以同步的方式, 那么你将一直打电话直到对方接听, 回答等等; 如果是异步, 那么你就只需要发个信息等待对方回应
所以上面的代码我们以同步的方式进行的话, alert 的那一行代码 不会那么快返回
, 而是等 send 完全执行完之后, 所以程序可以正常的执行
异步如何实现
异步不阻塞 js 只有一个线程, 以队列的方式执行 (实现 ‘多个任务‘ 就是使用异步来 ‘插队‘)
ajax / text
server
test1.php
<?php header(‘content-type: text/plain; charset: utf-8‘); if (isset($_GET[‘num‘])) { echo ‘get: ok num = ‘, $_GET[‘num‘]; } if (isset($_POST[‘num‘])) { echo ‘post: ok num = ‘, $_POST[‘num‘]; }
get
test1.html
var request = new XMLHttpRequest(); var url = ‘test1.php?num=‘ + 123; request.open(‘GET‘, url, true); request.send(); request.onreadystatechange = function () { if (request.readyState === 4) { if (request.status === 200) { var data = request.responseText; alert(data); } else { alert(‘fail: ‘ + request.status + ", " + request.statusText); } } }
post
test1.html
var request = new XMLHttpRequest(); request.open(‘POST‘, ‘test1.php‘, true); request.setRequestHeader(‘content-type‘, ‘application/x-www-form-urlencoded‘); request.send(‘num=123‘); request.onreadystatechange = function () { if (request.readyState === 4) { if (request.status === 200) { alert(request.responseText); } else { alert(‘fail: ‘ + request.status + ‘, ‘ + request.statusText); } } }
ajax / json
server
test2.php
<?php // header(‘content-type: text/javascript; charset: utf-8‘); # 这种写法也是支持的 // header(‘content-type: text/plain; charset: utf-8‘); # 这种写法也是支持的 header(‘content-type: text/json; charset: utf-8‘); if (isset($_GET[‘num‘])) { echo ‘{"res": "get ok! this is json data! num = ‘ .$_GET[‘num‘]. ‘."}‘; } if (isset($_POST[‘num‘])) { echo ‘{"res": "post ok! this is json data! num = ‘ .$_POST[‘num‘]. ‘."}‘; }
get
test2.html
var request = new XMLHttpRequest(); var url = ‘test2.php?num=‘ + 123; request.open(‘GET‘, url, true); request.send(); request.onreadystatechange = function() { if (request.readyState === 4) { if (request.status === 200) { var data = JSON.parse(request.response); alert(data.res); } else { alert(‘fail: ‘ + request.status + ", " + request.statusText); } } }
post
test2.html
var request = new XMLHttpRequest(); var url = ‘test2.php‘; request.open(‘POST‘, url, true); request.setRequestHeader(‘content-type‘, ‘application/x-www-form-urlencoded‘); request.send(‘num=123‘); request.onreadystatechange = function () { if (request.readyState === 4) { if (request.status === 200) { var data = JSON.parse(request.response); alert(data.res); } else { alert(‘fail: ‘ + request.status + ‘, ‘ + request.statusText); } } }
ajax / xml
server
<?php header(‘content-type: text/xml; charset: utf-8‘); if (isset($_GET[‘num‘])) { echo ‘<mes><res>this is get data and num = ‘.$_GET[‘num‘].‘</res></mes>‘; } if (isset($_POST[‘num‘])) { echo ‘<res>this is POST data and num = ‘.$_POST[‘num‘].‘</res>‘; }
get
test3.js
var request = new XMLHttpRequest(); var url = ‘test3.php?num=‘ + 123; request.open("GET", url, true); request.send(); request.onreadystatechange = function () { if (request.readyState === 4) { if (request.status === 200) { var xmldom = request.responseXML; var data = xmldom.getElementsByTagName(‘res‘); alert(data[0].childNodes[0].nodeValue); } } }
post
test3.js
var request = new XMLHttpRequest(); var url = ‘test3.php‘; request.open("POST", url, true); request.setRequestHeader(‘content-type‘, ‘application/x-www-form-urlencoded‘); request.send(‘num=123‘); request.onreadystatechange = function () { if (request.readyState === 4) { if (request.status === 200) { var xmldom = request.responseXML; var data = xmldom.getElementsByTagName(‘res‘); alert(data[0].childNodes[0].nodeValue); } } }
跨域
- 代理 (不懂)
- jsonp
- XHR2
xhr2 允许跨域
header("Content-Type: application/json;charset=utf-8"); header(‘Access-Control-Allow-Origin: *‘); // * 可以用别的替代 header(‘Access-Control-Allow-Methods: POST,GET‘);
jsonp
<?php echo ‘func({ "url": "www.example1.com" })‘;
function func(data) { alert(data.url); } var newscript = document.createElement(‘script‘); newscript.setAttribute(‘src‘, ‘test.php‘); document.getElementsByTagName(‘head‘)[0].appendChild(newscript);
jsonp 的原理就是利用 script 可以跨域, 然后将请求的内容包进一个函数里面, 比如 func({…}), 参数就是你请求的 data, 这样的话就是 调用 我们本地的一个 func 函数, 然后我们可以定义一个 func 函数 function func(data) { alert(data...); }
注: script 如果放在 head 里面就会自动执行, (对应上面的第二段代码)
jquery jsonp
function func(data) { alert(data.url); } $(‘input‘).click(function () { $.ajax({ url: ‘http://127.0.0.1/test.php‘, dataType: ‘jsonp‘, jsonp: ‘func‘ }); });
xhr2
header("Content-Type: application/json;charset=utf-8"); header(‘Access-Control-Allow-Origin: *‘); // * 可以用别的替代 header(‘Access-Control-Allow-Methods: POST,GET‘);