2012年10月31日 星期三

jQuery-scrollTop使頁面滑動的效果練習


今天稍微整理一下之前寫的筆記,關於jQuery滑動的特效,scrollTop,這個很有趣,但我瞬間找不到甚麼範例出來。不過,這只是一個實驗性的練習而已,之後會再回來改進。
剛剛把範例傳到這個網址 :http://winsystem.zymichost.com/scroll/ (空間已過期@20130305)
跑得有點卡卡的因為我圖檔太大><
我會將網路上類似效果的網站補上來,他們都是我學習的對象。
首先先在頁面建立好幾個展示的區塊,像我將範例分成五個div區塊,分別是#chapter1~5。
然後設計一的導覽用的連結列(左側黃色底的部分),位置(position)必須是fixed,不會隨著頁面改變位置。每個區塊的設計沒有特定的需求,重點在於jQuery的效果所帶來的互動感。

整個範例的檔案結構是這樣 :
  • img (影像資料夾,放圖片)
  • index.html (首頁)-->需匯入jQuery
  • scroll.js (寫滑動效果的js)
  • style.css (整個網站的css)


然後我記下了每一個區塊的高度,這個高度你可以利用瀏覽器的檢查元素(google)快速得知,或是自己算,這個高度後面的jquery會用到,計算按下某個連結後,會移動第幾px的位置作為定位。
以下是scroll.js 寫整個網站的js
其中scrollTop:_____px,這邊的px就是累加自上圖各div的高度
$('#to_C?'),利用$('')選取器,當你按下某個ch0?的link,會滑到多少px。
當然我不是用真的link,我只是用span標籤,再給他id,然後用jquery去選取。



檔名:scroll.js (呆呆寫法版)
'0px' 也可以直接寫成0就好,不需單引號跟px
$('#to_c1').click(function(){     
   
    $('html,body').animate({scrollTop: '0px'}, 400);    

});   
      
$('#to_c2').click(function(){        

    $('html,body').animate({scrollTop:'1241px'}, 400);    

});    

$('#to_c3').click(function(){        

    $('html,body').animate({scrollTop:'2291px'}, 500);    

});    

$('#to_c4').click(function(){        

    $('html,body').animate({scrollTop:'3710px'}, 500);    

});

$('#to_c5').click(function(){        

    $('html,body').animate({scrollTop:'4695px'}, 500);  
  
});

以下是我後來又寫了一版新的scroll.js (11/04),
效果同上面,只是是用function

function scrollMe(element,px_val){

    $('#'+element).click(function(){

        $('html,body').animate({scrollTop:px_val}, 500);

    });

    //console.log(element);
    //console.log(px_val);
}

/*--->不用迴圈的方法 效果同下方for
scrollMe("to_c1",0);
scrollMe("to_c2",1241);
scrollMe("to_c3",2291);
scrollMe("to_c4",3710);
scrollMe("to_c5",4695);
*/

for(i=0;i<=4;i++){

    var ary_height = [0,1241,2291,3710,4695];

    scrollMe('to_c'+(i+1),ary_height[i]);
}


2012年10月28日 星期日

[讀書記]學徒模式:優秀軟體開發者的養成之路


今天看了這本學徒模式-優秀軟體開發者的養成之路」,由
Dave H. Hoover與Adewale Oshineye合著,版權為2010歐萊禮媒體公司所有,ISBN書號978-0-596-51838-7。

這本書,對於剛工作四個月的左右的來說,有蠻多省思,而且也提供了很多的學習模式給我參考,我相信看完這本書後,幾個月後,或幾年後會再回來看一次,學習軟體真是漫長之路,從這本書,可以找到維持熱情的方法,雖然我現在缺乏的不是熱情,而是經驗。
這本書並不是拿來告訴讀者如何寫程式,也不是要講解軟體開發的pattern,而是提供了很多的學徒模式,引導正在學習軟體的人,尋找適合自己的學習方式,教導你怎麼由一個新手,成為一個專業的軟體開發人員,比較適合新手觀看。

