為了慶祝jQuery的四周歲生日, jQuery的團隊榮幸的發(fā)布了jQuery Javascript庫的最新主要版本! 這個(gè)版本包含了大量的編程,測試,和記錄文檔的工作,我們?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。謝謝他們在修復BUG和完成這次發(fā)布上所做的工作。
按照慣例,我們提供了兩份jQuery的拷貝,一份是最小化的(我們現在采用Google Closure作為默認的壓縮工具了),一份是未壓縮的(供糾錯或閱讀)。
另外,Google也在他們的服務(wù)器上放置了一份jQuery的拷貝。這份拷貝會(huì )自動(dòng)的最小化然后壓縮 – 并且放在Google最快的緩存服務(wù)器上。
你可以在你的站點(diǎn)上直接引用上面的URL,這樣就可以享受迅速加載jQuery的性能優(yōu)勢了。
就jQuery1.4來(lái)說(shuō),我們努力的減少大規模升級中的麻煩 – 通過(guò)保持所有public函數的簽名。即使如此,還請通讀可能會(huì )造成問(wèn)題的變更列表,這樣能夠了解哪些變更可能會(huì )給你的應用造成問(wèn)題。
下面的內容概括了jQuery1.4里加入的變更和功能。另外所有的變更都已經(jīng)在jQuery 1.4 的文檔里記錄了。
不少比較熱門(mén)的和常用的jQuery方法在1.4里被重寫(xiě)了。(譯注:重寫(xiě)了方法的內部,外部調用沒(méi)有大幅度改變) 我們分析源碼的時(shí)候發(fā)現我們能夠獲得大幅的性能提升,通過(guò)把jQuery和自己比較: 查看內部函數被調用了多少次,然后努力降低源碼的復雜度(譯注:計算機算法中的Complexity)
在1.4版里我們顯著(zhù)的降低了大部分熱門(mén)jQuery方法的的復雜度。
算來(lái)已經(jīng)有一陣了,你們已經(jīng)可以給.attr()傳遞一個(gè)函數,然后這個(gè)函數的結果會(huì )被用來(lái)賦給相應的HTML屬性(attribute)上。這個(gè)功能現在被移植到所有的設置函數了: .css(), .attr(), .val(), .html(), .text(), .append(), .prepend(), .before(), .after(), .replaceWith(), .wrap(), .wrapInner(), .offset(), .addClass(), .removeClass(), 以及 .toggleClass().
另外, 對于下面幾個(gè)方法,當前的值會(huì )被作為第2個(gè)變量傳遞給這個(gè)函數。.css(), .attr(), .val(), .html(), .text(), .append(), .prepend(), .offset(), .addClass(), .removeClass(), 以及 .toggleClass().
這樣代碼就可以這樣寫(xiě):
// 找出所有A標簽里的'&'字符,然后用一個(gè)span標簽包圍$('a').html(function(i,html){return html.replace(/&/gi,'&');});// 給一些鏈接的title屬性加些信息$('a[target]').attr("title", function(i,title){return title + " (新窗口打開(kāi))";});
嵌套參數的序列化 (jQuery.param() 文檔, Commit 1, Commit 2)
jQuery 1.4在jQuery.param方法里加入了嵌入參數序列化的支持,借用了PHP編程里興起的,而后又被Ruby on Rails推廣開(kāi)來(lái)的方式。
舉例來(lái)說(shuō),{foo: ["bar", "baz"]} 會(huì )被序列化為 “foo[]=bar&foo[]=baz”.
在jQuery 1.3版里, {foo: ["bar", "baz"]} 曾被序列化為 “foo=bar&foo=baz”. 但是,這樣做沒(méi)用辦法將只含有一個(gè)元素的陣列編碼。如果你需要舊的序列化方式,你可以設置傳統Ajax設置來(lái)進(jìn)行切換。(使用jQuery.ajaxSettings.traditional進(jìn)行全局切換,或者根據情況單獨切換。
總共有3種方式可以切換到舊的序列化方式:
// 全局改變序列化方式 (使用舊的)jQuery.ajaxSettings.traditional = true;// 指定情況使用舊的序列化方式jQuery.param( stuff, true );// 針對一個(gè)單獨的Ajax請求使用舊的序列化方式$.ajax({ data: stuff, traditional: true });
更多信息參見(jiàn): jQuery.param() 文檔, jQuery.ajax() 文檔, Commit, Code
JSON和腳本類(lèi)型通過(guò)”content-type”自動(dòng)識別。 (jQuery.ajax 文檔, Commit 1, Commit 2)
如果一個(gè)Ajax請求的回復的媒體類(lèi)型是JSON(application/json), dataType默認設為”json”(如果dataType沒(méi)有被指明)。另外,如果回復的媒體類(lèi)型是 Javascript(application/javascript), dataType默認設為”script”(同樣,如果dataType沒(méi)有明確指明), 這種情況下,腳本會(huì )自動(dòng)運行。
加入了Etag的支持 (jQuery.ajax() 文檔, Commit)
默認設置下, jQuery會(huì )忽略Ajax請求的”Last-Modified”頁(yè)頭。這樣做是為了忽略瀏覽器的緩存。設置ifModified:true就可以使 jQuery使用可用的緩存。jQuery1.4還會(huì )發(fā)出”If-None-Match”的頁(yè)頭如果你設置了ifModified選項。
嚴格JSON模式,本地的JSON.parse方法 (jQuery.ajax() 文檔, Commit 1, Commit 2, Commit 3)
jQuery 1.3和以前的版本曾使用Javascript的eval對引入的JSON解析。1.4版則會(huì )使用本地的JSON解析器,前提是如果有本地的解析器可用。它也會(huì )對引入的JSON進(jìn)行校驗。所以在jQuery.getJSON方法里,或當一個(gè)Ajax請求的dataType是”json”的時(shí)候,jQuery會(huì )拒絕不合標準的JSON(例如{foo: "bar"})。
序列化HTML5的元素 (jQuery.param() 文檔, Commit)
新的HTML5輸入方法 (比如’datetime’和’range’)在序列化.serialize()一個(gè)表單的時(shí)候會(huì )被包括在內。
Ajax請求的環(huán)境 (jQuery.ajax() 文檔, Commit)
你可以附加一個(gè)”環(huán)境”到Ajax請求上,所有的回調函數里都會(huì )擁有同樣的”環(huán)境”設置(這樣可以簡(jiǎn)化你的代碼,盡可能避免使用閉合,或是其他對象)。
jQuery.ajax({url: "test.html",context: document.body,success: function(){jQuery(this).addClass("done");}});
請求成功回調函數的第三個(gè)參數會(huì )被設為原始的XHR對象 (jQuery.ajax() 文檔, Commit)
所有的Ajax請求的成功回調函數現在都會(huì )收到原始的XMLHttpRequest對象,作為第三個(gè)參數。之前這個(gè)XHR對象只能通過(guò)$.ajax一類(lèi)方法的返回值來(lái)獲取。
明確設置”Content-Type” (jQuery.ajax() 文檔, Commit)
在1.3版,如果沒(méi)有實(shí)際數據發(fā)送,jQuery.ajax的contentType會(huì )被忽略。1.4版里,contentType將總是和請求一同發(fā)送。這修復了某些后臺憑靠”Content-Type”頁(yè)頭判斷回復類(lèi)別所造成的問(wèn)題。
明確設置JSONP回調函數的名字 (jQuery.ajax 文檔, Commit)
你可以使用jQuery.ajax()方法的jsonpCallback選項,通過(guò)名字來(lái)指定JSONP的回調函數。
防止啟動(dòng)前跨域XHR (Commit)
跨域Ajax(針對提供支持的瀏覽器)將更易用,因為默認設置下,啟動(dòng)前XHR被阻止了。(TODO)
jQuery.ajax()現在使用”onreadystatechange”事件替換了計時(shí)器 (Commit)
使用”onreadystatechange”替換了輪流探詢(xún),Ajax請求現在將使用更少的資源
.css()和.attr() 的性能被優(yōu)化了。
.attr()方法多了一個(gè)設置函數作為參數 (.attr() 文檔)
你不但可以將一個(gè)函數用在.attr()里,還可以在這個(gè)函數里使用屬性的當前值。
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)
快捷元素創(chuàng )建 (jQuery() 文檔, Commit)
現在當你需要使用jQuery函數創(chuàng )建一個(gè)元素的時(shí)候,你可以同時(shí)附遞一個(gè)對象來(lái)指定屬性值和事件:
jQuery("", {id: "foo",css: {height: "50px",width: "50px",color: "blue",backgroundColor: "#ccc"},click: function() {$(this).css("backgroundColor", "red");}}).appendTo("body");
對象里的鍵值的名字與相關(guān)的jQuery的方法的名字是對應的,對象的值會(huì )被作為參數傳遞給jQuery的方法。
(譯注:譬如$("<a>link</a>", {css:{background:"#ccc"}});相當于$("<a>link</a>")).css("background", "#ccc");
.eq(-N), .get(-N) (負指數) (.eq() 文檔, .get() 文檔, Commit)
你現在可以在.get()和.eq()方法里使用負數。譬如,你要選擇倒數第2個(gè)div元素,或者是倒數第2個(gè)DOM對象:
$("div").eq(-2);$("div").get(-2);
新的.first()和.last()方法 (.first() 文檔, .last() 文檔, Commit)
方便起見(jiàn), 新增的.first()和.last()方法等同于.eq(0)和.eq(-1).
新的.toArray()方法 (.toArray() 文檔, Commit)
.get()方法自始就是從jQuery集合里返回一個(gè)陣列。為了能夠更明確, 你可以用.toArray()來(lái)達到一樣的效果。(譯注:這里應該是為了以后的版本留出空間,譬如以后可能會(huì )加入.toList()方法,到時(shí)候就會(huì )易于區分。) 不過(guò),和.get()不一樣的是,.toArray()不接受參數。
jQuery()返回一個(gè)空集 (jQuery() 文檔, Commit)
在jQuery 1.3中,jQuery()方法返回僅包括document的jQuery集合。這個(gè)可以用來(lái)創(chuàng )建一個(gè)空集,然后動(dòng)態(tài)加入一些元素。注: jQuery().ready()方式在1.4中依然有效,但是被指示陳舊了。請使用jQuery(document).ready()或者jQuery(function(){})。
jQuery(“TAG”) (Element Selector 文檔, Commit)
當使用單個(gè)標簽名字的時(shí)候jQuery會(huì )使用更快捷的路徑。
jQuery(“<div>”), jQuery(“<div/>”) 和 jQuery(“<div></div>”) (jQuery() 文檔, Commit)
現在這三個(gè)方法都使用同一個(gè)代碼路徑了(document.createElement), 來(lái)優(yōu)化jQuery("<div></div>")的性能。注意,如果你指定了屬性,將會(huì )使用瀏覽器本身的語(yǔ)法分析(通過(guò)設置innerHTML)。
.css()方法在性能是以前的2倍。
.addClass(), .removeClass(), 和 .hasClass()這幾個(gè)方法在性能上是以前的3倍
.toggleClass()可以切換多個(gè)css類(lèi)了 (.toggleClass() 文檔, Commit)
你可以通過(guò).toggleClass()調用多個(gè)css類(lèi)的名字來(lái)切換他們。
$("div").toggleClass("current active");
.data()返回對象, .data(Object)設置對象 (.data() 文檔, Commit 1, Commit 2)
有時(shí)候你可能需要在一個(gè)元素上附加一個(gè)復雜的對象。一個(gè)常見(jiàn)的例子是你需要從一個(gè)元素身上復制所有的數據到令一個(gè)元素上。在jQuery 1.4里, 不使用任何參數調用.data()時(shí),.data會(huì )返回一個(gè)復雜對象。(譯注: 包含所有鍵-值對的對象。) 調用.data(Object) 則會(huì )設置這個(gè)對象。注意這個(gè)對象還包括了元素上綁定的事件,所以用的時(shí)候要小心。
除非需要, 不然不會(huì )創(chuàng )建數據緩存。 (Commit 1, Commit 2, Commit 3)
jQuery使用一個(gè)獨特的自定義屬性來(lái)獲取特定元素上附加的數據。當查找數據,但是沒(méi)有新加的數據的時(shí)候,jQuery會(huì )盡量避免創(chuàng )建這個(gè)自定義屬性。這樣可能會(huì )提高性能,同時(shí)還會(huì )在這種情況下避免污染DOM。
單個(gè)屬性緩進(jìn)緩出 (Per-property Easing 文檔, Commit)
除了能夠給一個(gè)動(dòng)態(tài)效果指定緩進(jìn)出函數外,你現在可以指定每個(gè)屬性的緩進(jìn)出函數了。James Padolsey的blog上有更進(jìn)一步的信息和演示。
$("#clickme").click(function() {$("div").animate({width: ["+=200px", "swing"],height: ["+=50px", "linear"],}, 2000, function() {$(this).after("<div>Animation complete.</div>");});});
新方法: jQuery.proxy() (jQuery.proxy() Documenation, Commit 1, Commit 2)
如果你需要保證一個(gè)函數內的”this”恒定地保持某個(gè)值, 你可以用jQuery.proxy獲得一個(gè)相同作用域的函數。
var obj = {name: "John",test: function() {alert( this.name );$("#test").unbind("click", obj.test);}};$("#test").click( jQuery.proxy( obj, "test" ) );
多個(gè)事件綁定 (.bind() 文檔)
你可以通過(guò)遞入一個(gè)對象來(lái)一次性綁定元素的多個(gè)事件。
$("div.test").bind({click: function(){$(this).addClass("active");},mouseenter: function(){$(this).addClass("inside");},mouseleave: function(){$(this).removeClass("inside");}});
‘change’和’submit’事件規范化 (Change 文檔, Submit 文檔)
普通的或是即時(shí)的change和submit事件可以在各種瀏覽器上穩定工作了。我們覆蓋了IE里的change和submit, 替換為與其他瀏覽器相同的事件。
新的事件: ‘focusin’ and ‘focusout’ (.focusin() 文檔, .focusout() 文檔, Commit)
focusin和focusout在一般情況下等同于focus和blur, 但是多了向父元素傳遞的作用。如果你自己編寫(xiě)你的事件代理模式(TODO), 這個(gè)功能將對你有很大幫助。請注意對focus和blur使用live()方法將不會(huì )起作用; 在設計的時(shí)候我們根據 DOM事件規范決定不使其向父元素傳遞事件。
$("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()所支持的事件里,我們對能夠支持下面這幾個(gè)額外的事件感到尤其驕傲。通過(guò).live()里的事件代理, 1.4版實(shí)現了對change, submit, focusin, focusout, mouseenter, 以及mouseleave事件的跨瀏覽器支持。
注: 如果你需要即時(shí)的focus事件,你應該用focusin和focusout, 而不要用focus和blur, 因為就像前面提到的, focus和blur不向上傳遞。
還有, live()也接受數據對象作為參數了, 同bind()方法一樣 (Commit)
live/die也支持環(huán)境變量了 (Commit)
現在可以在綁定事件的時(shí)候給選擇符指定一個(gè)環(huán)境。如果環(huán)境被指定了, 只有屬于這個(gè)環(huán)境下的元素才會(huì )被綁定事件。在創(chuàng )建即時(shí)事件的時(shí)候, 元素本身不需要已經(jīng)被定義, 但是環(huán)境必須被創(chuàng )建。
確定ready事件至少含有body元素 (Commit)
jQuery現在會(huì )檢查body是不是存在,如果不存在,會(huì )對body進(jìn)行輪流探詢(xún)。
在不需要手動(dòng)處理內存溢出的非IE瀏覽器中, 卸載的速度提高了。 (Commit)
在jQuery 1.4里一系列的DOM操作方法的性能都有巨大的提升。
.append(), .prepend(), .before(), and .after()的性能提高了。
.html()的性能提高到以前的3倍。
.remove()和.empty()的速度則達到以前的4倍.
新方法: .detach() (.detach() 文檔, Commit)
detach()將一個(gè)元素從DOM里移除, 但是并不卸載關(guān)聯(lián)的事件處理函數。這個(gè)方法可用于暫時(shí)性的將一個(gè)元素移除,執行相關(guān)操作,然后返回。
var foo = $("#foo").click(function() {// 相關(guān)操作});foo.detach();// foo保留了相關(guān)處理函數foo.appendTo("body");
新的unwrap()方法 (documentation, commit)
unwrap()方法拿到一個(gè)已知的父元素的子元素,然后將父元素用子元素替換。(譯注: 將子元素從”包裹”里拿出來(lái), 因名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>")一類(lèi)方法創(chuàng )建的節點(diǎn)記入緩存。這樣, 對于利用這些方法, 使用字符串進(jìn)行DOM操作的頁(yè)面,性能將有極大的提高。
無(wú)連接的節點(diǎn)間的before, after, replaceWith操作 (commit)
現在你可以對還沒(méi)有放置到DOM Tree上的節點(diǎn)進(jìn)行before, after, 和replaceWith的操作了。意味著(zhù)你可以先對節點(diǎn)進(jìn)行復雜的操作, 待完成后再放到合適的DOM位置上。這樣也能盡量避免操作過(guò)程中造成重新排版。
jQuery("<div>").before("<p>Hello</p>").appendTo("body")
.clone(true) 也會(huì )復制關(guān)聯(lián)數據 (clone 文檔, commit)
1.3版中, .clone(true)雖然也是深度復制, 但是沒(méi)有復制關(guān)聯(lián)的數據。1.4版里,它則會(huì )復制數據, 同時(shí)還包括所有的事件。這點(diǎn)上和jQuery.extend在語(yǔ)義想同的, 所以普通對象和陣列會(huì )被復制, 但是自定義的對象則不會(huì )。
.offset( coords | Function ) (.offset() 文檔, commit)
現在可以設置元素的位移了! 和所有的設置函數一樣, offset也可以接受一個(gè)函數作為第二個(gè)參數。
隊列經(jīng)歷了一次大修, 使用隊列會(huì )比使用默認的fx更易掌握。
新的 .delay() 方法 (.delay() 文檔, commit)
.delay()方法會(huì )根據參數滯后若干毫秒執行隊列里剩下的對象。默認的它會(huì )使用”fx”隊列。但你可以選擇性的通過(guò)delay方法的第二個(gè)參數選擇其他隊列。(譯注:每個(gè)隊列都以一個(gè)名字識別。)
$("div").fadeIn().delay(4000).fadeOut();
隊列里的next (.queue() 文檔, commit)
jQuery 1.4版里, 當隊列里的一個(gè)函數被調用的時(shí)候,第一個(gè)參數會(huì )被設為另一個(gè)函數。當后者被調用的時(shí)候, 會(huì )自動(dòng)排除隊列里的下一個(gè)對象, 以此來(lái)推動(dòng)隊列到下一步。
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)
隊列可以被清空了。這個(gè)方法會(huì )移除隊列里所有未執行的函數, 但不會(huì )移除正在運行的函數。無(wú)參數的情況下調用.clearQueue()方法將會(huì )清空默認的”fx”隊列。
“#id p”效率更高 (commit)
所有以ID開(kāi)頭的選擇符都得到了優(yōu)化, 能夠在瞬間得到返回值。所有以ID為開(kāi)頭的選擇符速度將一直快于其他選擇符。
.index(), .index(String) (index 文檔, commit)
.index() 方法經(jīng)過(guò)重寫(xiě), 變得更加直觀(guān)和靈活。
你可以獲得一個(gè)元素相對于同父元素的指數:
// 計算第一個(gè) <li class="current"> 元素在它所有的同父元素中的指數:$("li.current").index()
你也可以獲得一個(gè)元素在一個(gè)jQuery元素集合中的指數, 這個(gè)集合可以用一個(gè)選擇符或者是一個(gè)DOM元素來(lái)指定:
// 計算這個(gè) <h3 id="more-info"> 元素在頁(yè)面上所有 <h3> 元素里的指數:$("#more-info").index("h3")這個(gè)方法相當于選擇符里的:has()過(guò)濾法。它拿到一個(gè)jQuery集合,返回含有指定選擇符的元素。
新的 .nextUntil(), .prevUntil(), .parentsUntil() 方法 (.nextUntil() 文檔, .prevUntil() 文檔, .parentsUntil() 文檔, commit)
新的”until”方法類(lèi)似于.nextAll(), .prevAll(), 和.parents()。區別是可以用一個(gè)選擇符來(lái)停止元素探索。
.add(String, Element) (.add() 文檔, commit)
可以給.add()方法指定環(huán)境了。這個(gè)功能可以用于在一個(gè)調用鏈中加入和操作額外元素(比如Ajax請求里返回的新元素)。
.closest(filter, DOMElement) (.closest() 文檔, commit)
可以通過(guò)closest方法的第2個(gè)參數設置一個(gè)DOMElement環(huán)境。給closest設置一個(gè)環(huán)境一般能夠提高這個(gè)方法的運行速度。這個(gè)優(yōu)化也適用live(), 因為這個(gè)方法內部調用了closest()。
jQuery.isEmptyObject() (jQuery.isEmptyObject() 文檔, commit)
如果對象,em>沒(méi)有任何屬性, 該方法將返回true。jQuery.isEmptyObject()方法不對參數進(jìn)行任何檢查, 所以請保證參數是一個(gè)對象。
jQuery.isPlainObject() (jQuery.isPlainObject(), commit )
如果一個(gè)對象是通過(guò)字符創(chuàng )建的(譯注:{}),jQuery.isPlainObject()返回true; 如果對象是其他類(lèi)別的對象(譯注:如new Object())或者是基本類(lèi)型, 則返回false。
jQuery.contains() (jQuery.contains() 文檔, commit)
如果兩個(gè)參數都是DOM節點(diǎn),并且第二個(gè)節點(diǎn)是嵌套在第一個(gè)節點(diǎn)內部的話(huà), jQuery.contains()返回true。反之返回false。
jQuery.noop (jQuery.noop() 文檔, commit)
是個(gè)空的函數, 可以用在必須要有一個(gè)函數的情況下。(譯注: noop是No Operation的意思。)
jQuery.unique() (jQuery.unique() 文檔)
jQuery 1.4版中, jQuery.unique()方法返回結果里的元素是按照他們在頁(yè)面里的順序排序的。由于在創(chuàng )建jQuery集合的時(shí)候jQuery使用jQuery.unique()方法, 所以jQuery方法返回的集合也是按照他們在頁(yè)面里的順序排列的。
jQuery.browser以瀏覽器引擎為中心 (jQuery.browser 文檔, commit)
例如, 你可以通過(guò)jQuery.browser.webkit探測引擎是否是Webkit。
改進(jìn)了對applets的處理 (commit 1, commit 2)
jQuery不再試圖在Java applets上綁定事件或是數據了(綁定事件或是數據會(huì )出現錯誤)。
不再使用arguments.callee (commit)
為了順應Caja的要求, 同時(shí)也因為即將開(kāi)始應用的ECMAScript 5規范里將其標記為陳舊, 我們將jQuery核心中所有用到arguments.callee的代碼都移除了。
用Closure Compiler替換了YUI Min (commit)
您可以在Ajax之家(http://www.ajaxa.cn/)下載最新的API文檔
在1.4版的開(kāi)發(fā)過(guò)程中的一個(gè)重點(diǎn)是要建立一個(gè)更易讀, 更易懂的代碼庫。為了達到這個(gè)目標我們樹(shù)立了一系列編寫(xiě)代碼規范的向導。
下面是一些主要的變化:
舊的’core.js’文件被分成了’attribute.js’, ‘css.js’, ‘data.js’, ‘manipulation.js’, ‘traversing.js’, and ‘queue.js’.
ready事件被移入了’core.js’ (因為它是jQuery的一個(gè)基本組成之一)。
大部分核心代碼都符合新的代碼規范.
css和屬性的邏輯被劃分開(kāi)來(lái), 不再如以往相互纏繞。
jQuery 1.4版發(fā)布過(guò)程中我們修復了207個(gè)問(wèn)題 (比較之下1.3版里有97個(gè)修復)。
jQuery 1.4.此外, 測試的數量從jQuery 1.3.2中的1504例升到了1.4中的3060例。
所有測試都在主要瀏覽器里完全通過(guò)了。(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對大規模升級可能造成的麻煩 – 保持所有公開(kāi)函數的簽名不變。即使如此, 請通讀下面的列表以保證你對可能對你的應用造成問(wèn)題的變更。
.add()不再簡(jiǎn)單的將結果串聯(lián)到一起, 結果將會(huì )被混合到一起, 然后根據他們在頁(yè)面里的順序排列。
.clone(true)將復制事件和數據, 而不僅是事件。
jQuery.data(elem) 不再返回id, 取而代之的是元素的對象緩存。
jQuery() (無(wú)參數) 不再自動(dòng)轉換成jQuery(document)了。
通過(guò).val(“…”)獲得一個(gè)option或一個(gè)checkbox的值不再有歧義(將總是根據value屬性選擇, 而不是根據text的值)。(Commit)
jQuery.browser.version現在將返回引擎的版本.
現在起將對引入的JSON更嚴格, 如果JSON的格式不符將會(huì )報錯。如果你需要對不符合JSON嚴格格式的Javascript進(jìn)行估值, 你必須設置請求的文件類(lèi)型為純文本, 然后用eval()來(lái)對內容估值。
參數序列化默認會(huì )按照PHP/Rails的風(fēng)格進(jìn)行。你可以通過(guò)jQuery.ajaxSettings.traditional = true;來(lái)切換到舊的序列化方式。你也可以針對個(gè)別請求進(jìn)行切換, 在調用jQuery.ajax的時(shí)候遞入{traditional: true}
內部的jQuery.className被移除了。
jQuery.extend(true, …)不再擴展復雜對象或是陣列。(TODO)
如果一個(gè)Ajax請求沒(méi)有指定dataType, 而返回的數據類(lèi)型是”text/javascript”, 那么回復將會(huì )被執行。之前, 必須明確的指定dataType。
設置Ajax 請求的”ifModified”屬性會(huì )將ETags納入考慮。
我們還針對1.4版中可能造成問(wèn)題的變更編寫(xiě)了一個(gè)向后兼容的插件。如果你升級到1.4以后出現問(wèn)題, 可以在引入1.4版的文件之后引入這個(gè)插件。
如何使用這個(gè)插件:
聯(lián)系客服