首頁 web前端 js教程 jQuery中$.ajax()和$.getJson()同步處理詳解_jquery

jQuery中$.ajax()和$.getJson()同步處理詳解_jquery

May 16, 2016 pm 03:45 PM
同步

一、前言

為什麼需要用到同步,因為有時候我們給一個提交按鈕註冊提交表單資料的時候,在提交動作之前會進行一系列的非同步ajax請求操作,但是頁面js程式碼會按順序從上往下面執行,如果你在這過程中進行了非同步操作,那麼取得不到當前非同步操作傳回的結果,js會繼續執行下一語句,所以我們需要同步操作請求取得後台返回資料結果後,判斷結果是否符合再執行js下一條語句。

二、$.ajax()參數解釋

url: 發送請求的位址。

type: 請求方式(post或get)預設為get。

timeout: 要求為Number型別的參數,設定請求逾時時間(毫秒)。

async:預設為true,所有請求均為非同步請求。同步請求,設定為false。注意,同步請求將鎖住瀏覽器,使用者其他操作必須等待請求完成才可執行。 -----這個是同步操作最重要的設定因素

cache:預設為true,如果瀏覽器有快取就會取得瀏覽器的快取數據,設定false怎麼不會取得快取資料

data: 要求Object或String類型的參數,傳送到伺服器的資料。如果已經不是字串,將自動轉換為字串格

      式。 get請求中將附加在url後。防止這種自動轉換,可以查看processData選項。物件必須為key/value格

      式,例如{foo1:"bar1",foo2:"bar2"}轉換為&foo1=bar1&foo2=bar2。如果是數組,JQuery將自動為不同

      值對應同一個名稱。例如{foo:["bar1","bar2"]}轉換為&foo=bar1&foo=bar2。

dataType: 要求為String類型的參數,預期伺服器傳回的資料類型。如果不指定,JQuery將自動根據http套件mime

          訊息傳回responseXML或responseText,且傳遞為回呼函數參數。

          可用的種類如下:

          xml:返回XML文檔,並使用JQuery處理。

          html:返回純文字HTML資訊;所包含的script標籤會在插入DOM時執行。

          script:返回純文字JavaScript程式碼。不會自動快取結果。除非設定了cache參數。注意在遠端請求時(不在同一個網域下),所有post請求都會轉為get請求。

          json:回傳JSON資料。

          jsonp:JSONP格式。使用SONP形式呼叫函數時,例如myurl?callback=?,JQuery將自動替換後一個 “?”為正確的函數名,以執行回調函數。

          text:傳回純文字字串。

 beforeSend:要求為Function類型的參數,發送請求前可以修改XMLHttpRequest物件的函數,例如新增自訂HTTP頭。在beforeSend中如果回傳false可以取消本次ajax請求。 XMLHttpRequest物件是惟一的參數。

            function(XMLHttpRequest){
               this;   //呼叫本次ajax請求時所傳遞的options參數
            }

complete:要求為Function類型的參數,請求完成後呼叫的回呼函數(請求成功或失敗時均呼叫)。 參數:XMLHttpRequest物件和一個描述成功請求類型的字串。

          function(XMLHttpRequest, textStatus){
             this;    //呼叫本次ajax請求時所傳遞的options參數
          }

