Learn CSS Positioning in Ten Steps

http://www.barelyfitz.com/screencast/html-training/css/positioning/

訂閱JavaScript及HTML5每星期的最新資訊

A free, once–weekly e-mail round-up of JavaScript news and articles.
http://javascriptweekly.com/

Top browser technology news and links straight to your inbox, weekly
http://html5weekly.com/

jQuery的.bind()、.live()和.delegate()之間區別

http://developer.51cto.com/art/201103/249694.htm

jQuery的.bind()、.live()和.delegate()之間的區別並非總是那麼明顯的,然而,如果我們對所有的不同之處都有清晰的理解的話,那麼這將會有助於我們編寫出更加簡潔的代碼,以及防止在交互應用中彈出錯誤。

AD:

 

基本要素

jQuery

51CTO推薦專題: jQuery從入門到精通

DOM樹

首先,可視化一個HMTL文檔的DOM樹是很有幫助的。 一個簡單的HTML頁面看起來就像是這個樣子:

jQuery

事件冒泡(又稱事件傳播)

當我們點擊一個鏈接時,其觸發了鏈接元素的單擊事件,該事件則引發任何我們已綁定到該元素的單擊事件上的函數的執行。

  1. $( ‘a’ ).bind( ‘click’ , function () { alert( “That tickles!” ) });

因此一個單擊操作會觸發alert函數的執行。

jQuery

click事件接著會向樹的根方向傳播,廣播到父元素,然後接著是每個祖先元素,只要是它的某個後代元素上的單擊事件被觸發,事件就會傳給它。

jQuery

在操縱DOM的語境中,document是根節點。

現在我們可以較容易地說明.bind()、.live()和.delegate()的不同之處了。

.bind()

  1. $( ‘a’ ).bind( ‘click’ , function () { alert( “That tickles!” ) });

這是最簡單的綁定方法了。 JQuery掃描文檔找出所有的$(‘a’)元素,並把alert函數綁定到每個元素的click事件上。

.live()

  1. $( ‘a’ ).live( ‘click’ , function () { alert( “That tickles!” ) });

JQuery把alert函數綁定到$(document)元素上,並使用’click’和’a’作為參數。 任何時候只要有事件冒泡到document節點上,它就查看該事件是否是一個click事件,以及該事件的目標元素與’a’這一CSS選擇器是否匹配,如果都是的話,則執行函數。