以下列出的重點(或筆記,或書中的名言)是一些我覺得對我來說比較重要的觀點,如果有興趣,也可以親自去翻閱這本書,他不厚,而且很好看。



  • 向大師學習 -> 情境學習 : 以接近專家的方式學習,和那些人待在相同的工作環境。
  • 『我們所面臨的問題是質,而不是量,...今天我們擁有的開發人員比需要的還多,但卻沒有足夠多的開發人員。』-Pete McBreen,<軟體工藝>,第93頁。
  • 『每一個步驟都該有進入的感覺,這是初學者的心態-一種『成為』的狀態。』-鈴木俊隆。
  • 『在學徒在向大師學習的同時,大師也向學徒學習。熱情的初學者不但能讓大師重新思考,也會由外界引入新的想法為匠師帶來挑戰。一個經過挑選的學徒甚至能夠提高大師的生產力。』-Pete McBreen,<軟體工藝>,第75頁。
  • 『擁有知識並不等同於擁有技術與應用知識開發軟體程式所需的實作能力,這就是所謂的工藝』-Pete McBreen,<軟體工藝>。
  • 收集你嚮往的人的履歷資料。
  • 寫下五份工作中你真正不理解的事情,隨著你工作的變化,隨時修改這份清單。
  • 成長只會發生在進行令人感到恐懼的工作或是全力以赴的工作。
  • 最好的學習就是被一群有經驗的人包圍。
  • 練習練習再練習。
end, 然後看完這本,就...繼續努力吧...

2012年10月27日 星期六

[小筆記]假日好天氣來研究Bootstrap

Ch01 : 什麼是bootstrap [太猛了><!]


Twitter Bootstrap!



上面寫著大大的標語: Sleek, intuitive, and powerful front-end framework for faster and easier web developmentBootstrap是一個強大的前端Framework!,所謂framework,就是一個框架。


稍微看了一下使用bootstrap可以猜測的出來,這個framework,他呢,提供固定的樣板給你,讓你用最快的時間完成一個網站,當然,也能活用它,只是以他的框架為基準。(重點是他已經很漂亮了。)
有用過jQuery Mobile嗎? 就是像那種,UI,CSS,js...都替你準備好了,至於要顯示什麼東西,由你來塞。這樣說很籠統,到時候試一下就知道了。

有人說bootstrap是一套css框架,也有人說他是UI的框架,總之,他非常方便在開發初期,還來不及提供完整UI的雛型時,以現成的漂亮UI,可以先擋著。


看了一下網站首頁的說明 :
Bootstrap utilizes LESS CSS, is compiled via Node, and is managed through GitHub to help nerds do awesome stuff on the web.
1.Bootstrap 利用了LESS CSS,經由節點的方式做編譯,使用GitHub做管理。

Bootstrap was made to not only look and behave great in the latest desktop browsers (as well as IE7!), but in tablet and smartphone browsers via responsive CSS as well.
2.Bootstrap絕對不只有為了最新的桌上型電腦的瀏覽器,連平板, 智慧型手機都可以響應相對應的CSS!

A 12-column responsive grid, dozens of components, javascript plugins, typography, form controls, and even a web-based Customizer to make Bootstrap your own.
3.12列的網格設計,幾十個組件,JavaScript的插件,排版,表格控制等等,基於網頁標準的

以下是使用bootstrap的範例 :
http://twitter.github.com/bootstrap/examples/hero.html
http://twitter.github.com/bootstrap/examples/fluid.html
http://twitter.github.com/bootstrap/examples/starter-template.html#






Ch02 : GET START!-來入門吧...





先看到網站的Get start的頁籤,這裡有兩種下載方式,哪個你最需要呢? 因人而異,先看左邊的


Download compiled : 
用最快的方式開始:編譯和壓縮版的CSS,JS和圖像。沒有文檔或原始文件。
Download source : 
所有的CSS和JavaScript的原始文件,以及文檔的本地副本,需從GitHub下載最新的版本。

我個人喜歡
Download source的版本,比較完整。
但是後面的說明好像都是以Download compiled 作為說明,所以就先下載左邊的Download compiled。

下載之後呢,就解壓縮,把檔案(解壓縮後)放到"心儀"的磁碟槽
(C:\ 還是 D:\ 還是哪,都可以,記住就好)