success:要求為Function類型的參數,請求成功後呼叫的回呼函數,有兩個參數。

         (1)由伺服器傳回,並依據dataType參數處理後的資料。

         (2)描述狀態的字串。

         function(data, textStatus){

            //data可能是xmlDoc、jsonObj、html、text等this;

           //呼叫本次ajax請求時所傳送的options參數

error:要求為Function類型的參數,請求失敗時被呼叫的函數。此函數有3個參數,分別是XMLHttpRequest物件、錯誤訊息、捕獲的錯誤物件(可選)。

       ajax事件函數如下:

       function(XMLHttpRequest, textStatus, errorThrown){
          //通常使用textStatus與errorThrown只有其中一個包含資訊
          this;   //呼叫本次ajax請求時所傳遞的options參數
       }

contentType:要求為String類型的參數,當傳送訊息至伺服器時,內容編碼類型預設為"application/x-www-form-urlencoded"。此預設值適合大多數應用場合。

dataFilter:要求為Function類型的參數,給予Ajax傳回的原始資料進行預處理的函數。 提供data和type兩個參數。 data是Ajax傳回的原始數據,type是呼叫jQuery.ajax時提供的 dataType參數。函數傳回的值將由jQuery進一步處理。

            function(data, type){
                //返回處理後的資料
                return data;
            }

global:要求為Boolean型別的參數,預設為true。表示是否觸發全域ajax事件。設定為false將不會觸發全域 ajax事件,ajaxStart或ajaxStop可用於控制各種ajax事件。

ifModified:要求為Boolean類型的參數,預設為false。僅在伺服器資料改變時取得新資料。伺服器資料改變判斷的依據是Last-Modified頭資訊。預設值是false,即忽略頭資訊。

jsonp:要求為String類型的參數,在一個jsonp請求中重寫回呼函數的名字。 該值用來替代在"callback=?"這種GET或POST請求中URL參數裡的"callback"部分,例如 {jsonp:'onJsonPLoad'}會導致將"onJsonPLoad=?"傳給伺服器。

username:要求為String類型的參數,用於回應HTTP存取認證請求的使用者名稱。

password:要求為String類型的參數,用於回應HTTP存取認證請求的密碼。

processData:要求為Boolean型別的參數,預設為true。預設情況下,發送的資料將被轉換為物件(從技術角度來講並非字串)以配合預設內容類型"application/x-www-form-urlencoded"。如果要傳送DOM樹資訊或其他不希望轉換的訊息,請設定為false。

scriptCharset:要求為String類型的參數,只有當請求時dataType為"jsonp"或"script",且type是GET時才會用於強制修改字元集(charset)。通常在本地和遠端的內容編碼不同時使用。

三、$.getJson()同步設定

$.getJson()本身是非同步操作的方法,需要經過設定才能夠同步

在執行之前加$.ajaxSettings.async = false;    (同步執行)        執行你的程式碼之後及時恢復為$.ajaxSettings.async = truetrue;(異步執行)影響別的地方的需要非同步執行的程式碼。

四、具體操作範例

1、$.ajax()

 //点击新增按钮,新增数据
      $("#btnAdd").click(function () {
        var bool = true;//存储异步请求结果是否通过
        //1、验证优惠额度正确性
        var index = parseInt($("#intGiftMold").val());
        if (index == 1) {
          //满减
          var reg = /^[0-9]+,[0-9]+$/;
          if (!reg.test($("#strDiscounts").val())) {
            $.messager.alert('错误提示', '满减优惠额度格式不正确', 'error');
            return false;
          }
        }
        else if (index == 2) {
          var reg = /^0\.[0-9]+$/;
          if (!reg.test($("#strDiscounts").val())) {
            $.messager.alert('错误提示', '折扣优惠额度格式不正确', 'error');
            return false;
          }
        }
        else if (index == 3) {
          var reg = /^[1-9]+[0-9]$/;
          if (!reg.test($("#strDiscounts").val())) {
            $.messager.alert('错误提示', '指定金额优惠额度格式不正确', 'error');
            return false;
          }
        }
        //2、验证优惠范围正确性
        var index = parseInt($("#intGiftRange").val());
        if (index == 1) { //选择全站
        }
        else if (index == 3) {  //判断商品ID
          $.ajax({
           type: "post",
            url: "Gift_Add.aspx",
           cache: false,
            async: false,  //设置同步了~~~~~~~~~
           dataType: "json",
            data: { "method": "isExistInfoTitle", "intInfoID": $("#intInfoID").val() },
            success: function (data) {
              if (data.result == "false") {
                $.messager.alert('错误提示', '商品ID不存在', 'error');
                bool = false;
               $("#isExistInfoTitle").css({ "display": "" });
              }
              else {
                $("#isExistInfoTitle").css({ "display": "none" });
                bool = true;
              }
            }
          });
        }
          });
        }
if (bool == false) {//如果bool为false才返回,true继续往下走
          return false;  //不能在异步方法里面return,不起作用
        }
        var validate = $("#form").form("validate");
        if (!validate) {//表单验证不通过
          return false;
        }
        //当上面全部验证通过了执行新增操作
        $.messager.confirm('温馨提示', '是否确认添加', function (r) {
          if (r) {
            $.post("Gift_Add.aspx?method=addGift", $("#form").serialize(), function (data) {
              $.messager.alert('成功提示', '添加成功', 'info');
            });
          }
        });
      });

登入後複製

