這是Jquery javascript庫的精簡版!
成都創(chuàng)新互聯(lián)基于分布式IDC數(shù)據(jù)中心構(gòu)建的平臺(tái)為眾多戶提供成都移動(dòng)機(jī)房 四川大帶寬租用 成都機(jī)柜租用 成都服務(wù)器租用。
jquery是做什么用的呢?
1 、取得頁面中的元素。如果不使用JavaScript 庫,遍歷DOM (Document Object Model ,文檔對象模型)樹,以及查找
HTML 文檔結(jié)構(gòu)中某個(gè)特殊的部分,必須編寫很多行代碼。jQuery 為準(zhǔn)確地獲取需要檢查或操縱的文檔元素,提 供了
可靠而富有效率的選擇符機(jī)制。
2 、修改頁面的外觀。CSS 雖然為影響文檔呈現(xiàn)的方式提供了一種強(qiáng)大的手段,但當(dāng)所有瀏覽器不完全支持相同的標(biāo)準(zhǔn)時(shí),
單純使用CSS 就會(huì)顯得力不從心。 jQuery 可以彌補(bǔ)這一不足,它提供了跨瀏覽器的標(biāo)準(zhǔn)解決方案。而且,即使在頁面
已經(jīng)呈現(xiàn)之后,jQuery 仍然能夠改變文檔中某個(gè)部分的類或者個(gè)別的 樣式屬性。
3 、改變頁面的內(nèi)容。jQuery 能夠影響的范圍并不局限于簡單的外觀變化,使用少量的代碼,jQuery 就能改變文檔的內(nèi)
容??梢愿淖兾谋?、插入或翻轉(zhuǎn)圖像、對列表重新排序,甚至,對HTML 文檔的整個(gè)結(jié)構(gòu)都能重寫和擴(kuò)充——所有這些只
需一個(gè)簡單易用的API 。
4 、響應(yīng)用戶的頁面操作。即使是最強(qiáng)大和最精心設(shè)計(jì)的行為,如果我們無法控制它何時(shí)發(fā)生,那它也毫無用處。jQuery 提
供了截取形形色色的頁面事件 (比如用戶單擊一個(gè)鏈接)的適當(dāng)方式,而不需要使用事件處理程序搞亂HTML代碼。此
外,它的事件處理API 也消除了經(jīng)常困擾Web 開發(fā)人員的瀏覽器不一 致性。
5 、為頁面添加動(dòng)態(tài)效果。為了實(shí)現(xiàn)某種交互式行為,設(shè)計(jì)者也必須向用戶提供視覺上的反饋。jQuery 中內(nèi)置的一批淡入、
擦除之類的效果,以及制作新效果的工具包,為此提供了便利。
6 、無需刷新頁面即可從服務(wù)器獲取信息。這種編程模式就是眾所周知的AJAX (Asynchronous JavaScript and XML ,
異步JavaScript 和XML ),它能輔助Web 開發(fā)人員創(chuàng)建出反應(yīng)靈敏、功能豐富的網(wǎng)站。jQuery 通過消除這一過程中的
瀏覽器特定的復(fù) 雜性,使開發(fā)人員得以專注于服務(wù)器端的功能設(shè)計(jì)。
(2007年9月):這一版去掉了對XPath選擇符的支持,原因是相對于CSS語法它已經(jīng)變得多余了。這一版能夠支持對效果的更靈活定制,而且借助新增的命名空間事件,也使插件開發(fā)變得更容易。
jQuery UI(2007年9月):這個(gè)新的插件套件是作為曾經(jīng)流行但已過時(shí)的Interface插件的替代項(xiàng)目而發(fā)布的。jQuery UI中包含大量預(yù)定義好的部件(widget),以及一組用于構(gòu)建高級(jí)元素(例如可拖放的界面元素)的工具。 (2010年1月14號(hào)):對代碼庫進(jìn)行了內(nèi)部重寫組織,開始建立一些風(fēng)格規(guī)范。老的core.js文件被分為attribute.js,css.js,data.js,manipulation.js,traversing.js和queue.js;CSS和attribute的邏輯分離。
⒈4重要新特性
·常用方法的性能大幅提升:重寫了大部分較早期的函數(shù);
·更容易使用的設(shè)置函數(shù)(setter function):為所有對象新增了許多易用的設(shè)置函數(shù);
·對Ajax的改進(jìn):引入了許多Ajax和JSON處理方面的更新,包括HTML5元素的序列化;
·attribute(改進(jìn)了.attr()的性能)、jQuery()核心函數(shù)、CSS(.css()性能有兩倍提升)、特效和事件、DOM操作等也有顯著改進(jìn) (2011年1月31日):該版本修復(fù)了83個(gè)bug,解決了460個(gè)問題。重大改進(jìn)有:重寫了Ajax模塊;新增延緩對象(Deferred Objects);jQuery替身——jQuery.sub();增強(qiáng)了遍歷相鄰節(jié)點(diǎn)的性能;jQuery開發(fā)團(tuán)隊(duì)構(gòu)建系統(tǒng)的改進(jìn)。
1.5新版本
美國時(shí)間2011年1月31日J(rèn)ohn Resig在jQuery官方博客發(fā)表文章,宣布jQuery 1.5正式版已經(jīng)如期開發(fā)完成,可以下載使用。壓縮版本jQuery Minified29KB,不壓縮版本jQuery Regular(用于閱讀和調(diào)試)207KB。由于jQuery已經(jīng)成為目前最流行的JavaScript庫,得到廣泛的支持,新版本的發(fā)布當(dāng)然非常引人注目。
重要變化:
1. Ajax重寫
Ajax模塊完全進(jìn)行了重寫。新增一個(gè)jXHR對象,為不同瀏覽器內(nèi)置的XMLHttpRequest提供了一致的超集。對于XMLHttpRequest之外的傳輸機(jī)制,比如JSONP請求,jXHR對象也可以進(jìn)行處理。(詳情可以參見:jQuery.ajax文檔)
此外,系統(tǒng)的可擴(kuò)展性大大增強(qiáng),可以附加各種數(shù)據(jù)處理器、過濾器和傳輸機(jī)制,為開發(fā)新的Ajax插件提供了方便。
2. 延遲對象
延遲對象(Deferred Object,jQuery.Deferred對象)是一個(gè)可鏈接的(chainable)實(shí)用工具對象,實(shí)現(xiàn)了Promise接口,可以在回調(diào)隊(duì)列中注冊多個(gè)回調(diào)、調(diào)用回調(diào)隊(duì)列并轉(zhuǎn)發(fā)任何同步/異步函數(shù)的成敗狀態(tài)。正如Using Deferreds in jQuery 1.5一文中說明的,其結(jié)果是在jQuery中能夠?qū)⒁蕾囉谀硞€(gè)任務(wù)(事件)結(jié)果的邏輯與任務(wù)本身解耦了。這一點(diǎn)在JavaScript中其實(shí)并不新鮮,Mochikit和Dojo等已經(jīng)實(shí)現(xiàn)有些日子了。由于jQuery 1.5的Ajax模塊內(nèi)置使用了延遲對象,因此通過jQuery編寫Ajax程序?qū)⒆詣?dòng)獲得這一功能。
開發(fā)人員借此可以使用無法立即獲得的返回值(如異步Ajax請求的返回結(jié)果),而且第一次能夠附加多個(gè)事件處理器。
例如,使用了新的jQuery內(nèi)部Ajax API就可以實(shí)現(xiàn)下面的代碼了:
// Assign handlers immediately after making the request,// and remember the jxhr object for this request var jxhr = $.ajax({ url: example.php }) .success(function() { alert(success); }) .error(function() { alert(error); }) .complete(function() { alert(complete); });// perform other work here ... // Set another completion function for the request above jxhr.complete(function(){ alert(second complete); });
此外,使用jQuery.Deferred還可以開發(fā)自己的延遲對象。更多詳情參見:延遲對象文檔。
3. jQuery.sub()
jQuery 1.5提供了一種創(chuàng)建和修改jQuery副本的方式??梢杂脕硖砑硬幌蛲獠抗_的方法,或者對jQuery的某些方法進(jìn)行重新定義以提供新功能,或者提供更好的封裝、避免名稱空間沖突。當(dāng)然,也可以用來開發(fā)插件,但Resig強(qiáng)烈建議在開發(fā)插件之前,先考慮jQuery UI widget工廠。
值得注意的是,sub函數(shù)并不提供真正的隔離,所有方法、數(shù)據(jù)、調(diào)用仍然依靠jQuery本身來支持。
4. 遍歷性能提高
在新版本中.children(),.prev(),.next()幾個(gè)常用的遍歷函數(shù)性能有了顯著提高。
5. 內(nèi)部開發(fā)系統(tǒng)
John Resig還特別提到了jQuery團(tuán)隊(duì)內(nèi)部開發(fā)系統(tǒng)的兩點(diǎn)改變:一是服務(wù)器端用Node.js替換了老的Java/Rhino系統(tǒng),使得團(tuán)隊(duì)可以專注于JavaScript環(huán)境的新變化;二是所用的代碼優(yōu)化程序從Google Closure切換到UglifyJS,新工具的壓縮效果非常令人滿意。
jQuery 1.5.2 在1.5的基礎(chǔ)上修正的大量的bug
jQuery 1.7b 2011年09月29日jQuery 1.7 的第一個(gè) beta 測試版本,該版本修復(fù)了超過 50 個(gè)的問題以及帶來一些新特性。
2011年11月4日jQuery1.7正式版發(fā)布。
新版本包含了很多新的特征,特別提升了事件委派時(shí)的性能尤其是在IE7下。
新增及改進(jìn)項(xiàng):
⒈新的事件 APIs: .on() and .off();
⒉提升了事件委派時(shí)的性能有了大幅度的提升,尤其是在IE7下;
⒊更好的在 IE 6/7/8 上支持 HTML5;
⒋切換動(dòng)畫更加直觀;
⒌匿名模塊定義 AWD
⒍jQuery.Deferred
⒎jQuery.isNumeric()
被刪除的方法:
event.layerX and event.layerY
jQuery.isNaN() 2012年03月24日jQuery 1.7.2正式版發(fā)布。
該版本在1.7.1的基礎(chǔ)上修復(fù)了大量的bug,并改進(jìn)了部分功能。而相比于1.7.2 RC1,只修復(fù)了一個(gè)bug。值得注意的是:如果你正在使用jQuery Mobile,請使用最新的jQuery 1.7.2和jQuery Mobile 1.1這兩個(gè)版本,因?yàn)橹暗膉Query Mobile版本還基于jQuery core 1.7.1或更早的版本。 2012年11月14日 jQuery 1.8.3 發(fā)布,修復(fù) bug 和性能衰退問題
IE8中的HTML相關(guān)Bug
jQuery 1.8.2在IE9中調(diào)用ajax失敗的問題
jQuery 1.7.1不能正確地設(shè)置IE7中克隆元素的tabindex屬性
壓縮的JS文件包含非ASCII字符
如果body樣式設(shè)置為display:none,則$('body').show()無法工作
在IE9中element.css('filter')返回不明確
在Android 2.3.4的瀏覽器中,jQuery 1.8.1轉(zhuǎn)場效果崩潰
在iPad上縮放一個(gè)燈箱效果后,所有動(dòng)畫效果失效
從1.3.2升級(jí)到1.8.2版本后,出現(xiàn)Uncaught TypeError錯(cuò)誤
在Chrome和Safari中,無法正確檢測包含可編輯內(nèi)容的DIV的焦點(diǎn) 2013年3月 jQuery 2.0 Beta 2 發(fā)布
據(jù)jQuery官方博客3月消息,jQuery 2.0 Beta 2 發(fā)布。
根據(jù)用戶對jQuery 2.0 Beta 1 版本的反饋,Beta 2 版做了一些修改。jQuery官方表示,非常需要用戶來測試 Beta 2 版,最好同時(shí)也能向他們反饋提交建議。
他們相信,Beta 2 版已非常穩(wěn)定,值得一試,不需要等 2.0 的最終版本。
jQuery 團(tuán)隊(duì)在官博中再次提醒用戶,jQuery 2.0 不再支持IE 6/7/8 了,但是 jQuery 1.9 會(huì)繼續(xù)支持。因?yàn)榕f版 IE 瀏覽器在整個(gè)互聯(lián)網(wǎng)中還有很大部分市場,所以他們非常期望大部分網(wǎng)站能繼續(xù)使用 jQuery 1.x 一段時(shí)間。jQuery 團(tuán)隊(duì)也將同時(shí)支持 jQuery 1.x 和 2.x 。1.9 和 2.0 版的 API 是相同的,所以不必因?yàn)槟銈兙W(wǎng)站還在用 jQuery 1.9,就感覺好像錯(cuò)過了什么,或者是落后了。
如果你想繼續(xù)支持 IE 6/7/8,并且又想嘗試 jQuery 2.0,那你可以額外加上一些代碼。除了老版的 IE,其他所有瀏覽器都將使用第二腳本,忽略第一個(gè)。
在很多環(huán)境中,jQuery 2.0 應(yīng)當(dāng)都表現(xiàn)的很好。如下:
Google Chrome plugins
Mozilla XUL apps and Firefox extensions
Firefox OS apps
Chrome OS apps
Windows 8 Store (“Modern/Metro UI”) apps
BlackBerry 10 WebWorks apps
PhoneGap/Cordova apps
Apple UIWebView class
Microsoft WebBrowser control
Cheerio or jsdom with Node.js
Intranet applications
2013年4月18日 jQuery 2.0正式版發(fā)布 不再支持IE 6/7/8:如果在IE9/10版本中使用“兼容性視圖”模式也將會(huì)受到影響。 更輕更快:2.0版本文件與1.9.1相比小了12%。 可以構(gòu)建一個(gè)更小、更輕量的版本。 jQuery 2.0 API完全兼容jQuery 1.9 API。 jQuery 1.9.1漢化版2013年2月23日發(fā)布,由網(wǎng)友翻譯非官方 2014年5月1日,jQuery2.1.1版發(fā)布
jQuery綁定點(diǎn)擊事件可以使用其綁定事件函數(shù)
jquery中四個(gè)事件綁定方式(bind,live,delegate,on)
1、bind()????
簡要描述
bind()向匹配元素添加一個(gè)或多個(gè)事件處理器。
使用方式
$(selector).bind(event,data,function)
event:必需項(xiàng);添加到元素的一個(gè)或多個(gè)事件,例如 click,dblclick等;
單事件處理:例如?$(selector).bind("click",data,function);
多事件處理:
1.利用空格分隔多事件,例如?$(selector).bind("click dbclick mouseout",data,function);
2.利用大括號(hào)靈活定義多事件,例如?$(selector).bind({event1:function, event2:function, ...})
3.空格相隔方式:綁定較為死板,不能給事件單獨(dú)綁定函數(shù),適合處理多個(gè)事件調(diào)用同一函數(shù)情況;
大括號(hào)替代方式:綁定較為靈活,可以給事件單獨(dú)
綁定函數(shù);
data:可選;需要傳遞的參數(shù);
function:必需;當(dāng)綁定事件發(fā)生時(shí),需要執(zhí)行的函數(shù);
適用Jquery版本
適用所有版本,但是根據(jù)官網(wǎng)解釋,自從jquery1.7版本以后bind()函數(shù)推薦用on()來代替。
2、live()? ?
簡要描述
live()?向當(dāng)前或未來的匹配元素添加一個(gè)或多個(gè)事件處理器;
使用方式
$(selector).live(event,data,function)
event:必需項(xiàng);添加到元素的一個(gè)或多個(gè)事件,例如 click,dblclick等;
單事件處理:例如?$(selector).live("click",data,function);
多事件處理:1.利用空格分隔多事件,例如?$(selector).live("click dbclick mouseout",data,function);
2.利用大括號(hào)靈活定義多事件,例如?$(selector).live({event1:function, event2:function, ...})
3.空格相隔方式:綁定較為死板,不能給事件單獨(dú)綁定函數(shù),適合處理多個(gè)事件調(diào)用同一函數(shù)情況;
大括號(hào)替代方式:綁定較為靈活,可以給事件單獨(dú)綁定函數(shù);
data:可選;需要傳遞的參數(shù);
function:必需;當(dāng)綁定事件發(fā)生時(shí),需要執(zhí)行的函數(shù);
適用Jquery版本
jquery1.9版本以下支持,jquery1.9及其以上版本刪除了此方法,jquery1.9以上版本用on()方法來代替。
3、delegate()
簡要描述
delegate()?為指定的元素(被選元素的子元素)添加一個(gè)或多個(gè)事件處理程序,并規(guī)定當(dāng)這些事件發(fā)生時(shí)運(yùn)行的函數(shù)。使用 delegate() 方法的事件處理程序適用于當(dāng)前或未來的元素(比如由腳本創(chuàng)建的新元素)。
使用方式
$(selector).delegate(childSelector,event,data,function)
childSelector:?必需項(xiàng);需要添加事件處理程序的元素,一般為selector的子元素;
event:必需項(xiàng);添加到元素的一個(gè)或多個(gè)事件,例如 click,dblclick等;
單事件處理:例如?$(selector).delegate(childselector,"click",data,function);
多事件處理:1.利用空格分隔多事件,例如?$(selector).delegate(childselector,"click?dbclick mouseout",data,function);
2.利用大括號(hào)靈活定義多事件,例如?$(selector).delegate(childselector,{event1:function, event2:function, ...})
3.空格相隔方式:綁定較為死板,不能給事件單獨(dú)綁定函數(shù),適合處理多個(gè)事件調(diào)用同一函數(shù)情況;
大括號(hào)替代方式:綁定較為靈活,可以給事件單獨(dú)綁定函數(shù);
data:可選;需要傳遞的參數(shù);
function:必需;當(dāng)綁定事件發(fā)生時(shí),需要執(zhí)行的函數(shù);
適用Jquery版本
jquery1.4.2及其以上版本;
4、on()
簡要描述
on()?為指定的元素,添加一個(gè)或多個(gè)事件處理程序,并規(guī)定當(dāng)這些事件發(fā)生時(shí)運(yùn)行的函數(shù)。使用 on() 方法的事件處理程序適用于當(dāng)前或未來的元素(比如由腳本創(chuàng)建的新元素)。
使用方式
$(selector).on(event,childselector,data,function)
event:必需項(xiàng);添加到元素的一個(gè)或多個(gè)事件,例如 click,dblclick等;
單事件處理:例如?$(selector).on("click",childselector,data,function);
多事件處理:1.利用空格分隔多事件,例如?$(selector).on("click?dbclick mouseout",childseletor,data,function);
2.利用大括號(hào)靈活定義多事件,例如?$(selector).on({event1:function, event2:function, ...},childselector);
3.空格相隔方式:綁定較為死板,不能給事件單獨(dú)綁定函數(shù),適合處理多個(gè)事件調(diào)用同一函數(shù)情況;
大括號(hào)替代方式:綁定較為靈活,可以給事件單獨(dú)綁定函數(shù);
childSelector:?可選;需要添加事件處理程序的元素,一般為selector的子元素;
data:可選;需要傳遞的參數(shù);
function:必需;當(dāng)綁定事件發(fā)生時(shí),需要執(zhí)行的函數(shù);
適用Jquery版本
jquery1.7及其以上版本;jquery1.7版本出現(xiàn)之后用于替代bind(),live()綁定事件方式;
四種方式的異同和優(yōu)缺點(diǎn)
相同點(diǎn):
1.都支持單元素多事件的綁定;空格相隔方式或者大括號(hào)替代方式;
2.均是通過事件冒泡方式,將事件傳遞到document進(jìn)行事件的響應(yīng);
比較和聯(lián)系:
1.bind()函數(shù)只能針對已經(jīng)存在的元素進(jìn)行事件的設(shè)置;但是live(),on(),delegate()均支持未來新添加元素的事件設(shè)置;
2.bind()函數(shù)在jquery1.7版本以前比較受推崇,1.7版本出來之后,官方已經(jīng)不推薦用bind(),替代函數(shù)為on(),這也是1.7版本新添加的函數(shù),同樣,可以
用來代替live()函數(shù),live()函數(shù)在1.9版本已經(jīng)刪除;
3.live()函數(shù)和delegate()函數(shù)兩者類似,但是live()函數(shù)在執(zhí)行速度,靈活性和CSS選擇器支持方面較delegate()差些
4.bind()支持Jquery所有版本;live()支持jquery1.8-;delegate()支持jquery1.4.2+;on()支持jquery1.7+;
總結(jié)
如果項(xiàng)目中引用jquery版本為低版本,推薦用delegate(),高版本jquery可以使用on()來代替,以上僅為個(gè)人看法
live在jQuery1.7中就不再建議使用,在1.9中就給刪除了。\x0d\x0a在jQuery官方網(wǎng)站上說明了原因,并聲稱用on方法取代live方法。\x0d\x0ajQuery官方網(wǎng)站聲稱下面三行代碼是等價(jià)的\x0d\x0a$("a.offsite").live("click",function(){alert("Goodbye!");});//jQuery1.3+\x0d\x0a$(document).delegate("a.offsite","click",function(){alert("Goodbye!");});//jQuery1.4.3+\x0d\x0a$(document).on("click","a.offsite",function(){alert("Goodbye!");});//jQuery1.7+
1. 使用了被廢棄的jQuery.fn.live方法
jQuery Migrate庫對此錯(cuò)誤也在控制臺(tái)有相應(yīng)的警告:
JQMIGRATE: jQuery.fn.live() is deprecated
live方法原本的作用是設(shè)置事件代理,該方法在jQuery 1.7之后就不推薦使用了,取代之的是jQuery.fn.on函數(shù)。他們的接口分別是:
$(selector).live('click', function(){/* some code */});$(selector).on('click', [selector,] function(){/* some code */});
乍一看,中括號(hào)里面的參數(shù)可以省略掉,倆函數(shù)不是一模一樣么?于是天真地把函數(shù)名live直接替換成on,大部分時(shí)候,這么做好像沒有引起任何異常。但是如果在你調(diào)用on函數(shù)的時(shí)候,前面的$(selector)在當(dāng)前的網(wǎng)頁上根本不匹配任何元素(該元素可能是后面的代碼才加到DOM里的),那是不會(huì)綁定成功的。事實(shí)上,live函數(shù)將$(selector)代理到了document元素上,這個(gè)元素是肯定存在的,所以不會(huì)出現(xiàn)類似情況。正確的替換方法應(yīng)該是:
$(selector).live('click', function(){/* some code */}); 替換為$(document).on('click', selector, function(){/* some code */});
2. 使用了被廢棄的jQuery.fn.die方法
jQuery Migrate對此錯(cuò)誤的警告是:
JQMIGRATE: jQuery.fn.die() is deprecated
這個(gè)方法和前面的live剛好反過來,取消事件處理函數(shù)的綁定。新版本中應(yīng)該使用off函數(shù)代替之,替換方式類似。
3. 使用了被廢棄的jQuery.fn.toggle函數(shù)
jQuery Migrate對此錯(cuò)誤的警告是:
JQMIGRATE: jQuery.fn.toggle(handler, handler...) is deprecated
早期jQuery中名字叫toggle的函數(shù)有兩個(gè),一個(gè)是用于控制元素的顯示和隱藏,這個(gè)用途的函數(shù)目前jQuery中依舊存在;另一個(gè)就是上面提到的被廢棄的toggle函數(shù),它用于綁定至少兩個(gè)函數(shù)到同一個(gè)元素,點(diǎn)擊該元素的時(shí)候兩個(gè)函數(shù)交替著執(zhí)行。這兩個(gè)同名函數(shù)功能相差甚遠(yuǎn),為了不引起誤導(dǎo),在jQuery
1.8中就不再建議使用了。替換的方式是把兩個(gè)函數(shù)合并成一個(gè)函數(shù)的if-else兩個(gè)區(qū)段,然后自己設(shè)置一個(gè)boolean變量,控制每次點(diǎn)擊時(shí)應(yīng)該執(zhí)行哪個(gè)區(qū)段即可。
4. 使用了被廢棄的jQuery.browser屬性
jQuery Migrate對此錯(cuò)誤的警告是:
JQMIGRATE: jQuery.browser is deprecated
在前端開發(fā)中我們經(jīng)常要根據(jù)不同的瀏覽器版本做出不同的處理,jQuery.browser本來是通過瀏覽器的userAgent字段來提取瀏覽器相關(guān)信息的。新版本中已經(jīng)將其廢棄,而是建議使用特征檢測的方法去判斷,并且給了一個(gè)Modernizr庫作為推薦。不過,改成這個(gè)庫可能改動(dòng)成本有點(diǎn)大,如果你還是想沿用jQuery.browser的思路的話,可以自己去實(shí)現(xiàn)一下它。例如,判斷是不是IE瀏覽器,可以用
/msie/.test(navigator.userAgent.toLowerCase());
即自己手動(dòng)獲取userAgent字段,并且做一個(gè)正則表達(dá)式匹配。其他瀏覽器思路類似,都是對navigator.userAgent做一個(gè)正則匹配。
5. $(html)格式書寫錯(cuò)誤
在jQuery Migrate中,出現(xiàn)以下三種警告中的任何一種,都是屬于這個(gè)錯(cuò)誤:
JQMIGRATE: $(html) HTML strings must start with '' characterJQMIGRATE: $(html) HTML text after last tag is ignoredJQMIGRATE: HTML string cannot start with a '#' character
這個(gè)錯(cuò)誤還是蠻值得注意的,因?yàn)槲覀兾恼麻_頭所說的jQuery低版本有XSS漏洞,其實(shí)就是和這個(gè)錯(cuò)誤有關(guān)系。在javascript中我們經(jīng)常會(huì)直接將一段html格式的字符串寫在jQuery引用里面,比如$('p/p')。按照新版本的jQuery要求,這段html格式的字符串必須是以左尖括號(hào)(小于號(hào))開頭,其他字符都不可以。以下幾種寫法,都是錯(cuò)誤的:
$(" p/p"); //錯(cuò)誤,字符串最開頭有一個(gè)空格,不是以小于號(hào)''開頭的$("p/ptest"); //不標(biāo)準(zhǔn),html標(biāo)簽結(jié)束后后面還有多余的"test",它會(huì)被忽略$("#p/p); //錯(cuò)誤,以井號(hào)開頭并且后面并不是一個(gè)css選擇器
這一點(diǎn)在書寫的時(shí)候注意一下就可以了,其實(shí)還是很容易避免的。其中第三種錯(cuò)誤其實(shí)就不僅僅是警告了,jQuery會(huì)直接拋出一個(gè)錯(cuò)誤,停止javascript代碼的繼續(xù)執(zhí)行。一般情況以井號(hào)開頭,例如$("#test"),其實(shí)就是一個(gè)普通的選擇器,但是上面例子中后面又夾雜著html字符串,這會(huì)被jQuery判斷為潛在的XSS攻擊。
6. jQuery.fn.attr方法的錯(cuò)誤使用(這是個(gè)非常易犯的錯(cuò)誤?。?/p>
jQuery Migrate中,關(guān)于attr方法的警告有以下這些:
JQMIGRATE: jQuery.fn.attr('value', val) no longer sets propertiesJQMIGRATE: jQuery.fn.attr('value') no longer gets propertiesJQMIGRATE: jQuery.fn.attr('checked') may use property instead of attributeJQMIGRATE: jQuery.fn.attr( props, pass ) is deprecated
實(shí)踐中我發(fā)現(xiàn),早期寫的代碼里面,獲取一個(gè)input輸入表單的值時(shí),是怎么獲取的呢?$('input').attr('value');又是怎么設(shè)置的呢?$('input').attr('value',
'helloworld')。這在新版本中都是不正確的!正確的做法應(yīng)該是
$('input').val(); //獲取input表單現(xiàn)在所輸入的值
$('input').val('helloworld'); //設(shè)置input表單輸入的值
到底是獲取還是設(shè)置,只取決于調(diào)用val方法時(shí)有沒有帶著參數(shù)。
如果你想手動(dòng)設(shè)置單選框(例如input
type="radio" )被選中,應(yīng)該怎么設(shè)置呢?老的代碼里面可能會(huì)看到這樣 $('input').attr('checked',
true)或者$('input').attr('checked', 'checked')。這些現(xiàn)在也都是不正確的!正確的做法應(yīng)該是
$('input').prop('checked', true); //把單選框設(shè)為選中狀態(tài)$('input').prop('checked'); //獲取單選框是不是被選中了,返回true或false
這是從jQuery
1.6版本開始使用的寫法。如果設(shè)置disabled和selected屬性,也是使用prop方法。那到底什么時(shí)候使用attr方法呢?兩者的區(qū)別是:prop設(shè)置的是某元素固有的屬性,而attr設(shè)置的是寫在html標(biāo)簽上的自定義屬性。舉個(gè)例子:
input type="checkbox" checked="checked" haha="hello" var v1 = $('input').prop("checked"); //返回true/false,是否被選中,隨狀態(tài)改變而改變var v2 = $('input').attr("checked"); //返回"checked",這是你設(shè)置在標(biāo)簽上的,不會(huì)變var v3 = $('input').attr("haha"); //返回"hello",自定義屬性var v4 = $('input').prop("haha"); //返回undefined,根本沒有這個(gè)固有屬性
上面提到的第四個(gè)錯(cuò)誤,jQuery.fn.attr(props, pass) is deprecated這個(gè)警告在真實(shí)項(xiàng)目中從未見到過,看了一下源碼,觸發(fā)該警告的jQuery寫法很少見,可忽略。
7. 向$.parseJSON傳入了非法的參數(shù)
在jQuery Migrate中,該錯(cuò)誤產(chǎn)生如下警告
JQMIGRATE: jQuery.parseJSON requires a valid JSON string
jQuery之所以改這個(gè)接口,是為了和瀏覽器自帶的JSON.parse接口對齊,從jQuery
1.9開始生效。這個(gè)問題常見于AJAX接收服務(wù)端返回值的時(shí)候。服務(wù)端可能返回一個(gè)空字符串,這時(shí)候調(diào)用該接口會(huì)產(chǎn)生錯(cuò)誤。必須向$.parseJSON傳入合法的JSON字符串。修正方法如下:
var v1 = $.parseJSON(str); 替換為var v1 = $.parseJSON( str ? str : "null" );
8. 使用了被廢棄的'hover'事件字符串
在jQuery Migrate中該錯(cuò)誤產(chǎn)生如下警告
JQMIGRATE: 'hover' pseudo-event is deprecated, use 'mouseenter mouseleave'
在注冊事件處理函數(shù)時(shí),'hover'以前可以看作是'mouseenter mouseleave'兩個(gè)事件的別稱。目前已經(jīng)將該別稱去掉了,所以代碼中請用'mouseenter mouseleave'替換之。
9. jQuery.fn.andSelf已經(jīng)被替換,不能再使用
jQuery Migrate中是這樣的警告:
JQMIGRATE: jQuery.fn.andSelf() replaced by jQuery.fn.addBack()
兩個(gè)函數(shù)功能是完全一樣的,可以直接替換。
1. jQuery不兼容瀏覽器的怪異模式
這個(gè)錯(cuò)誤的觸發(fā)方式非常簡單,直接把html頁面最頂端的!DOCTYPE
html標(biāo)簽刪掉就可以了。瀏覽器怪異模式是為了兼容老古董網(wǎng)頁而設(shè)計(jì)的,詳情可參考這篇文章:鏈接。我想現(xiàn)在的WEB程序員應(yīng)該不會(huì)傻到不寫DOCTYPE,也很少使用這種模式下的瀏覽器吧。
jQuery Migrate展示的錯(cuò)誤警告如下:
2. AJAX全局事件必須綁定到document節(jié)點(diǎn)上
jQuery Migrate中的警告如下:
JQMIGRATE: AJAX events should be attached to document: ajaxStart
jQuery中AJAX全局事件包括如下接口ajaxStart,
ajaxStop, ajaxSend, ajaxComplete, ajaxError,
ajaxSuccess。因?yàn)檫@些事件使用的比較少,所以也歸在少見坑當(dāng)中。從jQuery
1.9開始,這些事件只能綁定到$(document)上。改正方法如下(摘自jQuery官網(wǎng)):
$("#status").ajaxStart(function(){ $(this).text("Ajax started"); }); 修改為$(document).ajaxStart(function(){ $("#status").text("Ajax started"); });
3. IE6/7/8瀏覽器不支持修改input表單的type屬性
在jQuery Migrate中是這樣的警告:
JQMIGRATE: Can't change the 'type' of an input or button in IE 6/7/8
改變input的表單的type屬性,你可以直接把文本框改成單選框,改成多選框等等。雖然我感覺這是一種并不算優(yōu)雅的行為,但是很多瀏覽器都是支持這么做的,除了IE6/7/8。建議在實(shí)際中也是少用這個(gè)功能為好。
4. 使用了被移除的$.clean, $.event.handle, $.attrFn, $.fn.data('events'), jQuery.event.trigger屬性與方法
在jQuery Migrate中是這樣的警告:
JQMIGRATE: jQuery.clean() is deprecatedJQMIGRATE: jQuery.event.handle is undocumented and deprecatedJQMIGRATE: jQuery.attrFn is deprecatedJQMIGRATE: Use of jQuery.fn.data('events') is deprecatedJQMIGRATE: Global events are undocumented and deprecated
如果你在自己的代碼中使用過這五個(gè)接口,那確實(shí)是仔細(xì)研究過jQuery源代碼的高人啊。因?yàn)檫@五個(gè)接口從來沒有出現(xiàn)在jQuery的官方文檔中,并且有些在后續(xù)版本中已經(jīng)刪除,可謂來無影去無蹤。看源代碼的話在早期版本有機(jī)會(huì)找到他們的存在,但是并不建議使用。建議采用其他方法實(shí)現(xiàn)相應(yīng)的功能。什么?你不知道這五個(gè)函數(shù)是什么功能?那最好了,你現(xiàn)在也不需要知道了……
5. 使用了過時(shí)的$.sub()方法
jQuery Migrate中對本問題的警告如下:
JQMIGRATE: jQuery.sub() is deprecated
這個(gè)接口非常簡單,不接受任何參數(shù)。它用來創(chuàng)建一個(gè)jQuery的副本。該方法在jQuery 1.7版本開始就已經(jīng)不再使用。
6. 使用了過時(shí)的jQuery.fn.error方法
jQuery Migrate中對本問題的警告如下:
JQMIGRATE: jQuery.fn.error() is deprecated
在jQuery中,error也是和click一樣的事件。注冊該事件的處理函數(shù),以前是$(selector).error(function(){}),現(xiàn)在已經(jīng)被廢棄,可以使用$(selector).on('error', function(){})來替代。
jquery 兼容IE6的并且最穩(wěn)定版本是1.4.4 和1.8.3
1.4.4號(hào)稱是最穩(wěn)定 因?yàn)槿藗冋嬲_始對jquery投入很大關(guān)注 就是1.4.4紅火之日
不過極力推薦在可以更改的前提下 升級(jí)jq 現(xiàn)在最好升級(jí)到1.8.3
1.9刪除了一些東西 恐怕你現(xiàn)在使用會(huì)造成一些困難
2.0 是徹底放棄了ie6,7,8的一些固執(zhí)的死語法
至于1.7 不上不下,沒意義,建議用·1.8.3