上一篇说了在 ajax 回调里面处理 iframe 窗口的刷新问题, 这一篇记录一下遇到的一个分别在 iframe 和 div 窗口中 ajax 请求 200 状态时执行的回调问题.
我们先来看一下 ajax 请求的写法(这里使用了 jQuery)
- function check_pass(uid) {
- $.ajax({
- type: "GET",
- url: siteurl,
- dataType: "json",
- data:{
- "c":"api",
- "m":"checkpass",
- "uid":uid
- },
- success: function(data) {
- console.log("这里是 success 回调");
- console.log(data);
- },
- error:function (XMLHttpRequest, textStatus, errorThrown) {
- console.log("这是 error 回调");
- // 状态码
- console.log(XMLHttpRequest.status);
- // 错误信息
- console.log(errorThrown);
- }
- });
- }
在我们大多数人看来, ajax 请求返回 "200 ok" 状态码, 此时表示请求成功, 执行 success 方法, 那我们就做个试验:
首先我们注意看, 这个 ajax 请求规定 dataType 为 json, 那么我们在接口里返回不同类型的数据来测试 iframe 和 div 的返回结果;
1. 接口返回 json 数据
- public function checkpass() {
- $uid = $this->input->get('uid');
- $data = array('checkcode' => 1,
- 'reason' =>null
- );
- $this->db->where('uid', $uid);
- $this->db->update('mt_member_data', $data);
- $msg = array('msg'=>'审核通过','code'=>'1');
- echo json_encode($msg);
- exit;
- }
在 iframe 窗口执行 ajax 请求控制台打印(Network 显示状态 200ok):
这是 success 回调
{msg: "审核通过", code: "1"}
在模态窗口 div 执行 ajax 请求控制台打印(Network 显示状态 200ok):
这是 success 回调
{msg: "审核通过", code: "1"}
结论: 当接口返回数据类型为 json 时(符合 ajax 设定),iframe 和 div 中的 ajax 都会走 success 回调.
2. 接口返回 null
- public function checkpass() {
- $uid = $this->input->get('uid');
- $data = array('checkcode' => 1,
- 'reason' =>null
- );
- $this->db->where('uid', $uid);
- $this->db->update('mt_member_data', $data);
- }
在 iframe 窗口执行 ajax 请求控制台打印(Network 显示状态 200ok):
这是 error 回调
- 200
- SyntaxError: Unexpected end of JSON input
- at JSON.parse (<anonymous>)
- at m.parseJSON (jquery.min.js:5)
- at Pb (jquery.min.js:5)
- at x (jquery.min.js:5)
- at XMLHttpRequest.b (jquery.min.js:5)
在模态窗口 div 执行 ajax 请求控制台打印(Network 显示状态 200ok):
这是 success 回调
null
结论: 当接口返回数据类型为 null 时(不符合 ajax 设定),iframe 中的 ajax 走 error 回调, 模态窗口 div 中的 ajax 却是走 success 回调.
3. 接口返回非 json 数据
- public function checkpass() {
- $uid = $this->input->get('uid');
- $data = array('checkcode' => 1,
- 'reason' =>null
- );
- $this->db->where('uid', $uid);
- $this->db->update('mt_member_data', $data);
- echo "非 json 数据";
- exit;
- }
在 iframe 窗口执行 ajax 请求控制台打印(Network 显示状态 200ok):
这是 error 回调
200
SyntaxError: Unexpected token 非 in JSON at position 0
- at JSON.parse (<anonymous>)
- at m.parseJSON (jquery.min.js:5)
- at Pb (jquery.min.js:5)
- at x (jquery.min.js:5)
- at XMLHttpRequest.b (jquery.min.js:5)
在模态窗口 div 执行 ajax 请求控制台打印(Network 显示状态 200ok):
这是 error 回调
200
SyntaxError: Unexpected token 非 in JSON at position 0
- at JSON.parse (<anonymous>)
- at parseJSON (VM1506 jquery.min.js:2)
- at On (VM1506 jquery.min.js:2)
- at T (VM1506 jquery.min.js:2)
- at XMLHttpRequest.r (VM1506 jquery.min.js:2)
结论: 当接口返回数据类型为非 json 数据时(不符合 ajax 设定),iframe 和模态窗口 div 中的 ajax 都是走 error 回调, 并且报数据格式不对的错误.
所以, 我们可以看出, 当接口不返回数据 (即为 null) 时, 对于 iframe 和 div 中发起的 ajax 请求, 请求成功后执行的回调函数是不同的, 这点值得注意.
来源: http://www.bubuko.com/infodetail-2619191.html