2、$.getJson()

 //点击新增按钮,新增数据
      $("#btnAdd").click(function () {
        var bool = true;//存储异步请求结果是否通过
        //1、验证优惠额度正确性
        var index = parseInt($("#intGiftMold").val());
        if (index == 1) {
          //满减
          var reg = /^[0-9]+,[0-9]+$/;
          if (!reg.test($("#strDiscounts").val())) {
            $.messager.alert('错误提示', '满减优惠额度格式不正确', 'error');
            return false;
          }
        }
        else if (index == 2) {
          var reg = /^0\.[0-9]+$/;
          if (!reg.test($("#strDiscounts").val())) {
            $.messager.alert('错误提示', '折扣优惠额度格式不正确', 'error');
            return false;
          }
        }
        else if (index == 3) {
          var reg = /^[1-9]+[0-9]$/;
          if (!reg.test($("#strDiscounts").val())) {
            $.messager.alert('错误提示', '指定金额优惠额度格式不正确', 'error');
            return false;
          }
        }
        //2、验证优惠范围正确性
        var index = parseInt($("#intGiftRange").val());
        if (index == 1) { //选择全站
        }
        else if (index == 3) {  //判断商品ID
           $.ajaxSettings.async = false; //设置getJson同步
          $.getJSON("Gift_Add.aspx", { "method": "isExistInfoTitle", "intInfoID": $("#intInfoID").val() }, function (data) {
            if (data.result == "false") {
              $.messager.alert('错误提示', '商品ID不存在', 'error');
              bool = false;
              $("#isExistInfoTitle").css({ "display": "" });
            }
            else {
              $("#isExistInfoTitle").css({ "display": "none" });
              bool = true;
            }
          });
          $.ajaxSettings.async = true;//设置getJson异步
        }
          });
        }
        if (bool == false) {//如果bool为false才返回,true继续往下走
          return false;  //不能在异步方法里面return,不起作用
        }
        var validate = $("#form").form("validate");
        if (!validate) {//表单验证不通过
          return false;
        }
        //当上面全部验证通过了执行新增操作
        $.messager.confirm('温馨提示', '是否确认添加', function (r) {
          if (r) {
            $.post("Gift_Add.aspx?method=addGift", $("#form").serialize(), function (data) {
              $.messager.alert('成功提示', '添加成功', 'info');
            });
          }
        });
      });
登入後複製

總結:

$.ajax 是傳統的 get、post 方法的 AJAX 實作
$.getJSON 是 jsonp (遠端資料讀取)類別AJAX 實作
 之所以稱為 類別AJAX 是因為儘管他被封裝在 jq 的 ajax 類別中,但實際上是透過 script 節點實現的

 在使用上 $.getJSON 和 $.ajax 的差別在於:

 發送時,$.getJSON 會傳遞一個回呼函數名稱(預設時jq會給一個)
 接收是,這個回呼函數會被呼叫
$.getJSON 的伺服器端必須將傳入的回呼函數名稱附加在json資料之前
 正因為這樣,這個回傳的串就已經不是 json 了(格式錯了)
 因此有 dataType:"json" 屬性的 $.ajax 會因為json解析錯誤而進入 error 分支

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
威爾R.E.P.O.有交叉遊戲嗎?
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

解決win11同時播放耳機與音響的問題 解決win11同時播放耳機與音響的問題 Jan 06, 2024 am 08:50 AM

一般來說,我們只需要同時使用耳機或音響的其中一個設備,但是有些朋友反映在win11系統中,遇到了耳機和音響一起響的問題,其實我們可以在realtek面板中將它關閉,就可以了,下面一起來看一下吧。 win11耳機和音響一起響怎麼辦1、先在桌面上找到並打開“控制面板”2、進入控制面板,在其中找到並打開“硬體和聲音”3、然後再找到一個喇叭圖標的“Realtek高清晰音訊管理器”4、選擇“揚聲器”再點擊“後面板”進入揚聲器設定。 5.打開之後我們可以看到設備類型,如果要關閉耳機就取消勾選“耳機”,如果要

您同步的資料夾中的一個或多個項目不符合Outlook錯誤 您同步的資料夾中的一個或多個項目不符合Outlook錯誤 Mar 18, 2024 am 09:46 AM

當您在您的同步資料夾中發現一個或多個項目與Outlook中的錯誤訊息不符時,這可能是因為您更新或取消了會議項目。在這種情況下,您會看到一條錯誤訊息,提示您的本機資料版本與遠端副本有衝突。這種情況通常發生在Outlook桌面應用程式中。您同步的資料夾中的一個或多個項目不符。若要解決衝突,請開啟這些項目,然後重試此操作。修復同步的資料夾中的一個或多個項目不符合Outlook錯誤在Outlook桌面版中,當本機行事曆項目與伺服器副本發生衝突時,可能會遇到問題。不過,幸運的是,有一些簡單的方法可以幫助您

