关于iframe和div窗口中ajax请求200状态时执行的回调问题

上一篇说了在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请求,请求成功后执行的回调函数是不同的,这点值得注意。



原文地址:https://www.cnblogs.com/eco-just/p/9094940.html

时间: 2024-10-18 22:36:51

关于iframe和div窗口中ajax请求200状态时执行的回调问题的相关文章

关于心跳ajax请求pending状态(被挂起),stalled时间过长的问题。涉及tcp连接异常。

环境:景安快云服务器(听说很垃圾,但是公司买的,我也刚来),CentOS-6.8-x86_64,Apache,MySQL5.1,PHP5.3. 问题:现公司有一个php系统,需要重复向后台发送ajax请求,但是会出现pending状态,我现在需要解决这个问题,或者说找到问题在服务器,代码,还是客户端,然后有个交代,但是不知道从何下手,毕竟还是it萌新啊.. 效果如图.两个特点,1:就是越往后的请求,pengding时间越长,且其中绝大部分时间被stalled占用(此问题网上有相关文章,但是没有解

ajax请求常见状态码以及产生的原因

通常前后端使用ajax交互时,客户端向服务器发送请求时,然后服务器向我们返回状态码.状态码就是告诉我们服务器响应的状态,由3位数字组成,其中第一位数字表示响应类别,响应类别从1到5分为五种 . 状态码 响应类别 原因 1xx 信息性状态码(Informational) 服务器正在处理请求 2xx 成功状态码(Success) 请求已正常处理完毕 3xx 重定向状态码(Redirection) 需要进行额外操作以完成请求 4xx 客户端错误状态码(Client Error) 客户端原因导致服务器无

Jquery监听AJAX请求

.ajaxComplete() 当Ajax请求完成后注册一个回调函数.这是一个 AjaxEvent. .ajaxError() Ajax请求出错时注册一个回调处理函数,这是一个 Ajax Event. .ajaxSend() 在Ajax请求发送之前绑定一个要执行的函数,这是一个 Ajax Event. .ajaxStart() 在AJAX 请求刚开始时执行一个处理函数. 这是一个 Ajax Event. .ajaxStop() 在AJAX 请求完成时执行一个处理函数. 这是一个 Ajax Eve

HTTP协议、Ajax请求

今天这篇文章呢,主要讲的就是关于HTTP协议.Ajax请求以及一些相关的小知识点.虽然内容不算多,可是是很重点的东西~ HTTP协议 1. http:超文本传输协议.简单.快速.灵活.无状态.无连接.2. url:统一资源定位符.     组成部分:协议名://主机名(主机ip):端口号/项目资源地址?传递参数的键值对#锚点     eg: http://192.168.5.151:8080/js/index.php?name=zhangsan#top     ① ip地址在同一网段是唯一的.如

jquery的ajax请求中的数据处理

前台(1)js发出请求的ajax方法 1 $.ajax({ 2 url: "*.do", //url是要请求的路径 3 type: "get", //type是http请求的类型,值是"get"或者"post" 4 data: "key=" + value+ "&key=" + value+ "&key=" + value, /* data是请求时提交

javascript中Ajax请求的封装代码

/****************************ajax请求 start**************************************/ function ajaxClass(_url, _successCallback, _failureCallback, _urlParameters, _callbackParams, _async, _charset, _timeout, _frequency, _requestTimes, _frame) { /** * AJAX

js实现AJAX请求

摘自:http://www.myexception.cn/javascript/1448345.html AJAX:全称“Asynchronous JavaScript and XML”(异步的JavaScript与XML) AJAX请求的特点: 1.不刷新页面 2.服务器仅返回需要的数据 AJAX引擎:XMLHttpRequest此对象是浏览器中的内置对象,在目前的所有浏览器中都支持此对象. IE中获取此对象: if(window.ActiveXObject){            var

ajax请求的异步嵌套问题分析

(本文章以as3代码为例) 问题的产生 在前端开发时,经常会使用到Ajax(Asynchronous Javascript And XML)请求向服务器查询信息(get)或交换数据(post),ajax请求都是异步响应的,每次请求都不能同步返回结果,而且多次请求嵌套在一起时,逻辑很难处理,怎么办呢? 在as3中,get请求的写法通常如下 public static function httpGet(url:String):void { var httpService:HTTPService =n

KindEditor:Ajax提交表单时获取不到HTML内容

当用Ajax提交表单时,KindEditor的内容获取不到,HTML数据获取不了 原因:当ajax提交时,KindEdito的HTML数据还没有同步到表单中来,那怎么去获取HTML数据呢? --------------------------------------------------- KindEditor 4.x documentation:获取HTML数据 // 取得HTML内容html = editor.html(); // 同步数据后可以直接取得textarea的valueedit