好! 到這裡安慰一下自己已經很厲害了,看一下這個解壓縮後的資料夾,等一下來看看資料的檔案結構...,(我決定去買杯紅茶再回來繼續寫...)

(這是download compiled的目錄)

(下圖是download source的目錄-->可見較完整)



Ch03 : File structure 資料夾的檔案結構

壓縮下來的檔案,解壓縮後打開,就如同上圖一樣
官方網站是這樣寫... (不過我怎麼沒看到README.md?)
bootstrap/
  ├── css/
  │   ├── bootstrap.css
  │   ├── bootstrap.min.css
  ├── js/
  │   ├── bootstrap.js
  │   ├── bootstrap.min.js
  ├── img/
  │   ├── glyphicons-halflings.png
  │   ├── glyphicons-halflings-white.png
  └── README.md

這個資料夾的結構是bootstrap最基本的形式(所以等一下來要新增html檔),bootstrap.min ,檔名有min是壓縮過的(css或js)版本,在這裡要注意的是,所以的js需要匯入jQuery)Please note that all JavaScript plugins require jQuery to be included.)


Docs 的部分 :(Docs的資料夾要下載Download source的那個才看的到)

  1. 具有預設(global)的網頁樣式,包含他的css,連結,網格系統,還有兩個基本的樣板。
  2. 常見的HTML元素,如排版,代碼,表,表格,按鈕的樣式。此外,還包括Glyphicons,一個偉大的小圖標集。
  3. 常見的視覺介面,像是tab, navbar(導覽列), alert(警示視窗),page headers,還有更多。
  4. terface components like tabs and pills, navbar, alerts, page headers, and more.
  5. Javascript的插件組件


組件列表 :


  • Button groups
  • Button dropdowns
  • Navigational tabs, pills, and lists
  • Navbar
  • Labels
  • Badges
  • Page headers and hero unit
  • Thumbnails
  • Alerts
  • Progress bars
  • Modals
  • Dropdowns
  • Tooltips
  • Popovers
  • Accordion
  • Carousel
  • Typeahead






Ch04 : 開始一個最基本的HTML

現在我的資料夾跟目錄建立一個index.html
To make this a Bootstrapped template, just include the appropriate CSS and JS files:
要做一個bootstrap的基本頁面,只需要匯入合適的css跟js檔案:


在這個html檔寫些基本的html架構: (如官方網站)

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <title>Bootstrap 101 Template</title>
  5. <!-- Bootstrap -->
  6. <link href="css/bootstrap.min.css" rel="stylesheet">
  7. </head>
  8. <body>
  9. <h1>Hello, world!</h1>
  10. <script src="http://code.jquery.com/jquery-latest.js"></script>
  11. <script src="js/bootstrap.min.js"></script>
  12. </body>
  13. </html>

And you're set! With those two files added, you can begin to develop any site or application with Bootstrap.
有設置這兩個檔案,你的設置已經差不多了,你可以開始使用bootstrap開發你的網站或是應用程式

Move beyond the base template with a few example layouts. We encourage folks to iterate on these examples and not simply use them as an end result.

Ch05: Scaffolding (棚架)

剛剛那個例子,只會顯示hello world!在畫面上而已。
當然這樣很空虛,Scaffolding可以幫助你加入你所需要的東西,可以耐心把他看完
Bootstrapt是建立在12列的網格,布局,和組件的基礎下。

文件宣告 : 
首先,Bootstrap需要HTML5文件宣告,這是基本的設定。

排版跟連結 :
bootstrap基本的設定,基本上來說:

  • 他已經移除body的margin
  • 將body的背景顏色設定為white
  • 使用@baseFontFamily, @baseFontSize, 和 @baseLineHeight 屬性作為排版的基礎
  • 經由@linkColor來設定整個網站的連結顏色和:hover的下底線
  • 以上這些樣式可以在scaffolding.less這個文件找到(scaffolding.less這個文件要下載Download source完整版的才看的到)

基本的網格 :
Bootstrap 網格系統採用12列,使用940px寬度的container是不能作用的,其對應的css,這個網格系統適合724px跟1170px寬的視覺畫面,小於767px的,將會變成流動式的畫面,依照畫面的大小頁面中的區塊將會垂直重疊。
(截圖自官方網站)