MySql的資料遷移與同步:如何實作多台伺服器之間的MySQL資料遷移與同步 MySql的資料遷移與同步:如何實作多台伺服器之間的MySQL資料遷移與同步 Jun 15, 2023 pm 07:48 PM

MySQL是一個非常受歡迎的開源關聯式資料庫管理系統,廣泛應用於各種Web應用、企業系統等。在現代業務的應用場景下,大多數的MySQL資料庫需要部署在多台伺服器上,以提供更高的可用性和效能,這就需要進行MySQL資料的遷移和同步。本文將介紹如何實作多台伺服器之間的MySQL資料遷移和同步。一.MySQL資料遷移MySQL資料遷移指的是將MySQL伺服器中的數

教你如何將win10剪貼簿與手機同步 教你如何將win10剪貼簿與手機同步 Jan 06, 2024 am 09:18 AM

win10剪貼簿有個非常好用的功能就是跨裝置雲端儲存功能,非常的好用可以幫助用戶PC設備和手機設備同步複製貼上。設定的方法非常簡單,只要在系統裡的剪切板設置就好。 win10剪貼簿同步到手機1、先點選左下角的開始,進入設定。 2、然後去點選「系統」。 3.選擇左側的「剪貼簿」。 4.最後在右邊的「跨裝置同步」點選登錄,然後選擇手機就好了。

百度雲端同步盤怎麼同步 百度雲端同步盤怎麼同步 Feb 23, 2024 pm 01:22 PM

百度雲同步盤怎麼同步?百度雲同步盤中可以選擇文件來同步,但是多數的用戶不知道如何同步百度雲文件,接下來就是小編為用戶帶來的百度云同步盤同步方法圖文教程,有興趣的用戶快來一起看看吧!百度雲同步盤怎麼同步1、先進入電腦桌面,右鍵點選【百度雲同步盤】圖標,選擇【設定】;2、之後展開服務小窗口,切換到【進階設定】頁面點選【選擇資料夾】; 3.最後切換到下圖的頁面,勾選需要同步的檔案點選【確定】即可。

如何在 Windows 11 的 OneDrive 中選擇要同步的特定資料夾 如何在 Windows 11 的 OneDrive 中選擇要同步的特定資料夾 Apr 13, 2023 pm 04:22 PM

您系統上的 OneDrive 應用程式將所有檔案和資料夾儲存在雲端。但有時用戶不希望某些檔案或資料夾被儲存並佔用限制為 5 GB 的 OneDrive 空間而無需訂閱。為此,OneDrive 應用程式中有一個設置,允許使用者選擇要在雲端上同步的文件或資料夾。如果您也在尋找這個,那麼這篇文章將幫助您在 Windows 11 系統的 OneDrive 中選擇要同步的資料夾或檔案。如何在 Windows 11 的 OneDrive 中選擇要同步的某些資料夾注意:確保 OneDrive 應用程式已連接並同步

Python 並發程式設計中的鎖與同步:保持你的程式碼安全可靠 Python 並發程式設計中的鎖與同步:保持你的程式碼安全可靠 Feb 19, 2024 pm 02:30 PM

並發程式設計中的鎖定與同步在並發程式設計中,多個行程或執行緒同時執行,這可能會導致資源爭用和不一致性問題。為了解決這些問題,需要使用鎖定和同步機制來協調對共享資源的存取。鎖的概念鎖是一種機制,它允許一次只有一個執行緒或程序存取共享資源。當一個執行緒或程序獲得鎖時,其他執行緒或程序將被阻止存取該資源,直到鎖被釋放。鎖的類型python中有幾種類型的鎖:互斥鎖(Mutex):確保一次只有一個執行緒或程序可以存取資源。條件變數:允許執行緒或行程等待某個條件,然後取得鎖定。讀寫鎖:允許多個執行緒同時讀取資源,但只允許一個執行緒寫入資

釘釘同步日程的操作流程 釘釘同步日程的操作流程 Mar 29, 2024 pm 05:11 PM

1.打開手機釘釘先左上角頭像。 2、在彈出頁面下方點開設定。 3、然後點開頁面裡的設定。 4、在設定頁面開啟日曆設定。 5.點開後在頁面找到同步手機行程。 。 6.然後把同步手機行程開啟即可。

See all articles