使用jquery的then方法
創(chuàng)新互聯(lián)建站是一家專注于網(wǎng)站設(shè)計(jì)制作、網(wǎng)站設(shè)計(jì)與策劃設(shè)計(jì),平?jīng)鼍W(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)建站做網(wǎng)站,專注于網(wǎng)站建設(shè)10年,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:平?jīng)龅鹊貐^(qū)。平?jīng)鲎鼍W(wǎng)站價(jià)格咨詢:028-86922220
1.Deferred.then()相當(dāng)于Deferred.done()、Deferred.fail()、Deferred.progress()的合體,可以同時注冊3個狀態(tài)下的回調(diào)函數(shù)。
[javascript]?view plain?copy
function?success(data)
{
alert("success?data?=?"?+?data);
}
function?fail(data)
{
alert("fail?data?=?"?+?data);
}
function?progress(data)
{
alert("progress?data?=?"?+?data);
}
var?deferred?=?$.Deferred();
//?一起注冊回調(diào)
deferred.then(success,?fail,?progress);
//?分別注冊回調(diào)
deferred.done(success);
deferred.fail(fail);
deferred.progress(progress);
deferred.notify("10%");
deferred.resolve("ok");
當(dāng)然我們也可以像done()一樣,多次調(diào)用then()注冊回調(diào)函數(shù)。then()雖然可以這么使用,但是實(shí)際開發(fā)中一般不這么用,因?yàn)闆]有啥必要。JQuery1.8之前,這就是then()方法的作用。
2.Deferred.then()解決多個異步操作之間有依賴的問題,這才是then()真正有意義的場景。JQuery1.8之后,then()取代了過時的pipe()方法。這種場景下,我們需要使用Deferred.then()返回的新Promise對象。上面的第一種使用方式,我們忽略了Deferred.then()的返回值。
[javascript]?view plain?copy
var?deferred?=?$.Deferred();
//?使用then()注冊一個resolved狀態(tài)的回調(diào)函數(shù),并返回一個過濾后的promise
//?返回的filtered已經(jīng)不是原來的Deferred或者Promise對象了
var?filtered?=?deferred.then(function(?value?)?{
alert("trigger?Deferred?filter.value="+value);//5
return?value?*?2;
});
//?用過濾后的Promise再次注冊回調(diào)函數(shù)
filtered.done(function(?value?)?{
alert("filtered?value="?+?value);//10
});
deferred.resolve(?5?);
我們用deferred.then()注冊了一個完成狀態(tài)下的回調(diào)函數(shù),這個回調(diào)函數(shù)得到的值是5;之后用filtered這個新的Promise注冊回調(diào)函數(shù),這個回調(diào)函數(shù)中得到的值是10(第一個回調(diào)函數(shù)的返回結(jié)果)?,F(xiàn)在我們看下JQuery官方對then的解釋:
These filter functions can return a new value to be passed along to the promise's .done() or .fail() callbacks, or they can return another observable object (Deferred, Promise, etc) which will pass its resolved / rejected status and values to the promise's callbacks. If the filter function used is null, or not specified, the promise will be resolved or rejected with the same values as the original.
我們知道deferred.resolve()、deferred.reject()、deferred.notify()可以指定參數(shù)值,這個參數(shù)會傳遞給相應(yīng)狀態(tài)下的回調(diào)函數(shù)。如果我們使用的是done()、fail()、progress()注冊的回調(diào)函數(shù),那么某個狀態(tài)下的所有回調(diào)函數(shù)得到的都是相同參數(shù)。但是如果我們使用了then()注冊回調(diào)函數(shù),那么第一回調(diào)函數(shù)的返回值將作為第二個回調(diào)函數(shù)的參數(shù),同樣的第二個函數(shù)的返回值是第三個回調(diào)函數(shù)的參數(shù)??梢詫Ρ认旅娴?段代碼,體會下done()和then的差別。
[javascript]?view plain?copy
var?deferred?=?$.Deferred();
//?done()返回的仍然是原來的Deferred對象
var?done_ret?=?deferred.done(function(data){
alert("data="+data);//5
return?2?*?data;
});
alert(deferred?==?done_ret);//true
done_ret.done(function(data){
alert("data="+data);//5
});
deferred.resolve(?5?);
[javascript]?view plain?copy
var?deferred?=?$.Deferred();
//?then()返回的是一個新Promise對象
//then注冊的回調(diào)函數(shù)的返回值將作為這個新Promise的參數(shù)
var?then_ret?=?deferred.then(function(data){
alert("data="+data);//5
return?2?*?data;
});
alert(then_ret?==?deferred);//false
then_ret.done(function(data){
alert("data="+data);//10
});
deferred.resolve(?5?);
同樣地,Deferred.then也能夠?qū)崿F(xiàn)rejected和pending狀態(tài)的回調(diào)函數(shù)過濾。
[javascript]?view plain?copy
var?defer?=?$.Deferred();
var?filtered?=?defer.then(?null,?function(?value?)?{
return?value?*?3;
});
defer.reject(?6?);
filtered.fail(function(?value?)?{
alert(?"Value?is?(?3*6?=?)?18:?"?+?value?);
});
下面這段代碼可以實(shí)現(xiàn)chain tasks,解決異步操作中回調(diào)難的問題。
[javascript]?view plain?copy
var?defered?=?$.Deferred();
var?promise1?=?defered.then(function(data){
alert(data);//
return?data+="1";
});
var?promise2?=?promise1.then(function(data){
alert(data);//1
return?data+="2";
});
var?promise3?=?promise2.then(function(data){
alert(data);//12
return?data+="3";
});
promise3.done(function(data){
alert(data);//123
});
defered.resolve("");
正是由于then()這個特性,我們就可以上面復(fù)雜的AJAX嵌套改成如下形式:
[javascript]?view plain?copy
var?promise1?=?$.ajax(url1);
var?promise2?=?promise1.then(function(data){
return?$.ajax(url2,?{?"data":?data?});
});
var?promise3?=?promise2.then(function(data){
return?$.ajax(url3,?{?"data":?data?});
});
promise3.done(function(data){
//?data?retrieved?from?url3
});
attr方法可用2113來獲取或設(shè)置屬性5261,根據(jù)參數(shù)4102個數(shù)的不同來定時獲取還1653是設(shè)置內(nèi),當(dāng)只有1個參數(shù)時容表示獲取屬性值,當(dāng)有2個參數(shù)時表示設(shè)置元素屬性。
例如將圖片的寬度設(shè)置成150:
$("img").attr("width","150");
//參數(shù)有width和150,所以是設(shè)置
例如獲取圖片的寬度:
$("img").attr("width");
//參數(shù)只有width,所以此時是獲取
1、首先建立一個靜態(tài)頁面命名為js.html,標(biāo)題為“JS函數(shù)調(diào)用的方法”。
2、在js.html的頁面head/head之間加入 script/script。
3、在?script/script中加入一個js函數(shù) toalert,當(dāng)點(diǎn)擊一個button的時候彈出一個alert。
4、在body之中加入一個button,并且添加一個onclick點(diǎn)擊事件。
5、在onclick的事件中,加入js的toalert函數(shù)名,加載onclick事件的雙引號中即可。
6、為了讓button看的更明顯一些,可以設(shè)置一下button的樣式,設(shè)置寬為100px,高為30px,字的顏色為紅色。
7、用瀏覽器打開js.html,如果點(diǎn)擊按鈕能夠彈出“JS函數(shù)調(diào)用的方法”,說明調(diào)用js函數(shù)是成功的。
使用步驟如下:
1.jQuery給放到一個文件夾里面,方便我們待會引用這個jQuery,這里我就放到我項(xiàng)目的js文件夾里面。
2.然后我們來開始編輯HTML界面代碼。
3.使用script標(biāo)簽把jQuery引入到我們的HTML界面。src引號里面的就是我們的jQuery路徑名稱。
4.接著再書寫一個script標(biāo)簽對,里面寫上jQuery入口函數(shù),這樣,當(dāng)我們的HTML加載完成之后就會執(zhí)行我們的jQuery代碼
為jquery添加方法:
$.fn.my_alert?=?function(msg)?{
$(this).on('click',function(){
alert(msg);
})
}
div?class="btns"
button點(diǎn)我彈窗/button
/div
script
$('.btns?button').my_alert('Alert')
/script
使用? $.fn.[方法名]??梢蚤_發(fā)可復(fù)用的插件和組件