對於一個基本的兩攔佈局,建立一個row,然後增加適合的欄位(columna)數目(使用.span*標籤),對於bootstrap這個以12格的佈局系統來說,其class分別為span1~span12,span右邊的數字加起來總合是12,即為整列的大小。

看個官方網站上的例子:

  1. <div class="row">
  2. <div class="span4">...</div>
  3. <div class="span8">...</div>
  4. </div>

在這裡建立一個div,其class 是row
裡面含有span4 跟span8這兩個div
4+8 =12
在這個例子中,我們有span4, span8,共12列和一個完整的列。

網格的留白的功能

官方網站是寫 Offsetting columns ,意思就是如何抵銷你不要的欄位
留白的功能,要在左邊空多少就在該class加上 offset* ,*就是span*的大小。

  1. <div class="row">
  2. <div class="span4">...</div>
  3. <div class="span3 offset2">...</div>
  4. </div>



像這頁,這個row,只有兩個class,一個是span4, 一個是span3 ,但是span3的那一個div又加上了offset2的class,表示span3的左邊要空出兩個span的大小。

Layout 基本的佈局 

1.固定佈局
提供一個共同的固定寬度(可選)只需要<div class="container">佈局。(截圖自官方網站)




2.流體佈局
<div class="container-fluid">,創建一個流體,兩欄頁面。(截圖自官方網站)



響應設計 :
響應設計就是Responsive design,簡單來說就是,一旦開啟這個功能,會依照使用者正在使用的媒體界面,調整頁面的寬度,
要啟用響應設計的功能,你只需要加上這幾行在你的head標籤


  1. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  2. <link href="assets/css/bootstrap-responsive.css" rel="stylesheet">


要使用這個功能,一定要下載完整版的bootstrap,否則會找不到assets/css這個路徑,因為不是完整版的根本沒這個路徑。


支援的裝置 :
Bootstrap supports a handful of media queries in a single file to help make your projects more appropriate on different devices and screen resolutions. Here's what's included:


Label版面寬度欄寬Gutter width
大螢幕1200px and up70px30px
預設大小980px and up60px20px
縱向平板768px and above42px20px
手機到平板767px and belowFluid columns, no fixed widths
手機480px and belowFluid columns, no fixed widths



  1. /* Large desktop */
  2. @media (min-width: 1200px) { ... }
  3. /* Portrait tablet to landscape and desktop */
  4. @media (min-width: 768px) and (max-width: 979px) { ... }
  5. /* Landscape phone to portrait tablet */
  6. @media (max-width: 767px) { ... }
  7. /* Landscape phones and down */
@media (max-width: 480px) { ... }



至於組件怎麼使用,css 怎麼使用,javascript怎麼使用,實作的時候再看看><


Ch06 : 客製化下載



Bootstrap提供客製化的下載,你可以只勾選你需要檔案在整個打包下載下來,真方便。
由於第一次接觸這個framework,我決定先改現成的framework作為練習。再慢慢了解如何應用他的組件,Bootstrap對我來說,他的組件設計的真不錯,可以省去很多寫css的時間。

2012年10月20日 星期六

[分享]給設計師的jQuery教學


http://webdesignerwall.com/tutorials/jquery-tutorials-for-designers
給設計師的jQuery教學
這個網站很不錯,非常實用,顯淺易懂,而且幾乎常見的效果都有。
總共有10種效果的教學。

[資料蒐集] 台灣有Frontend 職稱的公司

Front-end Web Developer = 前端工程師
以下是我個人的資料蒐集,並不代表全部
台灣有Frontend 職稱的公司 :



比例上來看,北部有此職稱的工作較多,南部少。
其實這份清單早在我畢業前就準備好了,今天早上整理Google文件時想說來發篇文章好了,順便把放在google的文件給刪了。
在台灣,有這個職稱的公司不多,而在很多其他國家,前端已經殺出成為一個專門的職稱了。一直到我快要畢業,想要開始準備找工作時,才聽過這個職稱,但當時,很多技能,我已經來不及學了,大三到大四兩年的努力,仍然不及資工資管的二分之一吧.....
尤其當我第一次打開人力銀行搜尋"前端"這個職稱的時候,筆數不超過20筆,真是嚇傻了眼...
說實話那時候很擔心找不到工作。現在只一直希望自己可以當個...好厲害的前端 > < ,但路還很長,前端要學的東西,遠遠超乎我的想像。但我不想要自己20出頭"只有這樣",現在只能努力了

