jQuery 是 prototype 之后又一个优U?Javascript 框架。其宗旨是—写更少的代?做更多的事情。它是轻量?js ?压羃后只?1k) Q这是其它的 js 库所?a >?qing)的Q它兼容 CSS3Q还兼容各种览器(IE 6.0+, FF 1.5+, Safari 2.0+, Opera 9.0+Q?jQuery 是一个快速的Q简z的 javaScript 库,使用戯更方便地处理 HTML documents、events、实现动L果,q且方便Cؓ(f)|站提供 AJAX 交互?jQuery q有一个比较大的优势是Q它的文档说明很全,而且各种应用也说得很详细Q同时还有许多成熟的插g可供选择?jQuery 能够使用L(fng) html 保持代码和 html 内容分离Q也是_(d)不用再在 html 里面插入一堆js来调用命令了Q只需定义 id 卛_。今天在Kollermedia.at上发C一JQuery插g列表?a target="_blank">文章Q特推荐如下?/p>
Ajax File Upload.
jQUploader.
Multiple File Upload plugin.
jQuery File Style.
Styling an input type file.
Progress Bar Plugin.
jQuery Validation.
Auto Help.
Simple jQuery form validation.
jQuery XAV - form validations.
jQuery AlphaNumeric.
Masked Input.
TypeWatch Plugin.
Text limiter for form fields.
Ajax Username Check with jQuery.
jQuery Combobox.
jQuery controlled dependent (or Cascadign) Select List.
Multiple Selects.
Select box manipulation.
Select Combo Plugin.
jQuery - LinkedSelect
Auto-populate multiple select boxes.
Choose Plugin (Select Replacement).
jQuery Form Plugin.
jQuery-Form.
jLook Nice Forms.
jNice.
Ping Plugin.
Toggle Form Text.
ToggleVal.
jQuery Field Plugin.
jQuery Form’n Field plugin.
jQuery Checkbox manipulation.
jTagging.
jQuery labelcheck.
Overlabel.
3 state radio buttons.
ShiftCheckbox jQuery Plugin.
Watermark Input.
jQuery Checkbox (checkboxes with imags).
jQuery SpinButton Control.
jQuery Ajax Form Builder.
jQuery Focus Fields.
jQuery Time Entry.
jQuery UI Datepicker.
jQuery date picker plugin.
jQuery Time Picker.
Time Picker.
ClickPick.
TimePicker.
Farbtastic jQuery Color Picker Plugin.
Color Picker by intelliance.fr.
jQuery Star Rating Plugin.
jQuery Star Rater.
Content rater with asp.net, ajax and jQuery.
Half-Star Rating Plugin.
jQuery Suggest.
jQuery Autocomplete.
jQuery Autocomplete Mod.
jQuery Autocomplete by AjaxDaddy.
jQuery Autocomplete Plugin with HTML formatting.
jQuery Autocompleter.
AutoCompleter (Tutorial with PHP&MySQL).
quick Search jQuery Plugin.
jTagEditor.
WYMeditor.
jQuery jFrame.
Jeditable - edit in place plugin for jQuery.
jQuery editable.
jQuery Disable Text Select Plugin.
Edit in Place with Ajax using jQuery.
jQuery Plugin - Another In-Place Editor.
TableEditor.
tEditable - in place table editing for jQuery.
jMedia - accessible multi-media embedding.
JBEdit - Ajax online Video Editor.
jQuery MP3 Plugin.
jQuery Media Plugin.
jQuery Flash Plugin.
Embed QuickTime.
SVG Integration.
ThickBox.
jQuery lightBox plugin.
jQuery Image Strip.
jQuery slideViewer.
jQuery jqGalScroll 2.0.
jQuery - jqGalViewII.
jQuery - jqGalViewIII.
jQuery Photo Slider.
jQuery Thumbs - easily create thumbnails.
jQuery jQIR Image Replacement.
jCarousel Lite.
jQPanView.
jCarousel.
Interface Imagebox.
Image Gallery using jQuery, Interface & Reflactions.
simple jQuery Gallery.
jQuery Gallery Module.
EO Gallery.
jQuery ScrollShow.
jQuery Cycle Plugin.
jQuery Flickr.
jQuery Lazy Load Images Plugin.
Zoomi - Zoomable Thumbnails.
jQuery Crop - crop any image on the fly.
Image Reflection.
jQuery Plugin googlemaps.
jMaps jQuery Maps Framework.
jQmaps.
jQuery & Google Maps.
jQuery Maps Interface forr Google and Yahoo maps.
jQuery J Maps - by Tane Piper.
Tetris with jQuery.
jQuery Chess.
Mad Libs Word Game.
jQuery Puzzle.
jQuery Solar System (not a game but awesome jQuery Stuff).
UI/Tablesorter.
jQuery ingrid.
jQuery Grid Plugin.
Table Filter - awesome!.
TableEditor.
jQuery Tree Tables.
Expandable “Detail” Table Rows.
Sortable Table ColdFusion Costum Tag with jQuery UI.
jQuery Bubble.
TableSorter.
Scrollable HTML Table.
jQuery column Manager Plugin.
jQuery tableHover Plugin.
jQuery columnHover Plugin.
jQuery Grid.
TableSorter plugin for jQuery.
tEditable - in place table editing for jQuery.
jQuery charToTable Plugin.
jQuery Grid Column Sizing.
jQuery Grid Row Sizing.
jQuery Wizard Plugin .
jQuery Chart Plugin.
Bar Chart.
jQuery Corner.
jQuery Curvy Corner.
Nifty jQuery Corner.
Transparent Corners.
jQuery Corner Gallery.
Gradient Plugin.
jQuery Spoiler plugin.
Text Highlighting.
Disable Text Select Plugin.
jQuery Newsticker.
Auto line-height Plugin.
Textgrad - a text gradient plugin.
LinkLook - a link thumbnail preview.
pager jQuery Plugin.
shortKeys jQuery Plugin.
jQuery Biggerlink.
jQuery Ajax Link Checker.
jQuery Plugin - Tooltip.
jTip - The jQuery Tool Tip.
clueTip.
BetterTip.
Flash Tooltips using jQuery.
ToolTip.
jQuery Tabs Plugin - awesome! . [demo nested tabs.]
another jQuery nested Tab Set example (based on jQuery Tabs Plugin).
jQuery idTabs.
jdMenu - Hierarchical Menu Plugin for jQuery.
jQuery SuckerFish Style.
jQuery Plugin Treeview.
treeView Basic.
FastFind Menu.
Sliding Menu.
Lava Lamp jQuery Menu.
jQuery iconDock.
jVariations Control Panel.
ContextMenu plugin.
clickMenu.
CSS Dock Menu.
jQuery Pop-up Menu Tutorial.
Sliding Menu.
http://stilbuero.de/jquery/tabs_3/
jQuery Plugin Accordion.
jQuery Accordion Plugin Horizontal Way.
haccordion - a simple horizontal accordion plugin for jQuery.
Horizontal Accordion by portalzine.de.
HoverAccordion.
Accordion Example from fmarcia.info.
jQuery Accordion Example.
jQuery Demo - Expandable Sidebar Menu.
Sliding Panels for jQuery.
jQuery ToggleElements.
Coda Slider.
jCarousel.
Accesible News Slider Plugin.
Showing and Hiding code Examples.
jQuery Easing Plugin.
jQuery Portlets.
AutoScroll.
Innerfade.
UI/Draggables.
EasyDrag jQuery Plugin.
jQuery Portlets.
jqDnR - drag, drop resize.
Drag Demos.
XSLT Plugin.
jQuery Ajax call and result XML parsing.
xmlObjectifier - Converts XML DOM to JSON.
jQuery XSL Transform.
jQuery Taconite - multiple Dom updates.
RSS/ATOM Feed Parser Plugin.
jQuery Google Feed Plugin.
Wresize - IE Resize event Fix Plugin.
jQuery ifixpng.
jQuery pngFix.
Link Scrubber - removes the dotted line onfocus from links.
jQuery Perciformes - the entire suckerfish familly under one roof.
Background Iframe.
QinIE - for proper display of Q tags in IE.
jQuery Accessibility Plugin.
jQuery MouseWheel Plugin.
jQuery Impromptu.
jQuery Confirm Plugin.
jqModal.
SimpleModal.
jQuery Style Switcher.
JSS - Javascript StyleSheets.
jQuery Rule - creation/manipulation of CSS Rules.
jPrintArea.
FlyDOM.
jQuery Dimenion Plugin.
jQuery Loggin.
Metadata - extract metadata from classes, attributes, elements.
Super-tiny Client-Side Include Javascript jQuery Plugin.
Undo Made Easy with Ajax.
JHeartbeat - periodically poll the server.
Lazy Load Plugin.
Live Query.
jQuery Timers.
jQuery Share it - display social bookmarking icons.
jQuery serverCookieJar.
jQuery autoSave.
jQuery Puffer.
jQuery iFrame Plugin.
Cookie Plugin for jQuery.
jQuery Spy - awesome plugin.
Effect Delay Trick.
jQuick - a quick tag creator for jQuery.
Metaobjects.
elementReady.
英文Q?a title="http://www.kollermedia.at/archive/2007/11/21/the-ultimate-jquery-plugin-list/" >http://www.kollermedia.at/archive/2007/11/21/the-ultimate-jquery-plugin-list/
让我们通过一个简单的例子来认识这个问题。假设你要徏立一个树(wi)形结构的公告栏系l?BBS)Q它可以Ҏ(gu)用户h与服务器q行交互Q动态加载每文章的信息Q而不是一ơ性从服务器蝲入所有文章信息。每文章有四个相关属性:(x)pȝ中可以作为唯一标识的ID、发贴h姓名、文章内容以?qing)包含其所有子文章ID的数l信息。首先假定有一个名为getArticle()的函数可以加载一文章信息。该函数接收的参数是要加载文章的IDQ通过它可从服务器获取文章信息。它q回的对象包含与文章相关的四条属性:(x)idQnameQcontent和children。例E如下:(x)
function ( id ) { var a = getArticle(id); document.writeln(a.name + " " + a.content); }
然而你也许?x)注意到Q重复用同一个文章ID调用此函敎ͼ需要与服务器之间进行反复且无益的通信。想要解册个问题,可以考虑使用函数 getArticleWithCache()Q它相当于一个带有缓存能力的getArticle()。在q个例子中,getArticle()q回的数据只是作Z个全局变量被保存下来:(x)
var cache = {}; function getArticleWithCache ( id ) { if ( !cache[id] ) { cache[id] = getArticle(id); } return cache[id]; }
现在已将d的文章缓存v来,让我们再来考虑一下函数backgroundLoad()Q它应用我们上面提到的缓存机制加载所有文章信息。其用途是Q当读者在阅读某篇文章Ӟ从后台预加蝲它所有子文章。因为文章数据是?wi)状l构的,所以很Ҏ(gu)写一个递归的算法来遍历?wi)ƈ且加载所有的文章Q?/p>
function backgroundLoad ( ids ) { for ( var i=0; i < ids.length; i++ ) { var a = getArticleWithCache(ids[i]); backgroundLoad(a.children); } }
backgroundLoad ()函数接收一个ID数组作ؓ(f)参数Q然后通过每个ID调用前面定义q的getArticldWithCache()Ҏ(gu)Q这样就把每个ID对应的文章缓存v来。之后再通过已加载文章的子文章ID数组递归调用backgroundLoad()Ҏ(gu)Q如此整个文章树(wi)p~存h?/p>
到目前ؓ(f)止,一切似乎看h都很完美。然而,只要你有q开发AJAX应用的经验,你就应该知晓q种q稚的实现方法根本不?x)成功,q个例子成立的基是默?getArticle()用的是同步通信。可是,作ؓ(f)一条基本原则,JavaScript要求在与服务器进行交互时要用异步通信Q因为它是单U程的。就单性而言Q把每一件事情(包括GUI事g和渲染)都放在一个线E里来处理是一个很好的E序模型Q因样就无需再考虑U程同步q些复杂问题。另一斚wQ他也暴露了应用开发中的一个严重问题,单线E环境看h对用戯求响应迅速,但是当线E忙于处理其它事情时(比如说调用getArticle())Q就不能对用L(fng)鼠标点击和键盘操作做出响应?
如果在这个单U程环境里进行同步通信?x)发生什么事情呢Q同步通信?x)中断浏览器的执行直臌得通信l果。在{待通信l果的过E中Q由于服务器的调用还没有完成Q线E会(x)停止响应用户q保持锁定状态直到调用返回。因个原因,当浏览器在等待服务器响应时它不能对用戯Z出响应,所以看h像是ȝ了。当执行 getArticleWithCache()和backgroundLoad()?x)有同样的问题,因?f)它们都是ZgetArticle()函数的。由于下载所有的文章可能?x)耗费很可观的一D|_(d)因此对于backgroundLoad()函数来说Q浏览器在此D|间内的冻l就是一个很严重的问题——既然浏览器都已l冻l,当用h在阅L章时׃可能首先L行后台预加蝲数据Q如果这样做q当前的文章都没办法诅R?/p>
如上所qͼ既然同步通信在用中?x)造成如此严重的问题,JavaScript把异步通信作ؓ(f)一条基本原则。因此,我们可以Z异步通信改写上面的程序?JavaScript要求以一U事仉动的E序设计方式来写异步通信E序。在很多场合中,你都必须指定一个回调程序,一旦收到通信响应Q这个函数就?x)被调用。例如,上面定义的getArticleWithCache()可以写成q样Q?/p>
var cache = {}; function getArticleWithCache ( id, callback ) { if ( !cache[id] ) { callback(cache[id]); } else { getArticle(id, function( a ){ cache[id] = a; callback(a); }); } }
q个E序也在内部调用了getArticle()函数。然而需要注意的是,为异步通信设计的这版getArticle()函数要接收一个函C为第二个参数。当调用q个getArticle()函数Ӟ与从前一栯l服务器发送一个请求,不同的是Q现在函C(x)q速返回而非{待服务器的响应。这意味着Q当执行权交回给调用E序Ӟq没有得到服务器的响应。如此一来,U程可以去执行其它d直至获得服务器响应,q在此时调用回调函数。一旦得到服务器响应Q?getArticle()的第二个参数作ؓ(f)预先定义的回调函数就要被调用Q服务器的返回值即为其参数。同L(fng)QgetArticleWithCache ()也要做些改变Q定义一个回调参C为其W二个参数。这个回调函数将在被传给getArticle()的回调函C调用Q因而它可以在服务器通信l束后被执行?/p>
单是上面q些改动你可能已l认为相当复杂了Q但是对backgroundLoad()函数做得改动会(x)更复杂,它也要被改写成可以处理回调函数的形式Q?/p>
function backgroundLoad ( ids, callback ) { var i = 0; function l ( ) { if ( i < ids.length ) { getArticleWithCache(ids[i++], function( a ){ backgroundLoad(a.children, l); }); } else { callback(); } } l(); }
改动后的backgroundLoad()函数看上d我们以前的那个函数已l相ȝq,不过他们所实现的功能ƈ无二致。这意味着q两个函数都接受ID数组作ؓ(f)参数Q对于数l里的每个元素都要调用getArticleWithCache()Q再应用已经获得子文章ID递归调用backgroundLoad ()。不q同hҎ(gu)l的循环讉KQ新函数中的׃太好辨认了,以前的程序中是用一个for循环语句完成的。ؓ(f)什么实现同样功能的两套函数是如此的大相径庭呢?
q个差异源于一个事实:(x)M函数在遇到有需要同服务器进行通信情况后,都必ȝ刻返回,例如getArticleWithCache()。除非原来的函数不在执行当中Q否则应当接受服务器响应的回调函数都不能被调用。对于JavaScriptQ在循环q程中中断程序ƈ在稍后从q个断点l箋开始执行程序是不可能的Q例如一个for语句。因此,本例利用递归传递回调函数实现@环结构而非一个传l@环语句。对那些熟?zhn)q箋传送风?CPS)的h来说Q这是一?CPS的手动实玎ͼ因ؓ(f)不能使用循环语法Q所以即便如前面提到的遍历树(wi)那么单的E序也得写得很复杂。与事g驱动E序设计相关的问题是控制问?/a>Q@环和其它控制表辑ּ可能比较隄解?/p>
q里q有另外一个问题:(x)如果你把一个没有应用异步通信的函数{换ؓ(f)一个用异步通信的函敎ͼ那么重写的函数将需要一个回调函C为新增参敎ͼqؓ(f)已经存在的APIs造成了很大问题,因ؓ(f)内在的改变没有把影响限于内部Q而是D整体混ؕ的APIs以及(qing)API的其它用者的改变?/p>
造成q些问题目的Ҏ(gu)原因是什么呢Q没错,正是JavaScript单线E机制导致了q些问题。在单线E里执行异步通信需要事仉动程序设计和复杂的语句。如果当E序在等待服务器的响应时Q有另外一个线E可以来处理用户hQ那么上q复杂技术就不需要了?/p>
让我来介l一下Concurrent.ThreadQ它是一个允许JavaScriptq行多线E编E的库,应用它可以大大缓解上文提?qing)的在AJAX开发中与异步通信相关的困难。这是一个用JavaScript写成的免费的软g库,使用它的前提是遵守Mozilla Public License和GNU General Public Licenseq两个协议。你可以?a >他们的网?试试多线E编E?/h3>
马上来下载和使用源码吧!假定你已l将下蝲的源码保存到一个名为Concurrent.Thread.js的文件夹里,在进行Q何操作之前,先运行如下程序,q是一个很单的功能实现Q?/p>
<script type="text/javascript" src="Concurrent.Thread.js"></script>
<script type="text/javascript">
Concurrent.Thread.create(function(){
var i = 0;
while ( 1 ) {
document.body.innerHTML += i++ + "<br>";
}
});
</script>
执行q个E序会(x)序昄?开始的数字Q它们一个接一个出玎ͼ你可以滚屏来看它。现在让我们来仔l研I一下代码,他应用while(1)条g刉了一个不?x)中止的循环Q通常情况下,象这样不断用一个ƈ且是唯一一个线E的JavaScriptE序?x)导致浏览器看v来象ȝ了一P自然也就不会(x)允许你滚屏。那么ؓ(f)什么上面的q段E序允许你这么做呢?关键之处在于while(1)上面的那条Concurrent.Thread.create()语句Q这是这个库提供的一个方法,它可以创Z个新U程。被当做参数传入的函数在q个新线E里执行Q让我们对程序做如下微调Q?/p>
<script type="text/javascript" src="Concurrent.Thread.js"></script>
<script type="text/javascript">
function f ( i ){
while ( 1 ) {
document.body.innerHTML += i++ + "<br>";
}
}
Concurrent.Thread.create(f, 0);
Concurrent.Thread.create(f, 100000);
</script>
在这个程序里有个新函数f()可以重复昄数字Q它是在E序Dv始定义的Q接着以f()为参数调用了两次create()Ҏ(gu)Q传lcreate()Ҏ(gu)的第二个参数会(x)不加修改Clf()。执行这个程序,先会(x)看到一些从0开始的数Q接着是一些从100,000开始的大数Q然后又是接着前面数序的数字。你可以观察到程序在交替昄数和大敎ͼq说明两个线E在同时q行?/span>
让我来展CConcurrent.Thread的另外一个用法。上面的例子调用create()Ҏ(gu)来创建新U程。不调用库里的Q何APIs也有可能实现q个目的。例如,前面那个例子可以q样写:(x)
<script type="text/javascript" src="Concurrent.Thread.js"></script>
<script type="text/x-script.multithreaded-js">
var i = 1;
while ( 1 ) {
document.body.innerHTML += i++ + "<br>";
}
</script>
在script 标签内,很简单地用JavaScript写了一个无I@环。你应该注意到标{ֆ的type属性,那里是一个很陌生的?text/x- script.multithreaded-js)Q如果这个属性被攑֜script标签内,那么Concurrent.Thread׃(x)在一个新的线E内执行标签之间的程序。你应当C一点,在本例一P必须Concurrent.Thread库包含进来?/span>
有了Concurrent.ThreadQ就有可能自如的执行环境在U程之间q行切换Q即使你的程序很ѝ连l性很强。我们可以简要地讨论下如何执行这U操作。简a之,需要进行代码{换。粗略地Ԍ首先要把传递给create()的函数{换成一个字W串Q接着改写直至它可以被分批分次执行。然后这些程序可以依照调度程序逐步执行。调度程序负责协调多U程Q换句话_(d)它可以在适当的时候做整以便每一个修改后的函数都?x)得到同{机?x)运行?Concurrent.Thread实际上ƈ没有创徏新的U程Q仅仅是在原本单U程的基上模拟了一个多U程环境?/p>
虽然转换后的函数看v来是q行在不同的U程内,但是实际上只有一个线E在做这所有的事情。在转换后的函数内执行同步通信仍然?x)造成览器冻l,你也怼(x)认ؓ(f)以前的那些问题根本就没有解决。不q你不必耽心QConcurrent.Thread提供了一个应用JavaScript 的异步通信方式实现的定刉信库,它被设计成当一个线E在{待服务器的响应时允许其它线E运行。这个通信库存?Concurrent.Thread.Http下。它的用法如下所C:(x)
<script type="text/javascript" src="Concurrent.Thread.js"></script>
<script type="text/x-script.multithreaded-js">
var req = Concurrent.Thread.Http.get(url, ["Accept", "*"]);
if (req.status == 200) {
alert(req.responseText);
} else {
alert(req.statusText);
}
</script>
get()Ҏ(gu)Q就像它的名字暗C的那样Q可以通过HTTP的GETҎ(gu)获得指定URL的内容,它将目标URL作ؓ(f)W一个参敎ͼ一个代表HTTPh头的数组作ؓ(f)可选的W二个参数。get()Ҏ(gu)与服务器交互Q当得到服务器的响应后就q回一个XMLHttpRequest对象作ؓ(f)q回倹{当get()Ҏ(gu)q回Ӟ已经收到了服务器响应Q所以就没必要再用回调函数接收结果。自?dng)也不必再耽心当程序等待服务器的响应时览器冻l的情况了。另外,q有一?post()Ҏ(gu)可以用来发送数据到服务器:(x)
<script type="text/javascript" src="Concurrent.Thread.js"></script>
<script type="text/x-script.multithreaded-js">
var req = Concurrent.Thread.Http.post(url, "key1=val1&key2=val2");
alert(req.statusText);
</script>
post()Ҏ(gu)目的URL作ؓ(f)W一个参敎ͼ要发送的内容作ؓ(f)W二个参数。像get()Ҏ(gu)那样Q你也可以将h头作为可选的W三个参数?/p>
如果你用q个通信库实CW一个例子当中的getArticle()Ҏ(gu)Q那么你很快p应用文章开头示例的那种单的Ҏ(gu)写出getArticleWithCache(),backgroundLoad ()以及(qing)其它调用了getArticle()Ҏ(gu)的函C。即使是那版backgroundLoad()正在L章数据,照例q有另外一个线E可以对用户h做出响应Q浏览器因此也不?x)冻l。现在,你能理解在JavaScript中应用多U程有多实用了?
我向你介l了一个可以在JavaScript中应用多U程的库QConcurrent.Thread。这文章的内容只是很初U的东西Q如果你x深入的了解,我推荐?zhn)ȝ?a >the tutorial。它提供有关Concurrent.Thread用法的更多内容,q列Z可供高用户使用的文档,是最适合h的材料。访?a >他们的网?/a>也不错,那里提供更多信息?/p>