live方法還可以被綁定到具體的元素(或“context”)而不是document上,像這樣:

  1. $( ‘a’ , $( ‘#container’ )[0]).live(…);

.delegate()

  1. $( ‘#container’ ).delegate( ‘a’ , ‘click’ , function () { alert( “That tickles!” ) });

JQuery掃描文檔查找$(‘#container’),並使用click事件和’a’這一CSS選擇器作為參數把alert函數綁定到$(‘#container’)上。 任何時候只要有事件冒泡到$(‘#container’)上,它就查看該事件是否是click事件,以及該事件的目標元素是否與CCS選擇器相匹配。 如果兩種檢查的結果都為真的話,它就執行函數。

可以注意到,這一過程與.live()類似,但是其把處理程序綁定到具體的元素而非document這一根上。 精明的JS’er們可能會做出這樣的結論,即$(‘a’).live() == $(document).delegate(‘a’),是這樣嗎?嗯,不,不完全是。

為什麼.delegate()要比.live()好用

基於幾個原因,人們通常更願意選用jQuery的delegate方法而不是live方法。 考慮下面的例子:

  1. $( ‘a’ ).live( ‘click’ , function () { blah() });
  2. //或者
  3. $(document).delegate( ‘a’ , ‘click’ , function () { blah() });

速度

後者實際上要快過前者,因為前者首先要掃描整個的文檔查找所有的$(‘a’)元素,把它們存成jQuery對象。 儘管live函數僅需要把’a’作為串參數傳遞以用做之後的判斷,但是$()函數並未“知道”被鏈接的方法將會是.live()。

而另一方面,delegate方法僅需要查找並存儲$(document)元素。

一種尋求避開這一問題的方法是調用在$(document).ready()之外綁定的live,這樣它就會立即執行。 在這種方式下,其會在DOM獲得填充之前運​​行,因此就不會查找元素或是創建jQuery對象了。

靈活性和鏈能力

live函數也挺令人費解的。 想想看,它被鏈到$(‘a’)對象集上,但其實際上是在$(document)對像上發生作用。 由於這個原因,它能夠試圖以一種嚇死人的方式來把方法鏈到自身上。 實際上,我想說的是,以$.live(‘a’,…)這一形式作為一種全局性的jQuery方法,live方法會更具意義一些。

僅支持CSS選擇器

最後一點,live方法有一個非常大的缺點,那就是它僅能針對直接的CSS選擇器做操作,這使得它變得非常的不靈活。

欲了解更多關於CSS選擇器的缺點,請參閱Exploring jQuery .live() and .die()一文。

更新:感謝Hacker News上的pedalpete和後面評論中的Ellsass提醒我加入接下來的這一節內容。

為什麼選擇.live()或.delegate()而不是.bind()

畢竟,bind看起來似乎更加的明確和直接,難道不是嗎?嗯,有兩個原因讓我們更願意選擇delegate或live而不是bind:

Ÿ 為了把處理程序附加到可能還未存在於DOM中的DOM元素之上。 因為bind是直接把處理程序綁定到各個元素上,它不能把處理程序綁定到還未存在於頁面中的元素之上。

Ÿ 如果你運行了$(‘a’).bind(…),而後新的鏈接經由AJAX加入到了頁面中,則你的bind處理程序對於這些新加入的鏈接來說是無效的。 而另一方面live和delegate則是被綁定到另一個祖先節點上,因此其對於任何目前或是將來存在於該祖先元素之內的元素都是有效的。

Ÿ 或者為了把處理程序附加到單個元素上或是一小組元素之上,監聽後代元素上的事件而不是循環遍歷並把同一個函數逐個附加到DOM中的100個元素上。 把處理程序附加到一個(或是一小組)祖先元素上而不是直接把處理程序附加到頁面中的所有元素上,這種做法帶來了性能上的好處。

停止傳播

最後一個我想做的提醒與事件傳播有關。 通常情況下,我們可以通過使用這樣的事件方法來終止處理函數的執行:

  1. $( ‘a’ ).bind( ‘click’ , function (e) {
  2. e.preventDefault();
  3. //或者
  4. e.stopPropagation();
  5. });

不過,當我們使用live或是delegate方法的時候,處理函數實際上並沒有在運行,需要等到事件冒泡到處理程序實際綁定的元素上時函數才會運行。 而到此時為止,我們的其他的來自.bind()的處理函數早已運行了。

jQuery事件處理系列-bind與live

http://www.dotblogs.com.tw/wadehuang36/archive/2010/10/13/jquery-bind-live.aspx

Twitter如何在數千台伺服器上快速部署程式碼?

http://www.inside.com.tw/2010/07/17/how-twitter-deploys-application-to-thousands-of-servers

 

image

答案是:用BT,也就是你我應該都很熟悉的BitTorrent。

對於網站經營者、創業者來說,延展性的問題是在網站流量成長過程中勢必會面對的問題,如何建立一個具有延展性的架構(scalable architecture)便是在規劃網站事業過程中不可或缺的專業知識。

如果服務本身的功能性合乎使用者需求,卻因為架構、程式效能、資料庫效能的問題導致服務成長出現瓶頸,如何評估、分析網站效能瓶頸?釐清問題後如何找出對應的解決方案,可以思考的相關議題可能包括:

  • 如何有效率地釐清問題?從使用者端的數據(讀取時間)或是從伺服器端的log檔案、硬體的負載率?
  • 網站效能瓶頸是出現在Client或Server端?是資料庫撐不住還是程式效能不好?是Request太多還是檔案太大?
  • Web Server、DB server如何擠出更多的資源?擠不出資源後如何擴展?擴展後會遇到什麼問題?

參考國外知名網站在架構上的作法是很好的一種方式,儘管服務的規模可能無法相比,但根據「正確的作法與經驗」踏出對的第一步,肯定是有助於突破網站營運的效能瓶頸。

Twitter身為全球最大的微網誌服務,運用數千台的伺服器提供服務給來自全球各地的使用者,然而每當網站內容、應用程式有更新時,如何盡可能地在越短的時間內將程式碼部署(deploy)到所有的伺服器便是相當重要的課題。

Twitter的開發部落格上的一篇文章:「Murder: Fast datacenter code deploys using BitTorrent」分享了Twitter如何持續改善應用程式的部署流程,在過去Twitter使用Capistrano部署應用程式,Capistrano是許多Ruby/Rails使用者(當然也有其他語言的開發人員會使用)用來部署程式碼的一個開源專案,開發人員在部署程式碼的過程都可以透過自動化的部署流程來簡化經常重複的動作,尤其在專案必須同時部署到多台應用程式伺服器時會特別方便。

Twitter在早期便依賴Capistrano來進行應用程式的部署,每當有新版本的程式碼需要釋出時,Capistrano會根據預設好的各種設定、流程到Twitter所有的伺服器上進行更新的動作,在過去伺服器還不多的情況下一切都很美好,但隨著Twitter伺服器數量的成長,到了幾百台伺服器時,事情已經不再像過去一樣美好,甚至到後來擁有數千台伺服器時,更新的作業會耗費40分鐘。

Twitter針對這個問題,認為問題的關鍵在於:使用集中式的系統,也就是所有的伺服器要輪流排隊到同一台版本控制系統上進行程式碼更新。Twitter最初的想法是將版本控制系統也做出分散式的架構,伺服器的程式碼更新就可以分散到不同的機器來壓縮部署時間,但事實上版本控制系統即使分散在多台伺服器上,也同樣會有這些伺服器要更新檔案的時間。因此Twitter發現或許是需要一個完全去中心化、最好像是BitTorrent,利用P2P的特色讓所有的節點都可以協助進行程式碼的更新。

以結果來看,在採用了BitTorrent的方式來更新程式碼後,部署的時間從40分鐘大幅減少到只要12秒鐘!實在是非常驚人的改善,數千台伺服器的程式碼居然只要短短12秒鐘就能完成。

Twitter也將此次部署流程改善的成果分享出來,專案名稱叫做Murder,如果對於技術細節有興趣的讀者,可以再進行深入的研究;筆者簡單摘錄幾個重點如下:

  • Murder是以BitTornado為基礎開發出來的(BitTornado是某一種BitTorrent client)
  • Murder的定位是「協助我們快速的將檔案部署到大批伺服器上」
  • 利用BitTorrent的部署方式可避免防火牆的問題、擁有非常快的傳輸速度
  • 實際的部署程式碼是搭配Capistrano進行,網頁上有很清楚的說明

 

Regular Expressions in MYSQL

http://dev.mysql.com/doc/refman/5.1/en/regexp.html

JS Encoder – jjencode

http://utf-8.jp/public/jjencode.html
太神奇了

Content-Disposition header field (RFC 6266) and the Encodings defined in RFCs 2047, 2231 and 5987

http://greenbytes.de/tech/tc2231/

H61/H67/P67/Z68的區別一覽表

http://hi.baidu.com/keydyzy/blog/item/7212581f1a9adfede1fe0bad.html

Z68/P67/H67/H61主板芯片组规格
各项规格
Z68
P67
H67 H61
PCI-E插槽 1*PCI-E 2.0 x16/x8*2 1*PCI-E 2.0 x16/x8*2 1*PCI-E 2.0 1*PCI-E 2.0
内存
4*DDR3
4*DDR3
4*DDR3
2*DDR3
SATA 2/3
4/2
4/2
4/2
4/0
PCI-E信道 8
8
8
6
PCI-E带宽 5GT/s
5GT/s
5GT/s
5GT/s
磁盘阵列 0,1,5,10 0,1,5,10 0,1,5,10 不支持
USB 2.0接口 14
14
14
10
显示输出 支持 不支持 支持 支持
磁盘智能响应 支持 不支持 不支持 不支持
价格 1099元以上 899-1999元 599-1099元 399-699元