2012年10月19日 星期五

好久沒發文章

這幾天都在念軟體工程,雖然也是有學到一點,但還不夠多。
埃,不曉得什麼時候才能更進階自己的能力,實在感到無力...
已經不知所措了。
人在迷茫的時候就會開始迷失方向,真不喜歡這種感覺。最近有點悶,不知道是生活乏味了,還是一直覺得自己沒什麼進度...。

這兩天一直在玩這個網站,

http://www.codecademy.com
關於codecademy的報導:
新年新希望,Codecademy建議:來學寫程式吧!
想學寫程式 五個免費課程報你知


用互動的方式教你寫程式,挺有趣的,晚上在家可以殺時間
有Javascript /Css /Html /jQuery等等, 連Ruby(雖然我不知道這是什麼xd)都有
幾乎我必須懂得都在這裡面
總之,盡量吧

2012年10月12日 星期五

php ~ 把var_dump出來的array變漂亮

今天又學到了一招,在國外的教學網站看到的:P
就是把dump出來的長長一串的array變得易讀。

這是ㄧ般的var_dunp方法 :
$food = array(
          array('name'=>'apple','price'=>20),
          array('name'=>'orange','price'=>50),
          array('name'=>'banana','price'=>70),
        );
var_dump($food);

顯示結果 :  array(3) { [0]=> array(2) { ["name"]=> string(5) "apple" ["price"]=> int(20) } [1]=> array(2) { ["name"]=> string(6) "orange" ["price"]=> int(50) } [2]=> array(2) { ["name"]=> string(6) "banana" ["price"]=> int(70) } }

變漂亮方法 :
var_dump 放再<pre>標籤裡(記住中間以逗號,隔開)。如 :
$food = array(
          array('name'=>'apple','price'=>20),
          array('name'=>'orange','price'=>50),
          array('name'=>'banana','price'=>70),
        );
//var_dump($food);
echo "
",print_r($food),"
";

顯示結果:
Array
(
    [0] => Array
        (
            [name] => apple
            [price] => 20
        )
    [1] => Array
        (
            [name] => orange
            [price] => 50
        )
    [2] => Array
        (
            [name] => banana
            [price] => 70
        )
)
一樣都是把array dump出來,後者真得順眼多了...

2012年10月11日 星期四

TQC+軟體開發知識-準備要點


第一章部分 :


0. 第一章根本是大雜燴,建議看到甚麼專有名詞不懂就直接google吧
    (因為基金會並沒有明確指出有甚麼教材可以參考,書太多了...等到看完就輸了= = )

1. 看李允中的軟體工程一書(第一章,第二章與第四章)

2. 了解河內塔  或看這個 河內塔 (只出現1題,但要知道原理)

3.  松耦合, 內聚力等的了解

4. 物件導向基本概念(沒有很多題)

5. 第一章後面有考很多跟C語言有關的東西(如:遞迴),這個我就.... 我也不會... = = ,但後面的
    跟資料結構有關的地方我覺得重要程度遠勝過於這張證照xd 可以念很久。

6. 注意二維陣列(出現5題) ; 單.雙向鏈結 ; Heap與stack (要了解push跟pop)

7. 二元樹的節度.深度等計算(不少題...),(這個完完全全是資料結構阿.... ),可google "資料結
   構".  或是"樹狀結構"  。如第1-177題,可直接搜尋關鍵字 "二元樹 300 最小高度 ",就可以找
   到公式,這題似乎很經典一樣馬上google就找到....。

8. 二元搜尋法

9. 演算法的時間複雜度計算方式
    (這個我是覺得太難了... 考太細,就算撇開演算法這幾題,有些計算題...實在是....考試能帶
      筆嗎....,要我心算嗎 = = )

10.版本控制的概念,要了解什麼是branch(分支), merge(合併)等...。


第二章部分 :

第二章稍微不誇張一點.....

了解軟體測試的各種方法 :
白箱,黑箱,整合測試,壓力測試,使用者接受度測試。

