這篇文章主要介紹如何使用jQuery的ajax方法向服務(wù)器發(fā)出get和post請(qǐng)求,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!
我們提供的服務(wù)有:網(wǎng)站設(shè)計(jì)制作、成都網(wǎng)站建設(shè)、微信公眾號(hào)開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、會(huì)昌ssl等。為上千多家企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的會(huì)昌網(wǎng)站制作公司
打算寫個(gè)ajax系列的博文,主要是寫給自己看,學(xué)習(xí)下ajax的相關(guān)知識(shí)和用法,以更好的在工作中使用ajax。
假設(shè)有個(gè)網(wǎng)站A,它有一個(gè)簡單的輸入用戶名的頁面,界面上有兩個(gè)輸入框,第一個(gè)輸入框包含在一個(gè)form表單里用來實(shí)現(xiàn)form提交,第二個(gè)輸入框是單獨(dú)的、沒有包含在form里,下面就用這兩個(gè)輸入框來學(xué)習(xí)下jQuery的ajax。
1,前端的html和javascript代碼
頁面html
輸入用戶名
頁面中引入的demo01.js代碼,注意此處實(shí)現(xiàn)的是一個(gè)簡單的GET請(qǐng)求。
$(function($) { $('input[name=submit2]').on('click', function(e) { let username = ''; if ('' !== (username = $('#user-name2').val())) { $.ajax({ url: `demo.php?name=${username}`, dataType: 'json', method: 'GET', success: function(data) { if (data.result == 1) { $('.box').html(`你的姓名${username}已成功保存。`); } }, error: function(xhr) { // 導(dǎo)致出錯(cuò)的原因較多,以后再研究 alert('error:' + JSON.stringify(xhr)); } }) .done(function(data) { // 請(qǐng)求成功后要做的工作 console.log('success'); }) .fail(function() { // 請(qǐng)求失敗后要做的工作 console.log('error'); }) .always(function() { // 不管成功或失敗都要做的工作 console.log('complete'); }); } }); });
jQuery的ajax()方法有兩種寫法,分別是: $.ajax(url [, settings]); 和 $.ajax([settings]); 兩種寫法都可以,感覺第一種方法適合用于參數(shù)較少的情況,比如,如果只是對(duì)一個(gè)url做一個(gè)簡單的請(qǐng)求,不對(duì)返回的數(shù)據(jù)、格式和錯(cuò)誤有要求,只需要傳遞一個(gè)url參數(shù)就可以,那就可以用第一種寫法。上面的demo01.js中采用的是第二種寫法,下面解釋下參數(shù)和相關(guān)的函數(shù)。
(1)上面代碼中ajax()的參數(shù)
可以看到這里的參數(shù)類型都是javascript對(duì)象,即都是 o = {key: value}; 這種類型的數(shù)據(jù)。jQuery的文檔中規(guī)定了,這里的參數(shù)只能是PlainObject(對(duì)象類型的對(duì)象),不能是null、自定義的數(shù)組、或者像docement這種歸屬于某種執(zhí)行環(huán)境(比如瀏覽器)屬于某種類型的對(duì)象。這里不太好說清楚,可以做個(gè)小試驗(yàn)。在命令行里打開node repl,進(jìn)行下測試:
> node > typeof(null); 'object' > typeof([]); 'object' > typeof(document); 'undefined' > typeof({}); 'object'
可以看到null、[](數(shù)組類型)、{}(對(duì)象類型)都是對(duì)象。因?yàn)樵趈s中一切皆對(duì)象。而在交互式環(huán)境中,document則是未定義的一個(gè)變量,所以它的類型是undefined。如果在瀏覽器環(huán)境下測試下typeof(document),那么它的類型也是object。下面逐個(gè)解釋下代碼用到的參數(shù):
url,要請(qǐng)求的url地址,它的值應(yīng)該是包含url的字符串。
dataType,字符串。發(fā)出請(qǐng)求后,期望從服務(wù)器返回的數(shù)據(jù)類型。可以指定的類型有xml、html、script、json、jsonp、text。如果不指定,jquery會(huì)基于MIME做判斷,并會(huì)返回一個(gè)下面xml、json、script、html當(dāng)中的一種類型。
method,字符串。HTTP請(qǐng)求方法,默認(rèn)為GET,上面代碼中指定為POST。
success, Type: Function( Anything data, String textStatus, jqXHR jqXHR ) ,匿名函數(shù)。HTTP請(qǐng)求成功后要調(diào)用的函數(shù),可以傳遞三個(gè)參數(shù)給它:從服務(wù)器返回的數(shù)據(jù)(如果上面指定了dataType,則服務(wù)器返回的數(shù)據(jù)類型需要與上面dataType指定的類型一致)、一個(gè)可以描述狀態(tài)的字符串textStatus、還有一個(gè)jqXHR對(duì)象??梢钥吹缴厦嬷粋鬟f了從服務(wù)器返回的數(shù)據(jù)data。
error, Type: Function( jqXHR jqXHR, String textStatus, String errorThrown ) ,匿名函數(shù)。HTTP請(qǐng)求失敗后要調(diào)用的函數(shù),同樣也可以傳遞三個(gè)參數(shù)。
除了用到的這些參數(shù),還有許多其他的如:async、dataFilter、mimeType等其他參數(shù),不過現(xiàn)在的這個(gè)簡單的腳本還用不到那么多參數(shù)。
(2)“延遲加載函數(shù)”
上面代碼中 $.ajax().done().fail().always() jqXHR.done()、jqXHR.fail()、jqXHR.always()中分別可以添加deferred對(duì)象被解析、被拒絕、被解析或被拒絕這三種情況下的要處理的工作,比如添加個(gè)函數(shù)什么的。為什么能夠這么做呢,這要看$.ajax()返回了什么,它返回的是jqXHR對(duì)象(jquery版本大于1.5時(shí))。這個(gè)對(duì)象實(shí)現(xiàn)了Promise interface(Promise機(jī)制,用來傳遞異步操作消息,代表了某個(gè)未來才會(huì)知道結(jié)果的事件)。這就允許在一次請(qǐng)求中添加多個(gè)回調(diào)函數(shù),甚至可以在請(qǐng)求完成后添加回調(diào)函數(shù)。
標(biāo)題“延遲加載”描述的不夠準(zhǔn)確,但從效果上看是有延遲加載的效果。關(guān)于這個(gè)問題更詳細(xì)的解釋可以參考jQuery文檔中對(duì)jqXHR的解釋 或一位前端前輩的解釋jQuery的deferred對(duì)象詳解 。
2,后端運(yùn)行在nginx服務(wù)器上的php代碼
后端的邏輯很簡單:我們把前端獲取的數(shù)據(jù)保存到名為data-demo01的文件中,保存成功則向前端返回一個(gè)1作為標(biāo)志。
(1)前端ajax發(fā)起GET請(qǐng)求
如果前端的ajax發(fā)起的是一個(gè)GET請(qǐng)求,那么后端也比較好處理:
if (isset($_GET['name']) && !empty($_GET['name'])) { $username = trim($_GET['name']); if (file_put_contents('data-demo01', $username)) { echo '{"result": 1}'; } }
(2)前端ajax發(fā)起POST請(qǐng)求
js代碼中需要修改下ajax()的url、method參數(shù),并增加一個(gè)data參數(shù),修改后如下:
// 相同的代碼省略 $.ajax({ url: `demo01.php`, dataType: 'json', method: 'POST', data: {"username": username}, // 相同的代碼省略
因?yàn)橛肞OST傳遞數(shù)據(jù),所以去掉url中用來傳遞數(shù)據(jù)的參數(shù),下面的data類型要與dataType一致,為json格式,然后將username作為值傳遞。
那么后端的代碼也就可以確定了:
if (isset($_POST['username']) && !empty($_POST['username'])) { $username = trim($_POST['username']); if (file_put_contents('data-demo01', $username)) { echo '{"result": 1}'; } }
如果不出錯(cuò)的話,效果應(yīng)該是下面這樣然后查看下data-demo01,名字果然被保存了。
以上是“如何使用jQuery的ajax方法向服務(wù)器發(fā)出get和post請(qǐng)求”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!