jQuery 1.4: 15個你應該知道的新特性(譯)

原文地址:http://net.tutsplus.com/tutorials/javascript-ajax/jquery-1-4-released-the-15-new-features-you-must-know

jQuery 1.4 最近剛剛發佈. 這個版本可不是一個簡單的改進,它不僅包含了很多新的特性,還改進了很多功能, 更在性能優化方面下了很大功夫, 本文將對這些新的特性和增強的部分進行討論,希望能對你有所幫助.

首先現在你可以從這裏下載最新的1.4的版本了: http://code.jquery.com/jquery-1.4.js

1. 傳遞屬性給jQuery

1.4之前的版本中jQuery就通過"attr”方法支持了添加屬性到元素集合中,"attr”方法不僅可以傳遞屬性名和值,也可以傳遞包含有多個屬性的對象集合。在1.4中,除了可以創建新的對象,現在它更能將屬性對象作爲參數傳遞給jQuery函數或對象自身。如你可以創建一個含有多個屬性的鏈接元素,通過1.4代碼如下:


jQuery(
'<a/>', {
id:
'gid',
href:
'http://www.google.com',
title:
'google非和諧版',
rel:
'external',
text:
'進入Google!'
});

你可能會注意到"text”屬性並且猜測它是幹嗎的,因爲a標籤是沒有"text”屬性的。呵呵,當你傳遞某些屬性時,jquery 1.4同樣會檢查並使用它自己的方法。因此上面的"text”屬性可以讓jQuery調用它的".text()”方法並將"進入Google!“作爲它的唯一參數。

這裏給出一個更好的例子:

jQuery('<div/>', {
id:
'foo',
css: {
fontWeight:
700,
color:
'green'
},
click:
function(){
alert(
'Foo被點擊過!');
}
});

"id”屬性是作爲一個普通屬性被添加的。但"css”和"click”屬性則對應特定的jQuery方法。上面的代碼在1.4之前一種寫法如下:

jQuery('<div/>')
.attr(
'id', 'foo')
.css({
fontWeight:
700,
color:
'green'
})
.click(
function(){
alert(
'Foo被點擊過!');
});

 

更多關於jQuery特性

2. 所有的東西都可以"until“了

1.4新增了三個對DOM操作的方法,他們分別是"nextUntil",  "prevUntil"  和  "parentsUntil"。 這些方法會按照某個順序去遍歷DOM對象直到滿足指定的篩選條件。假設我們有一個水果列表:

<ul>
<li>蘋果</li>
<li>香蕉</li>
<li>葡萄</li>
<li>草莓</li>
<li>例子</li>
<li>桃子</li>
</ul>

如果你想選擇所有在"Apple”和"Strawberry”之間的元素。代碼可以這樣寫:

jQuery('ul li:contains(蘋果)').nextUntil(':contains(梨子)');
// 得到 香蕉,葡萄,草莓

更多關於: prevUntil, nextUntil, parentsUntil

3. 綁定多個事件

與通過jquery鏈綁定多個方法到一起相比,現在你可以通過一次調用來綁定所有這些事件,如:

jQuery('#foo).bind({
click: function() {
// 具體代碼
},
mouseover: function() {
// 具體代碼
},
mouseout: function() {
// 具體代碼
}
})

 

你也可以通過 ".one()"方法操作。

更多關於.bind(…)

4. Per-Property Easing

與給一個動畫僅僅定義一個緩動效果相比,現在你可以給你想要添加動畫效果的屬性定義不同的緩動函數了。jQuery包含兩個緩動函數,旋轉(默認)和線性移動。如果你需要其他的效果的話,你需要去單獨下載它們 !

要給每個屬性指定一個緩動函數的話,你可以簡單的通過屬性數組來達到目的,在數組中,第一個值是你想要實現的效果值,第二個參數則是使用的緩動函數,如:

jQuery('#foo').animate({
left:
500,
top: [
500, 'easeOutBounce']
},
2000);

 

查看代碼演示!

你也可以以鍵值對的形式在那些可選設置項中單獨指定屬性緩動函數:

jQuery('#foo').animate({
left:
500,
top:
500
}, {
duration:
2000,
specialEasing: {
top:
'easeOutBounce'
}
});

 

原文作者注 - 小小謙虛一下,這個新特性是作者James Padolsey的主意!

更多關於per-property easing

5. 新的Live事件!

1.4添加了對"submit”,"change”,"focus”,和"blur”事件的委託支持。在jQuery中,我們可以使用".live()”方法去委託事件。這在你需要註冊事件到大量元素中或新的元素需要不斷的被添加(使用".live()”會比不斷的重新綁定事件更高效)將會很有用。

但是,注意!如果你需要委託"focus”和"blur”事件的時候,你必須使用"focusin”和"focusout”事件名稱!

jQuery('input').live('focusin', function(){
//具體操作
});

 