軟體生命週期(SDLC)

品質循環PDCA

這章,書看看就好~很快~




第三章部分 :

第三部分,不難... 就多看看專案管理的書吧~
題目一定要看過。
了解 專案範疇說明書(project scopt statement,PSS)
範疇管理 
這篇範疇管理也不錯 
軟體專案管理中的人月神話 ,可以參考這篇
了解WBS工作分解結構(work breakdown structure)
CMMI能力成熟整合模型

結論 :

軟體開發知識沒有想像中的好準備
我覺得很難抓到要準備的方向..有些題目也不了解為什麼會這樣的標準答案?!
考題範圍很大,如果可以我期待tqc能提供參考書目的清單.....
總之,對我來說挺麻煩的一科....,這一科感覺很像匯集了好多科目的集合一次考, 但也因為這樣看了不少東西,算是有達到我的目的啦...就這樣吧,學東西總是一個段落一個段落的,無法期待一次瞭解,總是需要經驗彌補不足的地方。


2012年10月9日 星期二

在fedora安裝git

在fedora安裝git : (必須是root身分)
yum install git-core

安裝過程會一直出現問你y/n (yes or not),y下去就是了
安裝完成後會出現complete! 

提供介面設計草圖範本的網站-interfacesketch.tumblr.com


今天收到Smashing的電子報,介紹了這不錯的網站http://interfacesketch.tumblr.com/
這個網站提供了各種平台的設計草稿圖,方便設計者,或是UX使用,設計/規劃出模板,簡單的規畫等等。前提是,可能要印出來。
網站所提供的格式是PDF,分為A4大小或是US-letter。
enjoy it.

2012年10月7日 星期日

2012/10~12月學習目標

2012/10~2012/12

milestone


#1 : 看完軟體工程一書
#2 : learn git 版本控制
#3 : 基本linux管理(不含架設伺服器)
#4 : 有時間的話再考慮考tqc的linux管理
#5 : javascript

2013年 
milestone(大方向,未定)
#1 : 再考一次多益
#2 : pro git
#3 : pro  Linux管理(往架設apache方向前進)
#4 : pro javascript
#5 : pro codeigniter MVC
#6 : pro ajax (hope...)

2012年10月4日 星期四

jQuery & javascript冒泡事件原理


什麼是冒泡事件?

就是事件由底層往上層傳遞,當一個元素的事件被觸發時(例如click),同樣的事件將會在那個元素的所有祖先元素中被觸發,這一個過程被稱為冒泡事件,其過程有如下圖。

舉例:
當在頁面建立了多個div時,相當於建立了父子關係,當父div與子div共同加入了onclick事件時,當觸發了子div的onclick事件後,子div進行相應的js操作,但是父div的onclick事件同樣會被觸發,這就造成了事件的多層觸發,導致頁面混亂,這就是冒泡事件。(這只是舉例)


參考網址來自於以下網址所整理出:
http://www.freezq.cn/article/485.htm
http://www.skygq.com/2011/02/08/jquery-stop-propagation/
http://www.skygq.com/2011/02/08/jquery-stop-propa
http://www.cnblogs.com/zhongweiv/archive/2011/11/04/EventBubbling.htmlgation/
http://hzw2312.blog.51cto.com/2590340/780230 (列出瀏覽器的冒泡流程圖)
http://www.cnblogs.com/zhongweiv/archive/2011/11/04/EventBubbling.html

可參考這些網址,寫得很明瞭。

Note:寫自己的jQuery plugin

重複的功能一直重複寫也不是辦法。jQuery的外掛功能提供你將自己的程式碼打包起來,成為jquery的外掛,降低程式碼的重複性。
對了,下面說明文字:plugin =插件 = 外掛=jquery的外掛程式。

擴展jQuery的plugin跟method是非常強大的,可以減省很多開發時間。
一個網站如果小小的可能沒差,但是管理大站的jQuery可以好好考慮往plugin的方向學習。我看了官方的文件寫了下面的筆記,可以說是翻譯過來,建議可以看官方文件就看官方文件,網址: http://docs.jquery.com/Plugins/Authoring
說實在的可能要真的用到才會懂吧><,而且要寫的機率很低...,所以想說寫之前,先看看別人怎麼寫。
在尋找jquery的範例時就馬上吃了閉門羹,http://plugins.jquery.com/ ,這個網頁還在開發中,好吧,沒關係,像fancybox就是一種jquery的外掛。

