• 关于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请求,请求成功后执行的回调函数是不同的,这点值得注意。




  • 相关阅读:
    HDU 5363 Key Set(快速幂取模)
    HDU 5339 Untitled(暴搜)
    POJ 2406 Power Strings
    Dedecms备份还原网站有效方法
    DEDECMS文章列表每隔8行文章添加分隔虚线
    DEDECMS突破TAG和关键字长度的限制
    为织梦dedecms制作全文RSS订阅源
    DedeCms中Channel用typeid无效
    织梦CMS/Dedecms添加自定义函数
    sql批量换dedecms文章来源和作者
  • 原文地址:https://www.cnblogs.com/eco-just/p/9094940.html
Copyright © 2020-2023  润新知