6. 控制函數的上下文

jQuery 1.4提供了一個新的叫"proxy”的函數,它在jQuery命名空間下。該函數需要兩個參數,不管是代碼域還是方法名,或者是函數和其所處的代碼域。t"this”關鍵字在JavaScrip中是相當難掌握的。有時候你可能期待它指的是你之前創建的某個對象,而不是一個你可能沒想到的元素。

舉例說明,假設我們有一個"app”對象,它有兩個屬性,一個是"clickHandler”方法, 另外一個則是一個config對象。

var app = {
config: {
clickMessage:
'你好!'
},
clickHandler:
function() {
alert(
this.config.clickMessage);
}
};

當我們調用如"app.clickHandler()"時,"clickHandler"會將"app”作爲其上下文。這意味着在這裏"this"關鍵字將允許其訪問"app"。這在我們簡單調用下面函數時沒什麼問題:

app.clickHandler(); // "你好!" 消息觸發

讓我們試試將其作爲事件綁定會有什麼情況:

jQuery('a').bind('click', app.clickHandler);

 

當我們點擊一個鏈接的時候什麼都不會發生,函數不會工作。這是因爲jQuery(其他任何正常的事件模型同樣如此)默認會把目標元素a設置成爲事件的上下文。即"this”現在其實是指剛剛被點擊過的元素a。但我們實際上並不想這樣子的。我們期待"this”應該被設置爲"app”.在jQuery 1.4中實現這個再簡單不過了:

jQuery('a').bind(
'click',
jQuery.proxy(app,
'clickHandler')
);

 

現在無論什麼時候一個鏈接被點擊到,"你好"的消息都會被觸發了!

proxy函數會返回一個你的函數被"包裝過"之後的對象,在該對象中,"this”被設置成任意你指定的對象。這在其他的情景下同樣有用,如傳遞迴調函數給其他的jQuery對象或者一些插件的時候。

更多關於jQuery.proxy

7. 在動畫中添加停頓

現在你可以再你的動畫隊列中添加停頓效果了。事實上,任何隊列中都可以添加該函數,但最常用的情況應該還是在使用"fx”隊列的時候。這允許你在多個動作中間添加暫停而不需要通過回調函數去調用"setTimeout"。".delay()" 函數的第一個參數是你想停頓的毫秒數。

jQuery('#foo')
.slideDown()
// Slide down
.delay(200) // 停頓 200 ms
.fadeIn(); // Fade in

如果你想給其他不是默認的"fx”的隊列也添加停頓的話,這時候,你需要將隊列名作爲第二個參數傳遞給".delay()"。

更多關於.delay(…)

8. 檢查元素是否擁有某對象

通過".has()”方法,jQuery 1.4使得檢查一個元素(或者集合)是不是有某對象變得相當簡單。從程序角度看,它和jQuery的selector過濾器":has()”是一樣的。該方法會返回在當前集合中所有包含有至少一個符合條件的元素數組。

jQuery('div').has('ul');

 

上面方法會返回所有包含有UL元素的DIV元素數組。在這種情況下,你可能會更傾向於簡單使用選擇器的過濾器(":has()"), 但當你需要通過代碼過濾一個數組的時候,該方法仍會很有用。

1.4同樣在jQuery命名空間下添加了新的"contains"函數。這是一個低級的函數,它接受兩個DOM節點作爲參數。它會返回一個布爾值來表示後面一個元素是否在前面一個元素中存在。如:

jQuery.contains(document.documentElement, document.body);
// 返回true - <body>在<html>存在

 

更多關於: .has(…), jQuery.contains(…)

9. 去掉元素的包裝

".warp()”已經在jQuery中有段日子了,現在跟它對應的".unwrap()”方法也被加進到1.4中了。這個方法剛好跟warp()方法相反。假設有下面的DOM結構:

<div>
<p>Foo</p>
</div>

我們可以用下面的函數去掉段落元素的外層:

jQuery('p').unwrap();

 

最終的DOM結構如下:

<p>Foo</p>

注意,這個方法處理比較簡單,它會移掉任何元素的父節點。

更多關於 .unwrap(…)

10. detach() vs remove()

新的".detach()”方法允許你從DOM中移掉元素,這跟".remove()”很像。但與".remove()”有本質不同的是"detach()”不會將jQuery賦給該元素的數據也給註銷掉。這包含通過".data()”和其他任意的通過jQuery的事件系統添加的事件等數據。

如果你想從DOM中移除某個元素,但你又可能需要在後面的某個時候把該元素重新添加到DOM中的時候這個函數將會很有用,這時候該元素的事件和其他的數據都會被保留下來。

var foo = jQuery('#foo');
// 綁定一個重要的事件
foo.click(function(){
alert(
'Foo!');
});
foo.detach();
// 從 DOM中移除事件
//
… 其他操作
foo.appendTo('body'); // 將元素重新加入到 DOM
foo.click(); // 彈出 "Foo!"