外掛程式的命名

(這段可以參考:jQuery網頁設計範例教學/德瑞工作室 松崗出版),因為官方網站沒看到這段,但書裡有介紹到,如果想多了解就看書。

有用過jquery的外掛應該可以想像下載下來就是一個壓縮檔之類的,然後打開之後有css,有js,有html檔,其js除了有jquery的檔案之外,還有外掛程式的.js檔。有用過fancybox嗎?
它的外掛檔如圖:

通常寫plugin會將plugin額外取出另存成一個.js檔,再將js引入到頁面中。
外掛程式的命名如下 :
1) 使用"jquery"作為前置詞,後面接一個"."`,再接你的外掛名稱,在接".",然後加上附檔名,
     如 jquery.你的外掛名稱.js  (ex: jquery.winwingo.js)
2) 附檔名會是js
3) 可以選擇要不要加入版本名稱。如 : jquery.winwingo-1.0.js


開始寫一個jQuery的plugin

jQuery的plugin會先接著一個新的function,另外你也要先想好你的plugin的名稱,範例如下:
jQuery.fn.myPlugin = function(){
        //Do your awesome stuff here 
}:

myPlugin是你的plugin命名,隨意取名(恩…也不是很隨意,就是也要符合命名的規則啦),像是:photoHover,showBackground..等等
//Do your awesome stuff here ,簡單來說這個fn要做的事情都寫在這裡面。
像這樣:
jQuery.fn.sayhello = function(){
        //Do your awesome stuff here
 };


但是,還記得jQuery可以用$替換嗎?
所以剛剛的範例可以改成這樣 :

jQuery.fn.myPlugin = function(){ 
$.fn.myPlugin = function(){
         //Do your awesome stuff here
};


為了確保你的plugin 不會與其他library有碰撞的情況(函數衝突),建議你把你的plugin打包起來。(簡單來說就是把你的程式碼包起來,以防與其他code有相衝或汙染的情況=>官方比較建議您使用這種做法)
因此,我們可以這樣寫:

(function($){ $.fn.myPlugin = function(){
           //Do your awesome stuff here };
})(jQuery);


寫在Plugin的this跟你想得不一樣…. 

前面講得是,怎麼產出一個plugin的方法,但裡面要做些什麼呢?.....官方文件先從包在plugin裡面的this講起….
我第一次看官方文件的時候,實在搞不懂這邊再講什麼,先看一下官方網站所列出來的例子:
這個範例是建立一個myPlugin的plugin,這個plugin會指向一個function(),會使該物件執行fadeIn的事件,這個範例還不夠具體,但只是要表達在$.fn.plugin的function()內的this已經是DOM了。
在這個myPlugin裡面呢,jQuery會接收一個callback(回傳),而這個callback本身就指到DOM,所以直接使用this等於$(this)。

(function( $ ){
$.fn.myPlugin = function() {
           //在這裡,不需要再用$(this),因為”this”已經是jQuery的物件了
           // there's no need to do $(this) because
           // "this" is already a jquery object
           // $(this) would be the same as $($('#element'));
              this.fadeIn('normal', function(){
             //這裡的this是一個HTML元素
               });
};
})( jQuery );

而使用這個myPlugin時這樣寫:
$('#emelent').myPlugin();

比方說我選取一個div,執行myPlugin的plugin,可以這樣寫:
$(‘div’).myplugin();


讓我們寫一個plugin來真正做些事情!

這是ㄧ個簡單的plugin,利用.height() 回傳頁面中最高的div的高度值。
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>The Basic</title>
<style type="text/css">
div{border:1px solid #CCC}
</style>
</head>
<body>
<div style="height:100px">1</div>
<div style="height:50px">2</div>
<div style="height:80px">3</div>
<script src="http://code.jquery.com/jquery-latest.js"></script>
<script type="text/javascript">
(function($){
    $.fn.maxHeight = function(){
      var max = 0;
      this.each(function(){
      //這裡不用$(this) 因為這裡的this已經是$('this')
      //利用each跑遍要被執行的元素
        max = Math.max(max,$(this).height());
      });
      return max;
      console.log(max);
    };
  })(jQuery);

  var tallest = $('div').maxHeight();
  //變數tallest 的值為$(‘div’).maxHeight
  //maxHeight是我們自己寫出來的Plugin
  console.log(tallest);
  //log出頁面最高的div高度
  //如果不會用console.log可以改用 alert (把註解拿掉)
  //alert(tallest);
</script>
</body>



Maintaining Chainability
(這大標我不知道怎麼用中文講)
在前面的例子,我們回傳了一個整數的值,該值是頁面中最高的div的高度值,但某些時候,一個plugin以某種方式簡單的修改該集合的元素,和傳遞鏈(chain)給下一個method,這就是jQuery的設計之美,也是jQuery受歡迎的原因之一。
因此要保持一個plugin的鏈(chain),你必須return this。


參數的傳遞,Default預設值跟option可選值

對於更複雜以及提供很多選項的plugin來說,使用$.extend來延伸一些默認的參數是很好用的。
利用$.extend()將許多物件合併成一個物件。

<script type="text/javascript">
  (function($){
  $.fn.tooltip = function(options){
  //建立一些預設值
  var settings = $.extend({
    'location'        : 'top',
    'background-color': 'blue',
  },options);
  return this.each(function(){
     //Tooltop plugin code here
        });
  }
  })(jQuery);
 
  $('div').tooltip({'location':'left'});

</script>

在上面的範例中,當我們呼叫tooltip時附帶著我們自選的選項(‘location’:’left’),則預設的location將會被覆蓋為left,然而背景色(background-color)因為沒有特別的指定,因此維持預設值(default)一樣是藍色,所以這個物件最後的設定會長這樣:
{
‘location’  :’left’,
        ‘background’ : ‘blue’,
}
這是ㄧ個可任意配置選項的plugin,不需要開發人員自己去定義所有的選項。


Namespcing 命名空間

正確的使用命名空間是開發plugin很重要的一部分,正確的命名,可以降低你的plugin在同一個頁面中被其他plugin或是程式碼覆蓋。
This is a discouraged because it clutters up the $.fn namespace. To remedy this, you should collect all of your plugin's methods in an object literal and call them by passing the string name of the method to the plugin. (-難翻..)

這裡有一個範例:
(function( $ ){

  $.fn.tooltip = function( options ) {
    // THIS
  };
  $.fn.tooltipShow = function( ) {
    // IS
  };
  $.fn.tooltipHide = function( ) {
    // BAD
  };
  $.fn.tooltipUpdate = function( content ) {
    // !!! 
  };

})( jQuery );

以上的範例是比較洩氣的方式,(我的解讀是…)因為以上的程式碼是將所有的明明是很類似的功能都個別分出一個Plugin。為了糾正這個寫法,你可以看看糾正後的樣子:


(function( $ ){

  var methods = {
    init : function( options ) {
      // THIS
    },
    show : function( ) {
      // IS
    },
    hide : function( ) {
      // GOOD
    },
    update : function( content ) {
      // !!!
    }
  };

  $.fn.tooltip = function( method ) {
   
    // Method calling logic
    if ( methods[method] ) {
      return methods[ method ].apply( this, Array.prototype.slice.call( arguments, 1 ));
    } else if ( typeof method === 'object' || ! method ) {
      return methods.init.apply( this, arguments );
    } else {
      $.error( 'Method ' +  method + ' does not exist on jQuery.tooltip' );
    }   
 
  };

})( jQuery );

// calls the init method
$('div').tooltip();

// calls the init method
$('div').tooltip({
  foo : 'bar'
});


這種封裝方法跟結構在jquery的plugin中是很標準的寫法,適用於無數的Plugin,包含jQueryUI也是。


Continue…………….

Vue multiselect set autofocus and tinymce set autofocus

要在畫面一進來 focus multiselect 的方式: 參考: https://jsfiddle.net/shentao/mnphdt2g/ 主要就是在 multiselect 的 tag 加上 ref (例如: my_multiselect), 另外在 mounted...