jQuery 1.4官方文檔中文版
本文來自ajax之家,為jQuery 1.4官方文檔中文版的發(fā)布公告。jQuery 1.4在本月中旬發(fā)布。
為了慶祝jQuery的四周歲生日, jQuery的團(tuán)隊(duì)榮幸的發(fā)布了jQuery Javascript庫的最新主要版本! 這個(gè)版本包含了大量的編程,測(cè)試,和記錄文檔的工作,我們?yōu)榇烁械胶茯湴痢?/p>
我要以個(gè)人的名義感謝 Brandon Aaron, Ben Alman, Louis-Rémi Babe, Ariel Flesler, Paul Irish, Robert Kati?, Yehuda Katz, Dave Methvin, Justin Meyer, Karl Swedberg, and Aaron Quint。謝謝他們?cè)谛迯?fù)BUG和完成這次發(fā)布上所做的工作。
下載(Downloading)
按照慣例,我們提供了兩份jQuery的拷貝,一份是最小化的(我們現(xiàn)在采用Google Closure作為默認(rèn)的壓縮工具了),一份是未壓縮的(供糾錯(cuò)或閱讀)。
- jQuery壓縮 (23kb Gzipped) http://code.jquery.com/jquery-1.4.min.js
- jQuery常規(guī) (154kb) http://code.jquery.com/jquery-1.4.js
另外,Google也在他們的服務(wù)器上放置了一份jQuery的拷貝。這份拷貝會(huì)自動(dòng)的最小化然后壓縮 – 并且放在Google最快的緩存服務(wù)器上。
- http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js
你可以在你的站點(diǎn)上直接引用上面的URL,這樣就可以享受迅速加載jQuery的性能優(yōu)勢(shì)了。
就jQuery1.4來說,我們努力的減少大規(guī)模升級(jí)中的麻煩 – 通過保持所有public函數(shù)的簽名。即使如此,還請(qǐng)通讀可能會(huì)造成問題的變更列表,這樣能夠了解哪些變更可能會(huì)給你的應(yīng)用造成問題。
(功能) Features
下面的內(nèi)容概括了jQuery1.4里加入的變更和功能。另外所有的變更都已經(jīng)在jQuery 1.4 的文檔里記錄了。
熱門方法經(jīng)過了性能上的大”檢修”
不少比較熱門的和常用的jQuery方法在1.4里被重寫了。(譯注:重寫了方法的內(nèi)部,外部調(diào)用沒有大幅度改變) 我們分析源碼的時(shí)候發(fā)現(xiàn)我們能夠獲得大幅的性能提升,通過把jQuery和自己比較: 查看內(nèi)部函數(shù)被調(diào)用了多少次,然后努力降低源碼的復(fù)雜度(譯注:計(jì)算機(jī)算法中的Complexity)
View the cropped chart.
在1.4版里我們顯著的降低了大部分熱門jQuery方法的的復(fù)雜度。
更易用的設(shè)置函數(shù) (Easy Setter Functions)
算來已經(jīng)有一陣了,你們已經(jīng)可以給.attr()傳遞一個(gè)函數(shù),然后這個(gè)函數(shù)的結(jié)果會(huì)被用來賦給相應(yīng)的HTML屬性(attribute)上。這個(gè)功能現(xiàn)在被移植到所有的設(shè)置函數(shù)了: .css(), .attr(), .val(), .html(), .text(), .append(), .prepend(),.before(), .after(), .replaceWith(), .wrap(), .wrapInner(), .offset(), .addClass(), .removeClass(), 以及 .toggleClass().
另外, 對(duì)于下面幾個(gè)方法,當(dāng)前的值會(huì)被作為第2個(gè)變量傳遞給這個(gè)函數(shù)。.css(), .attr(), .val(), .html(), .text(), .append(),.prepend(), .offset(), .addClass(), .removeClass(), 以及 .toggleClass().
這樣代碼就可以這樣寫:
// 找出所有A標(biāo)簽里的'&'字符,然后用一個(gè)span標(biāo)簽包圍 $('a').html(function(i,html){ return html.replace(/&/gi,'&'); }); // 給一些鏈接的title屬性加些信息 $('a[target]').attr("title", function(i,title){ return title + " (新窗口打開)"; });
Ajax
嵌套參數(shù)的序列化 (jQuery.param() 文檔, Commit 1, Commit 2)
jQuery 1.4在jQuery.param方法里加入了嵌入?yún)?shù)序列化的支持,借用了PHP編程里興起的,而后又被Ruby on Rails推廣開來的方式。
舉例來說,
{foo: ["bar", "baz"]} 會(huì)被序列化為 “foo[]=bar&foo[]=baz”.
在jQuery 1.3版里, {foo: ["bar", "baz"]} 曾被序列化為 “foo=bar&foo=baz”. 但是,這樣做沒用辦法將只含有一個(gè)元素的陣列編碼。如果你需要舊的序列化方式,你可以設(shè)置傳統(tǒng)Ajax設(shè)置來進(jìn)行切換。(使用jQuery.ajaxSettings.traditional進(jìn)行全局切換,或者根據(jù)情況單獨(dú)切換。
總共有3種方式可以切換到舊的序列化方式:
// 全局改變序列化方式 (使用舊的) jQuery.ajaxSettings.traditional = true; // 指定情況使用舊的序列化方式 jQuery.param( stuff, true ); // 針對(duì)一個(gè)單獨(dú)的Ajax請(qǐng)求使用舊的序列化方式 $.ajax({ data: stuff, traditional: true });
更多信息參見: jQuery.param() 文檔, jQuery.ajax() 文檔, Commit, Code
JSON和腳本類型通過”content-type”自動(dòng)識(shí)別。 (jQuery.ajax 文檔, Commit 1, Commit 2)
如果一個(gè)Ajax請(qǐng)求的回復(fù)的媒體類型是JSON(application/json), dataType默認(rèn)設(shè)為”json”(如果dataType沒有被指明)。另外,如果回復(fù)的媒體類型是 Javascript(application/javascript), dataType默認(rèn)設(shè)為”script”(同樣,如果dataType沒有明確指明), 這種情況下,腳本會(huì)自動(dòng)運(yùn)行。
加入了Etag的支持 (jQuery.ajax() 文檔, Commit)
默認(rèn)設(shè)置下, jQuery會(huì)忽略Ajax請(qǐng)求的”Last-Modified”頁頭。這樣做是為了忽略瀏覽器的緩存。設(shè)置ifModified:true就可以使 jQuery使用可用的緩存。jQuery1.4還會(huì)發(fā)出”If-None-Match”的頁頭如果你設(shè)置了ifModified選項(xiàng)。
嚴(yán)格JSON模式,本地的JSON.parse方法 (jQuery.ajax() 文檔, Commit 1, Commit 2, Commit 3)
jQuery 1.3和以前的版本曾使用Javascript的eval對(duì)引入的JSON解析。1.4版則會(huì)使用本地的JSON解析器,前提是如果有本地的解析器可用。它也會(huì)對(duì)引入的JSON進(jìn)行校驗(yàn)。所以在jQuery.getJSON方法里,或當(dāng)一個(gè)Ajax請(qǐng)求的dataType是”json”的時(shí)候,jQuery會(huì)拒絕不合標(biāo)準(zhǔn)的JSON(例如{foo: "bar"})。
序列化HTML5的元素 (jQuery.param() 文檔, Commit)
新的HTML5輸入方法 (比如’datetime’和’range’)在序列化.serialize()一個(gè)表單的時(shí)候會(huì)被包括在內(nèi)。
Ajax請(qǐng)求的環(huán)境 (jQuery.ajax() 文檔, Commit)
你可以附加一個(gè)”環(huán)境”到Ajax請(qǐng)求上,所有的回調(diào)函數(shù)里都會(huì)擁有同樣的”環(huán)境”設(shè)置(這樣可以簡(jiǎn)化你的代碼,盡可能避免使用閉合,或是其他對(duì)象)。
jQuery.ajax({ url: "test.html", context: document.body, success: function(){ jQuery(this).addClass("done"); } });
請(qǐng)求成功回調(diào)函數(shù)的第三個(gè)參數(shù)會(huì)被設(shè)為原始的XHR對(duì)象 (jQuery.ajax() 文檔, Commit)
所有的Ajax請(qǐng)求的成功回調(diào)函數(shù)現(xiàn)在都會(huì)收到原始的XMLHttpRequest對(duì)象,作為第三個(gè)參數(shù)。之前這個(gè)XHR對(duì)象只能通過$.ajax一類方法的返回值來獲取。
明確設(shè)置”Content-Type” (jQuery.ajax() 文檔, Commit)
在1.3版,如果沒有實(shí)際數(shù)據(jù)發(fā)送,jQuery.ajax的contentType會(huì)被忽略。1.4版里,contentType將總是和請(qǐng)求一同發(fā)送。這修復(fù)了某些后臺(tái)憑靠”Content-Type”頁頭判斷回復(fù)類別所造成的問題。
明確設(shè)置JSONP回調(diào)函數(shù)的名字 (jQuery.ajax 文檔, Commit)
你可以使用jQuery.ajax()方法的jsonpCallback選項(xiàng),通過名字來指定JSONP的回調(diào)函數(shù)。
防止啟動(dòng)前跨域XHR (Commit)
跨域Ajax(針對(duì)提供支持的瀏覽器)將更易用,因?yàn)槟J(rèn)設(shè)置下,啟動(dòng)前XHR被阻止了。(TODO)
jQuery.ajax()現(xiàn)在使用”onreadystatechange”事件替換了計(jì)時(shí)器 (Commit)
使用”onreadystatechange”替換了輪流探詢,Ajax請(qǐng)求現(xiàn)在將使用更少的資源
元素屬性 (Attributes)
.css()和.attr() 的性能被優(yōu)化了。
<
.attr()方法多了一個(gè)設(shè)置函數(shù)作為參數(shù) (.attr() 文檔)
你不但可以將一個(gè)函數(shù)用在.attr()里,還可以在這個(gè)函數(shù)里使用屬性的當(dāng)前值。
jQuery('<img src="enter.png" alt="enter your name" />') .attr("alt", function(index, value) { return "Please, " + value; });
.val( Function ) (.val() 文檔)
<input class="food" type='text' data-index="0" /> <input class="food" type='text' data-index="1" />
jQuery("input:text.food").hide(); jQuery("<ul class='sortable'><li>Peanut Butter</li><li>Jelly</li></ul>" ) .sortable() .bind("endsort", function() { $(":text.food").val(function() { return $("ul.sortable li:eq(" + $(this).attr("data-index") + ")").text(); }); });
text和CDATAHTML元素也支持.text()方法了 (.text() 文檔, Commit)
核心 (Core)
快捷元素創(chuàng)建 (jQuery() 文檔, Commit)
現(xiàn)在當(dāng)你需要使用jQuery函數(shù)創(chuàng)建一個(gè)元素的時(shí)候,你可以同時(shí)附遞一個(gè)對(duì)象來指定屬性值和事件:
jQuery("", { id: "foo", css: { height: "50px", width: "50px", color: "blue", backgroundColor: "#ccc" }, click: function() { $(this).css("backgroundColor", "red"); } }).appendTo("body");
對(duì)象里的鍵值的名字與相關(guān)的jQuery的方法的名字是對(duì)應(yīng)的,對(duì)象的值會(huì)被作為參數(shù)傳遞給jQuery的方法。
(譯注:譬如$("<a>link</a>", {css:{background:"#ccc"}});相當(dāng)于$("<a>link</a>")).css("background", "#ccc");
.eq(-N), .get(-N) (負(fù)指數(shù)) (.eq() 文檔, .get() 文檔, Commit)
你現(xiàn)在可以在.get()和.eq()方法里使用負(fù)數(shù)。譬如,你要選擇倒數(shù)第2個(gè)div元素,或者是倒數(shù)第2個(gè)DOM對(duì)象:
$("div").eq(-2); $("div").get(-2);
新的.first()和.last()方法 (.first() 文檔, .last() 文檔, Commit)
方便起見, 新增的.first()和.last()方法等同于.eq(0)和.eq(-1).
新的.toArray()方法 (.toArray() 文檔, Commit)
.get()方法自始就是從jQuery集合里返回一個(gè)陣列。為了能夠更明確, 你可以用.toArray()來達(dá)到一樣的效果。(譯注:這里應(yīng)該是為了以后的版本留出空間,譬如以后可能會(huì)加入.toList()方法,到時(shí)候就會(huì)易于區(qū)分。) 不過,和.get()不一樣的是,.toArray()不接受參數(shù)。
jQuery()返回一個(gè)空集 (jQuery() 文檔, Commit)
在jQuery 1.3中,jQuery()方法返回僅包括document的jQuery集合。這個(gè)可以用來創(chuàng)建一個(gè)空集,然后動(dòng)態(tài)加入一些元素。注: jQuery().ready()方式在1.4中依然有效,但是被指示陳舊了。請(qǐng)使用jQuery(document).ready()或者jQuery(function(){})。
jQuery(“TAG”) (Element Selector 文檔, Commit)
當(dāng)使用單個(gè)標(biāo)簽名字的時(shí)候jQuery會(huì)使用更快捷的路徑。
jQuery(“<div>”), jQuery(“<div/>”) 和 jQuery(“<div></div>”) (jQuery() 文檔, Commit)
現(xiàn)在這三個(gè)方法都使用同一個(gè)代碼路徑了(document.createElement), 來優(yōu)化jQuery("<div></div>")的性能。注意,如果你指定了屬性,將會(huì)使用瀏覽器本身的語法分析(通過設(shè)置innerHTML)。
樣式 (CSS)
.css()方法在性能是以前的2倍。
.addClass(), .removeClass(), 和 .hasClass()這幾個(gè)方法在性能上是以前的3倍
.toggleClass()可以切換多個(gè)css類了 (.toggleClass() 文檔, Commit)
你可以通過.toggleClass()調(diào)用多個(gè)css類的名字來切換他們。
$("div").toggleClass("current active");
數(shù)據(jù)
.data()返回對(duì)象, .data(Object)設(shè)置對(duì)象 (.data() 文檔, Commit 1, Commit 2)
有時(shí)候你可能需要在一個(gè)元素上附加一個(gè)復(fù)雜的對(duì)象。一個(gè)常見的例子是你需要從一個(gè)元素身上復(fù)制所有的數(shù)據(jù)到令一個(gè)元素上。在jQuery 1.4里, 不使用任何參數(shù)調(diào)用.data()時(shí),.data會(huì)返回一個(gè)復(fù)雜對(duì)象。(譯注: 包含所有鍵-值對(duì)的對(duì)象。) 調(diào)用.data(Object) 則會(huì)設(shè)置這個(gè)對(duì)象。注意這個(gè)對(duì)象還包括了元素上綁定的事件,所以用的時(shí)候要小心。
除非需要, 不然不會(huì)創(chuàng)建數(shù)據(jù)緩存。 (Commit 1, Commit 2, Commit 3)
jQuery使用一個(gè)獨(dú)特的自定義屬性來獲取特定元素上附加的數(shù)據(jù)。當(dāng)查找數(shù)據(jù),但是沒有新加的數(shù)據(jù)的時(shí)候,jQuery會(huì)盡量避免創(chuàng)建這個(gè)自定義屬性。這樣可能會(huì)提高性能,同時(shí)還會(huì)在這種情況下避免污染DOM。
效果 (Effects)
單個(gè)屬性緩進(jìn)緩出 (Per-property Easing 文檔, Commit)
除了能夠給一個(gè)動(dòng)態(tài)效果指定緩進(jìn)出函數(shù)外,你現(xiàn)在可以指定每個(gè)屬性的緩進(jìn)出函數(shù)了。James Padolsey的blog上有更進(jìn)一步的信息和演示。
$("#clickme").click(function() { $("div").animate({ width: ["+=200px", "swing"], height: ["+=50px", "linear"], }, 2000, function() { $(this).after("<div>Animation complete.</div>"); }); });
事件 (Events)
新方法: jQuery.proxy() (jQuery.proxy() Documenation, Commit 1, Commit 2)
如果你需要保證一個(gè)函數(shù)內(nèi)的”this”恒定地保持某個(gè)值, 你可以用jQuery.proxy獲得一個(gè)相同作用域的函數(shù)。
var obj = { name: "John", test: function() { alert( this.name ); $("#test").unbind("click", obj.test); } }; $("#test").click( jQuery.proxy( obj, "test" ) );
多個(gè)事件綁定 (.bind() 文檔)
你可以通過遞入一個(gè)對(duì)象來一次性綁定元素的多個(gè)事件。
$("div.test").bind({ click: function(){ $(this).addClass("active"); }, mouseenter: function(){ $(this).addClass("inside"); }, mouseleave: function(){ $(this).removeClass("inside"); } });
‘change’和’submit’事件規(guī)范化 (Change 文檔, Submit 文檔)
普通的或是即時(shí)的change和submit事件可以在各種瀏覽器上穩(wěn)定工作了。我們覆蓋了IE里的change和submit, 替換為與其他瀏覽器相同的事件。
新的事件: ‘focusin’ and ‘focusout’ (.focusin() 文檔, .focusout() 文檔, Commit)
focusin和focusout在一般情況下等同于focus和blur, 但是多了向父元素傳遞的作用。如果你自己編寫你的事件代理模式(TODO), 這個(gè)功能將對(duì)你有很大幫助。請(qǐng)注意對(duì)focus和blur使用live()方法將不會(huì)起作用; 在設(shè)計(jì)的時(shí)候我們根據(jù)DOM事件規(guī)范決定不使其向父元素傳遞事件。
$("form").focusout(function(event) { var tgt = event.target; if (tgt.nodeName == "INPUT" && !tgt.value) { $(tgt).after("nothing here"); } });
所有的事件都可以成為即時(shí)事件 (.live() 文檔)
除了ready, focus (用focusin), 和 blur (用focusout)以外, 所有能用.bind()綁定的事件都可以成為即時(shí)事件。
在live()所支持的事件里,我們對(duì)能夠支持下面這幾個(gè)額外的事件感到尤其驕傲。通過.live()里的事件代理, 1.4版實(shí)現(xiàn)了對(duì)change, submit, focusin, focusout, mouseenter, 以及mouseleave事件的跨瀏覽器支持。
注: 如果你需要即時(shí)的focus事件,你應(yīng)該用focusin和focusout, 而不要用focus和blur, 因?yàn)榫拖袂懊嫣岬降?focus和blur不向上傳遞。
還有, live()也接受數(shù)據(jù)對(duì)象作為參數(shù)了, 同bind()方法一樣 (Commit)
live/die也支持環(huán)境變量了 (Commit)
現(xiàn)在可以在綁定事件的時(shí)候給選擇符指定一個(gè)環(huán)境。如果環(huán)境被指定了, 只有屬于這個(gè)環(huán)境下的元素才會(huì)被綁定事件。在創(chuàng)建即時(shí)事件的時(shí)候, 元素本身不需要已經(jīng)被定義, 但是環(huán)境必須被創(chuàng)建。
確定ready事件至少含有body元素 (Commit)
jQuery現(xiàn)在會(huì)檢查body是不是存在,如果不存在,會(huì)對(duì)body進(jìn)行輪流探詢。
在不需要手動(dòng)處理內(nèi)存溢出的非IE瀏覽器中, 卸載的速度提高了。 (Commit)
DOM操作 (Manipulation)
在jQuery 1.4里一系列的DOM操作方法的性能都有巨大的提升。
.append(), .prepend(), .before(), and .after()的性能提高了。
.html()的性能提高到以前的3倍。
.remove()和.empty()的速度則達(dá)到以前的4倍.
新方法: .detach() (.detach() 文檔, Commit)
detach()將一個(gè)元素從DOM里移除, 但是并不卸載關(guān)聯(lián)的事件處理函數(shù)。這個(gè)方法可用于暫時(shí)性的將一個(gè)元素移除,執(zhí)行相關(guān)操作,然后返回。
var foo = $("#foo").click(function() { // 相關(guān)操作 }); foo.detach(); // foo保留了相關(guān)處理函數(shù) foo.appendTo("body");
新的unwrap()方法 (documentation, commit)
unwrap()方法拿到一個(gè)已知的父元素的子元素,然后將父元素用子元素替換。(譯注: 將子元素從”包裹”里拿出來, 因名unwrap)。如此這般:
<body> <div> <p>annie</p> <p>davey</p> <p>stevie</p> </div> </body>
$('div').unwrap();
<body> <p>annie</p> <p>davey</p> <p>stevie</p> </body>
domManip方法里的緩存 (commit)
jQuery會(huì)將jQuery("<div>")和.after("<div>")一類方法創(chuàng)建的節(jié)點(diǎn)記入緩存。這樣, 對(duì)于利用這些方法, 使用字符串進(jìn)行DOM操作的頁面,性能將有極大的提高。
無連接的節(jié)點(diǎn)間的before, after, replaceWith操作 (commit)
現(xiàn)在你可以對(duì)還沒有放置到DOM Tree上的節(jié)點(diǎn)進(jìn)行before, after, 和replaceWith的操作了。意味著你可以先對(duì)節(jié)點(diǎn)進(jìn)行復(fù)雜的操作, 待完成后再放到合適的DOM位置上。這樣也能盡量避免操作過程中造成重新排版。
jQuery("<div>").before("<p>Hello</p>").appendTo("body")
.clone(true) 也會(huì)復(fù)制關(guān)聯(lián)數(shù)據(jù) (clone 文檔, commit)
1.3版中, .clone(true)雖然也是深度復(fù)制, 但是沒有復(fù)制關(guān)聯(lián)的數(shù)據(jù)。1.4版里,它則會(huì)復(fù)制數(shù)據(jù), 同時(shí)還包括所有的事件。這點(diǎn)上和jQuery.extend在語義想同的, 所以普通對(duì)象和陣列會(huì)被復(fù)制, 但是自定義的對(duì)象則不會(huì)。
位移 (Offset)
.offset( coords | Function ) (.offset() 文檔, commit)
現(xiàn)在可以設(shè)置元素的位移了! 和所有的設(shè)置函數(shù)一樣, offset也可以接受一個(gè)函數(shù)作為第二個(gè)參數(shù)。
隊(duì)列 (Queueing)
隊(duì)列經(jīng)歷了一次大修, 使用隊(duì)列會(huì)比使用默認(rèn)的fx更易掌握。
新的 .delay() 方法 (.delay() 文檔, commit)
.delay()方法會(huì)根據(jù)參數(shù)滯后若干毫秒執(zhí)行隊(duì)列里剩下的對(duì)象。默認(rèn)的它會(huì)使用”fx”隊(duì)列。但你可以選擇性的通過delay方法的第二個(gè)參數(shù)選擇其他隊(duì)列。(譯注:每個(gè)隊(duì)列都以一個(gè)名字識(shí)別。)
$("div").fadeIn().delay(4000).fadeOut();
隊(duì)列里的next (.queue() 文檔, commit)
jQuery 1.4版里, 當(dāng)隊(duì)列里的一個(gè)函數(shù)被調(diào)用的時(shí)候,第一個(gè)參數(shù)會(huì)被設(shè)為另一個(gè)函數(shù)。當(dāng)后者被調(diào)用的時(shí)候, 會(huì)自動(dòng)排除隊(duì)列里的下一個(gè)對(duì)象, 以此來推動(dòng)隊(duì)列到下一步。
jQuery("div").queue("ajax", function(next) { var self = this; jQuery.getJSON("/update", function(json) { $(self).html(json.text); next(); }; }).queue("ajax", function() { $(this).fadeIn(); });
.clearQueue() (clearQueue 文檔, commit)
隊(duì)列可以被清空了。這個(gè)方法會(huì)移除隊(duì)列里所有未執(zhí)行的函數(shù), 但不會(huì)移除正在運(yùn)行的函數(shù)。無參數(shù)的情況下調(diào)用.clearQueue()方法將會(huì)清空默認(rèn)的”fx”隊(duì)列。
選擇符 (Selectors)
“#id p”效率更高 (commit)
所有以ID開頭的選擇符都得到了優(yōu)化, 能夠在瞬間得到返回值。所有以ID為開頭的選擇符速度將一直快于其他選擇符。
頁面遍訪 (Traversing)
.index(), .index(String) (index 文檔, commit)
.index() 方法經(jīng)過重寫, 變得更加直觀和靈活。
你可以獲得一個(gè)元素相對(duì)于同父元素的指數(shù):
// 計(jì)算第一個(gè) <li class="current"> 元素在它所有的同父元素中的指數(shù): $("li.current").index()
你也可以獲得一個(gè)元素在一個(gè)jQuery元素集合中的指數(shù), 這個(gè)集合可以用一個(gè)選擇符或者是一個(gè)DOM元素來指定:
// 計(jì)算這個(gè) <h3 id="more-info"> 元素在頁面上所有 <h3> 元素里的指數(shù): $("#more-info").index("h3")
新的.has()方法 (has 文檔, commit)
這個(gè)方法相當(dāng)于選擇符里的:has()過濾法。它拿到一個(gè)jQuery集合,返回含有指定選擇符的元素。
新的 .nextUntil(), .prevUntil(), .parentsUntil() 方法 (.nextUntil() 文檔, .prevUntil() 文檔, .parentsUntil() 文檔,commit)
新的”until”方法類似于.nextAll(), .prevAll(), 和.parents()。區(qū)別是可以用一個(gè)選擇符來停止元素探索。
.add(String, Element) (.add() 文檔, commit)
可以給.add()方法指定環(huán)境了。這個(gè)功能可以用于在一個(gè)調(diào)用鏈中加入和操作額外元素(比如Ajax請(qǐng)求里返回的新元素)。
.closest(filter, DOMElement) (.closest() 文檔, commit)
可以通過closest方法的第2個(gè)參數(shù)設(shè)置一個(gè)DOMElement環(huán)境。給closest設(shè)置一個(gè)環(huán)境一般能夠提高這個(gè)方法的運(yùn)行速度。這個(gè)優(yōu)化也適用live(), 因?yàn)檫@個(gè)方法內(nèi)部調(diào)用了closest()。
常用工具 (Utilities)
jQuery.isEmptyObject() (jQuery.isEmptyObject() 文檔, commit)
如果對(duì)象,em>沒有任何屬性, 該方法將返回true。jQuery.isEmptyObject()方法不對(duì)參數(shù)進(jìn)行任何檢查, 所以請(qǐng)保證參數(shù)是一個(gè)對(duì)象。
jQuery.isPlainObject() (jQuery.isPlainObject(), commit )
如果一個(gè)對(duì)象是通過字符創(chuàng)建的(譯注:{}),jQuery.isPlainObject()返回true; 如果對(duì)象是其他類別的對(duì)象(譯注:如new Object())或者是基本類型, 則返回false。
jQuery.contains() (jQuery.contains() 文檔, commit)
如果兩個(gè)參數(shù)都是DOM節(jié)點(diǎn),并且第二個(gè)節(jié)點(diǎn)是嵌套在第一個(gè)節(jié)點(diǎn)內(nèi)部的話, jQuery.contains()返回true。反之返回false。
jQuery.noop (jQuery.noop() 文檔, commit)
是個(gè)空的函數(shù), 可以用在必須要有一個(gè)函數(shù)的情況下。(譯注: noop是No Operation的意思。)
jQuery.unique() (jQuery.unique() 文檔)
jQuery 1.4版中, jQuery.unique()方法返回結(jié)果里的元素是按照他們?cè)陧撁胬锏捻樞蚺判虻?。由于在?chuàng)建jQuery集合的時(shí)候jQuery使用jQuery.unique()方法, 所以jQuery方法返回的集合也是按照他們?cè)陧撁胬锏捻樞蚺帕械摹?/p>
其他 (Miscellaneous)
jQuery.browser以瀏覽器引擎為中心 (jQuery.browser 文檔, commit)
例如, 你可以通過jQuery.browser.webkit探測(cè)引擎是否是Webkit。
改進(jìn)了對(duì)applets的處理 (commit 1, commit 2)
jQuery不再試圖在Java applets上綁定事件或是數(shù)據(jù)了(綁定事件或是數(shù)據(jù)會(huì)出現(xiàn)錯(cuò)誤)。
不再使用arguments.callee (commit)
為了順應(yīng)Caja的要求, 同時(shí)也因?yàn)榧磳㈤_始應(yīng)用的ECMAScript 5規(guī)范里將其標(biāo)記為陳舊, 我們將jQuery核心中所有用到arguments.callee的代碼都移除了。
用Closure Compiler替換了YUI Min (commit)
中文API文檔支持
您可以在Ajax之家(http://www.ajaxa.cn/)下載最新的API文檔
內(nèi)部重組 (Internal Reorganization)
在1.4版的開發(fā)過程中的一個(gè)重點(diǎn)是要建立一個(gè)更易讀, 更易懂的代碼庫。為了達(dá)到這個(gè)目標(biāo)我們樹立了一系列編寫代碼規(guī)范的向?qū)А?/p>
下面是一些主要的變化:
- 舊的’core.js’文件被分成了’attribute.js’, ‘css.js’, ‘data.js’, ‘manipulation.js’, ‘traversing.js’, and ‘queue.js’.
- ready事件被移入了’core.js’ (因?yàn)樗莏Query的一個(gè)基本組成之一)。
- 大部分核心代碼都符合新的代碼規(guī)范.
- css和屬性的邏輯被劃分開來, 不再如以往相互纏繞。
測(cè)試 (Testing)
#t#jQuery 1.4版發(fā)布過程中我們修復(fù)了207個(gè)問題 (比較之下1.3版里有97個(gè)修復(fù))。
jQuery 1.4.此外, 測(cè)試的數(shù)量從jQuery 1.3.2中的1504例升到了1.4中的3060例。
所有測(cè)試都在主要瀏覽器里完全通過了。(Safari 3.2, Safari 4, Firefox 2, Firefox 3, Firefox 3.5, IE 6, IE 7,
IE 8, Opera 10.10, and Chrome)
我們盡量試圖減小jQuery 1.4對(duì)大規(guī)模升級(jí)可能造成的麻煩 – 保持所有公開函數(shù)的簽名不變。即使如此, 請(qǐng)通讀下面的列表以保證你對(duì)可能對(duì)你的應(yīng)用造成問題的變更。
- .add()不再簡(jiǎn)單的將結(jié)果串聯(lián)到一起, 結(jié)果將會(huì)被混合到一起, 然后根據(jù)他們?cè)陧撁胬锏捻樞蚺帕小?/li>
- .clone(true)將復(fù)制事件和數(shù)據(jù), 而不僅是事件。
- jQuery.data(elem) 不再返回id, 取而代之的是元素的對(duì)象緩存。
- jQuery() (無參數(shù)) 不再自動(dòng)轉(zhuǎn)換成jQuery(document)了。
- 通過.val(“…”)獲得一個(gè)option或一個(gè)checkbox的值不再有歧義(將總是根據(jù)value屬性選擇, 而不是根據(jù)text的值)。(Commit)
- jQuery.browser.version現(xiàn)在將返回引擎的版本.
- 現(xiàn)在起將對(duì)引入的JSON更嚴(yán)格, 如果JSON的格式不符將會(huì)報(bào)錯(cuò)。如果你需要對(duì)不符合JSON嚴(yán)格格式的Javascript進(jìn)行估值, 你必須設(shè)置請(qǐng)求的文件類型為純文本, 然后用eval()來對(duì)內(nèi)容估值。
- 參數(shù)序列化默認(rèn)會(huì)按照PHP/Rails的風(fēng)格進(jìn)行。你可以通過jQuery.ajaxSettings.traditional = true;來切換到舊的序列化方式。你也可以針對(duì)個(gè)別請(qǐng)求進(jìn)行切換, 在調(diào)用jQuery.ajax的時(shí)候遞入{traditional: true}
- 內(nèi)部的jQuery.className被移除了。
- jQuery.extend(true, …)不再擴(kuò)展復(fù)雜對(duì)象或是陣列。(TODO)
- 如果一個(gè)Ajax請(qǐng)求沒有指定dataType, 而返回的數(shù)據(jù)類型是”text/javascript”, 那么回復(fù)將會(huì)被執(zhí)行。之前, 必須明確的指定dataType。
- 設(shè)置Ajax 請(qǐng)求的”ifModified”屬性會(huì)將ETags納入考慮。
我們還針對(duì)1.4版中可能造成問題的變更編寫了一個(gè)向后兼容的插件。如果你升級(jí)到1.4以后出現(xiàn)問題, 可以在引入1.4版的文件之后引入這個(gè)插件。
如何使用這個(gè)插件:
<script src="http://code.jquery.com/jquery.js"></script> <script src="http://code.jquery.com/jquery.compat-1.3.js"></script>
原始數(shù)據(jù)和測(cè)試頁面
性能測(cè)試中我們使用了下列測(cè)試套包:
- Attributes
- Class
- DOM Manipulation
- Empty/Remove
- Function Call Profiling: 1.3.2 1.4.
結(jié)果的原始數(shù)據(jù) (所有的數(shù)據(jù)都是 1.3.2 vs. 1.4):
函數(shù)調(diào)用的次數(shù) 547 3 760 3 500 200 896 399 23909 299 307 118 28955 100 28648 201 1662 593 DOM嵌入 558 317 1079 624 1079 516 1155 829 436 332 196 194 243 169 HTML 116 46 281 78 313 78 234 63 134 43 43 42 91 27 CSS/屬性 703 370 1780 1250 1765 1250 1157 749 629 498 346 184 333 161 CSS 114 52 203 93 118 93 109 47 116 54 58 24 54 22 CSS類 553 138 1578 546 1515 501 1033 327 769 298 229 80 173 41 移除/清空 3298 286 9030 2344 7921 1703 5282 1266 2898 303 1166 140 1034 122