更多 .detach(…)

11. index(…) 加強

jQuery 1.4中我們有兩種使用".index()”方法的方式。首先,你可以僅僅將一個元素自身作爲參數,這樣你可以得到該元素在當前集合中所處的索引位置值。

如果不設置參數的話,現在會返回該元素的兄弟節點。因此,假設有下面的DOM結構:

<ul>
<li>蘋果</li>
<li>香蕉</li>
<li>葡萄</li>
<li>草莓</li>
<li>例子</li>
<li>桃子</li>
</ul>

當一個節點被點擊的時候,你如果想找到在所有的節點集合中被單擊的節點的位置,你可以這樣寫:

jQuery('li').click(function(){
alert( jQuery(this).index() );
});

 

jQuery 1.4還允許你指定一個選擇器作爲".index()”的第一個參數,這樣它會返回該元素在選擇器中產生的元素集合中的位置。

最後需要注意的是,如果該元素在集合中存在的話,該函數會返回一個其位置的整數,如果不存在,則返回-1。

更多關於 .index(…)

12. DOM 操作的方法支持回調函數

大部分對DOM進行操作的函數現在都支持傳遞函數作爲唯一參數了(如果是".css()”和".attr()”的情況的話,它會作爲第二參數)。該函數會在集合中的每個元素上都執行一次,從而確定哪些應作爲該函數的實際值提供給回調函數調用。

下面給出所有支持該功能的函數列表:

通過回調函數,你可以通過"this”訪問數組中的當前元素,還可以通過第一個參數得到它在數組中的位置。

jQuery('li').html(function(i){
return '該列表中的索引位置: ' + i;
});

 

同樣,你也可以通過上面的某些方法得到另外一個參數,如果你調用一個setter方法(如".html()”或".attr(‘href’)")你就可以直接訪問當前的值了。如:

jQuery('a').attr('href', function(i, currentHref){
return currentHref + '?foo=bar';
});

 

正如上面看到的,在使用".css()" 和 ".attr()" 方法時,因爲第一個參數需要被用作指定那些你需要設置或改變的屬性名,你需要將回調函數作爲第二參數。

jQuery('li').css('color', function(i, currentCssColor){
return i % 2 ? 'red' : 'blue';
});

 

13. 對象類型判斷

jQuery 1.4添加了兩個新的方法(直接放到了jQuery命名空間下面)以方便我們來判斷當前處理的對象的類型。

首先是方法"isEmptyObject”,顧名思義,這個函數會返回一個布爾值來表明傳遞的對象是不是空對象(缺乏屬性--無論是對象自身還是繼續的對象)。其次是方法"isPlainObject”,它會返回一個布爾值來表明操作的對象是否是一個簡單的js對象(指通過"{ }"或者"new Object”創建的對象)。

jQuery.isEmptyObject({}); // true
jQuery.isEmptyObject({foo:1}); // false
jQuery.isPlainObject({}); // true
jQuery.isPlainObject(window); // false
jQuery.isPlainObject(jQuery()); // false

 

更多關於: isPlainObject(…), isEmptyObject(…)

14. Closest(…) 增強

jQuery的".closest()”方法現在可以接受一組選擇器了。如果開發人員想遍歷一個元素的祖先,並在其中查找離其最近的那些符合某些特徵的節點的時候,這會很有用。

另外,該函數現在也接受將上下文作爲第二參數了。這意味着你現在可以控制你想在DOM中遍歷的元素範圍了。雖然這兩種情況我們一般很少用到,不過它們在jQuery內部被很好的使用。

更多關於 .closest(…)

15. 新的事件! focusIn 和focusOut

上文已經提到,爲了委託"focus”和"blur”事件你需要這些新的事件,它們是"focusin”和"focusout”。這些新的事件將允許你在一個元素或其子元素獲取焦點的時候進行相應操作。

jQuery('form')
.focusin(
function(){
jQuery(
this).addClass('focused');
});
.focusout(
function(){
jQuery(
this).removeClass('focused');
});

 

同時應該注意的是這兩個事件都不是按冒泡順序傳遞,它們將按捕獲順序觸發。這意味着最外層的(也即祖先)元素會在實際節點事件觸發前被觸發。

更多關於 focusInfocusOut 事件。

大家開始玩轉jQuery 1.4吧。它是目前jQuery發佈的一個最有前瞻性,最多特性支持和表現最好的一個版本!

好了,本文就到這裏了。我已經開始準備跟隨這個改變了,我相信這些改變同樣會讓你印象深刻的!

如果你還沒準備好,你可以看看 "jQuery14天", 一個專門爲jQuery 1.4爲做的在線站點,對了,另外還是爲了慶祝jQeury的四歲生日!

最後不要忘了去閱讀 API 文檔 !

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章