1. 程式人生 > >關於iframe和div窗口中ajax請求200狀態時執行的回調問題

關於iframe和div窗口中ajax請求200狀態時執行的回調問題

site RR ces inpu 處理 XP 打印 來看 刷新問題

上一篇說了在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請求,請求成功後執行的回調函數是不同的,這點值得註意。




關於iframe和div窗口中ajax請求200狀態時執行的回調問題