顯示具有 jquery 標籤的文章。 顯示所有文章
顯示具有 jquery 標籤的文章。 顯示所有文章

2016年4月25日 星期一

Counter Animation 計數動畫蒐集

在碰類似 dashboard 的介面,你一定很常看到各種有點假假的數字動畫,但真的要用到的時候發現我以前根本沒用過類似的套件XD所以就找了幾個套件,我認為看起來還不差的。

可能有些是 survey 到 angular 的版本,主要是因為我剛好在用 angular 啦...

Angular Counter
http://indrimuska.github.io/angular-counter/
設定比較多元,需要搭配 jquery easing

2016年2月23日 星期二

Swiper 套件在 Bootstrap Modal 裡面會失效

如題,如果想知道為什麼可以 google 一下: swiper in bootstrap modal.

然後把呼叫(使用) Swiper 的地方,包進 Bootstrap Modal 的這個 Event 裡:  shown.bs.modal 。

$thisModal.on('shown.bs.modal', function (e) {
   // init Swiper
  //   var swiper =   new Swiper('.swiper-container-bank-query', {});
});


2015年10月13日 星期二

Rails Girls Weekly - JavaScript Basic For 6 Weeks(5/6)


剛剛上完了第五週的課程 jQuery 基礎,其實是真的非常基礎 :P 花了一個多小時帶一下。另外也有提到 Framework 跟 library 是不一樣的概念,如果想學 jQuery,把 css selector 弄懂很重要,如果你是初學者,可以學習以下兩個網站為開端:


http://flukeout.github.io/
https://www.codecademy.com/en/tracks/jquery

2015年1月22日 星期四

點擊圖片, play 播放鍵再載入 Youtube 影片

以前一直沒什麼機會遇到一個頁面要載入一堆 youtube 影片,大概是我很討厭網頁裡面嵌 youtube (我比較喜歡 host 影片在自己的 server),所以也不怎麼在乎。但試過之後才發現,一個頁面擺一堆影片完全拖垮瀏覽速度,卡到不行...,雖然我早有預期會有這個狀況,但沒想到如此淒慘。

後來輾轉之下,我也沒想到什麼好辦法,唯一目前想到的途徑就是,先去 youtube 要該影片的 thumbnail (縮圖檔) ,有些 api 可以用,這個 stackoverflow 問題的解答已經說得詳細了。

有了 thumbnail 之後,接著就是考驗 HTML / CSS 技術,通常,會在 thumbnail 之上,疊一個 play 按鍵,你可以利用 css 的 :before 或是 :after 的 content 屬性,塞入該 play 鍵的 url,或是放 background,也可以,看你怎麼設計跟規劃。

至於 thumbnail 的顯示,由於他本來就是一張圖片,但你也未必要用 img 標籤,像我的話是走一般的 div 或是其他 tag,設定 background,習慣上我喜歡用 background,然後再用 background-size 去 fit 那張圖的大小到 width 跟 height。

以上我說的做法,HTML 大致的輪廓如下 :
(這些 code 可能未必 run 的起來,我在寫文章,所以只是在盲打,我只在描述『方法』而已 )

<div
  class="thumbnail"
  data-youtube-id="HB09QpIf7_A"
  data-video="https://www.youtube.com/embed/HB09QpIf7_A?&autoplay=1"
  style="background-image: url('http://img.youtube.com/vi/HB09QpIf7_A/sddefault.jpg')">
</div>

Note:
如果想要一點擊,接著就替換為 iframe 時就要自動播放,那 youtube 網址要加上 &autoplay=1。

最後,還是得寫 JavaScript,偵測 play 按鈕或是 thumbnail 被點擊的事件,一旦這個 div 被點擊,就把自己替換為 iframe。


$('.thumbnail').click(function() {
    
  var thisYoutubeId = $(this).attr('data-youtube-id');
  
  var video = 
      ''
      + '<iframe id="video' + thisYoutubeId + '"'
      + 'src="'+ $(this).attr('data-video') +'"'
      + ' webkitAllowFullScreen mozallowfullscreen allowFullScreen'
      + ' frameBorder="0"
      + ' data-ytid="'+thisYoutubeId+'"></iframe>';

  $(this).replaceWith(video);

  });

Note:
如果不想要 iframe 有個灰色邊筐,要設定 frameBorder = " 0 "。


See the Pen VYbJXK by winwu (@winwu) on CodePen.

如果有更好的方法,希望你可以留言,分享一下 :)

2014年2月28日 星期五

jQuery 解決 IE11 不支援 $.browser.msie

$.browser.msie 在 IE11 好像不管用,因此我上網找了一下解決方法,如果你的 web 需要判斷『如果是 IE,那就怎樣怎樣的...』,那麼你應該會用到 $.browser.msie,需要判斷到 IE11的話,只要再補上 (!!navigator.userAgent.match(/Trident\/7\./)) 的判斷就可以了:


1
2
3
if ($.browser.msie || (!!navigator.userAgent.match(/Trident\/7\./))) {
    //do something :)
}


解決 jQuery 的 animate scrollTop 方法在 Firefox 沒有作用的問題

最近發生在自己手邊上的案子,發生了這個問題,jQuery 的 scrollTop 是一個很常用的功能,常常我們會在某些 link 上面綁定 click 事件,觸發 scrollTop,然後畫面就會捲到適當的位置,而我發現在 Firefox 卻無法捲動,為什麼呢?

這是因為當 animate 的 scrollTop 方法,其他瀏覽器會作用在 body 元素上,而 FireFox 卻是作用在 html 元素之上,所以本來我的寫法是這樣:



$('element').click(function(e){
    $('body').animate({
            scrollTop:  $('element').offset().top},'slow');
});


因為 animate 只綁到 body,因此就會漏掉 Firefox 沒有作用到,只要加上綁定在 html 上就可以解決:


$('element').click(function(e){
    $('body, html').animate({
            scrollTop:  $('element').offset().top},'slow');
});



參考: Animate scrollTop not working in firefox


2013年10月15日 星期二

JavaScript 抓 ID 對上(v.s) jQuery 抓 ID

我以為,document.getElementById('AAA') 會跟 jQuery 的 selector 抓到一樣的東西,換句話說...我以為他們會指到一樣的東西,但是我錯了(慚愧,當了一年多的前端現在才懂...)。


這種事情發生在我在 maintain 原生 JavaScript 跟 jQuery 並存的 js 檔。
比方說我把原本的 $player 改成用 jQuery 的 selector:
 $player = document.getElementById('player');  
 $player = $('#player');  
但如果真的這樣改就毀了。


因為...
getElementById 抓到的是 HTML DOM Object;
而 jQuery 的 selector 抓到的是 jQuery Object。

如果要把 jQuery 抓到的東西變成 HTML DOM Object,必須明確的指到該 jQuery Object 的第一個元素,像這樣:
 var $player = $('#player')[0];  


截一下 console.log 的比較:


不知道以上的解釋o不ok,
不過學習就這樣樣,答案就是找出來的,而我目前只找到這樣的解法,
如果錯誤還麻煩大大們幫忙指正:)



參考:
document.getElementById vs jQuery $()

利用 onerror 事件偵測圖片沒出現

JavaScript 有個事件叫做 onerror,是說我也是今天才知道,可以用在當你圖片沒抓到時,出現叉燒包及 server responded status 403,可以做一些事情。

通常在網路上爬到的範例,都是將 onerror 的事件偵測寫在行內,像下面這一行這樣,
以這個例子來說,當 demo.jpg 找不到時,就會去做寫在 onerror 裡面的事情,當然啦,假如有 demo.jpg,應該不會觸發 onerror 事件。
<img src="demo.jpg" onerror="alert('no image');"/>


那麼像我不習慣把事件綁在 HTML tag 上,
所以用 jQuery 的事件綁定 (bind) 來做:
當抓到 error 時,把該 img 標籤的 src 取代成預設的圖片。

有趣的是,上面的做法只適合非 Ajax 產生的 img ,我只有第一次載入畫面的時候,會做這件事情,當我點按是用 ajax 處理的分頁時,這下 high 了, 怎麼處理呢?

這時候想到 jQuery 有個 ajaxStop,可以偵測到當你切換頁面,也就是透過 ajax 切換畫面時且在 AJAX 請求結束後執行ajaxStop() 。

真有趣 :)


參考網址:

2013年7月14日 星期日

[Tip]對調垂直的jQuery UI Silder的min與max



最近在使用jQuery UI silder時遇到一個問題
就是當使用orientation: "vertical"時,最大值會在上面,而最小值會在下面
而我是想要最小值在上面,最大值在下面。
看了官方的API,好像沒有辦法設定。

[此圖截自 : http://api.jqueryui.com/slider/ ]




所以為了解決這個問題,在stackoverflow找到了方法:
http://stackoverflow.com/questions/3083874/is-there-a-way-to-make-the-jquery-ui-slider-start-with-0-on-top-instead-of-on-bo


原來秘訣就是 ui.value 要先減掉max的值
假如最大值是100,
最後的ui.value應該要100-ui.value
這樣就能將min跟max對調。



感覺好像是一個方法轉換的問題,結果我想了好久xd


2013年6月27日 星期四

PHP v.s JavaScript 計算年齡

PHP計算年齡這種功能自己寫真是太辛苦了,
所以我第一個反應是完全不考慮自己刻,上網找一下馬上有一個很不錯的範例:

http://stackoverflow.com/questions/3776682/php-calculate-age
下方有個答案得到51票的計算方式
只要丟入日期格式(yyyy/mm/dd),最後可以得到$age ,就是年齡的計算結果。


之所以沒有用JavaScript來做,是因為我使用了jQuery Validation Engine,沒有官方計算年齡的api,自己寫custom又必須符合regex的形式,找不到regex,只好折返往ajax跟php要計算結果的方式去走。(或自行擴充核心xd)

會寫純粹判斷的歲數的js很好寫,code會很長,但是很少寫
可是regex,很難寫,但是code很短,
我還沒有找到regex的寫法,若有找到會再分享出來。

補充:
Calculate age of person from date of birth using JavaScript
JavaScript: Form Validation: Date and Time

2013年6月2日 星期日

[小嘗試] 畫組織圖..

最近我看到一些網站,很多地方都是字,唯獨組織圖是用"圖",然後就在放大/縮小頁面之間,顯得很不協調,因為字太清楚,而圖卻模糊了,而且這代表著,如果人事有改變,就要有人負責去maintain那張圖,重繪,然後上傳到網站嗎?,然後我心裡就想說,試試看用html去畫組織圖,於是就做了這件事情xd

只是想嘗試一下而已,至於有沒有人這樣做過,我想應該是一定有..,只是我就想要自己來試一下:P,然後感覺起來還不錯,至少字很清晰的,我比較習慣於看的清楚的畫面xd

Check out this Pen!
不過一開始我沒有自己畫mock-up(很久沒碰photoshop..), 就直接開notepad寫了><
這個Demo畫面,都是寫hard code,刻ul>ol的格式,
然後困難度的部分,我想要畫到很複雜的組織圖,會需要很多時間研究,
如果想要從後端接資料來顯示,
那個json的格式,很容易走到一個誇張的境界,應該沒有這麼簡單(我猜的


Demo圖:若有個人詳細資料時,hover時會出現



Demo圖:hover到整個department時,框線改變


其實是蠻有趣的,值得花時間研究更多方法,呵呵

2013年5月9日 星期四

好文 -jQuery最佳实践

jQuery最佳实践  作者 阮一峰
今天碰巧在網路上看到的文章,覺得很不錯,看完之後對jQuery有更深的認識,以及 更知道怎麼用,推薦給也正在用jQuery的朋友們! 不過我對於第一點,使用最新版的jquery還是挺害怕的,(自從我經歷過jquery1.9的版本之後有點嚇到)xdd
 

2013年4月13日 星期六

[jcrop+php]學習怎麼做crop image的功能

//這其實是我一個多月前的練習了,突然想到我要記錄一下...

前言:

其實只是我好奇怎麼處理讓別人上傳圖片並且可以讓使用者作切圖的功能,那麼通常這樣的功能,搜尋的關鍵字叫做crop photo或是crop images,為甚麼叫做crop?,藉google翻譯一下才知道crop也有修剪的意思。

然後我就上網找到了一套還不錯的javascript切圖的framework叫做Jcrop
http://deepliquid.com/projects/Jcrop/demos.php
有興趣可以玩玩看,他提供的功能還蠻多的

其實它的原理是,記錄你所裁下的圖片範圍的x,y座標,以及寬(w)跟高(h)


也就是說,當你選了你要裁的區域之後,按下 "我要裁"之類的動作
他會送出一個form,其中就包含4個hidden的value,這四個hidden的value,就是紀錄x,y,w,h的值。


我拿了這套來用,但是要結合一點的PHP
(其實也沒有多複雜,就只是補足我想要的功能而已)
官方的範例雖然有提供到結合php的範例,但是比較不是我想要的部分
因為我還想要把圖存到database去

2013年3月6日 星期三

MUJI 物的八分目- 網站解析

MUJI 八分目網站解析

MUJI 物的八分目網站的風格我很喜歡
原網站網址: http://www.muji.net/lab/fitness80/zh-tw/
截圖也是從上面的網址所截的。
恩...因為這個網站用了兩個我很有興趣的技巧,一個就是畫面捲動,另一個就是Muji在網頁上表現八分目的技巧。其實看這個網站的時候心理也大概有的底,經過我不是很精密的研究之下,還是有research到一點東西。
  • 使用HTML5

  • 是否為響應式設計
    Ans:No 用了RWD測試的時候,

    發現這個網站不是RWD(不過我並不確定他否另有手機版:P)
    -用滑的效果比較不靈巧,要點按導覽列的小點感應是最好的
    -順序上由上到下很順暢,由下到上還好,但我後來發現PC版也是這樣
  •  
     
  • Javascript Plugin部分:
    -jQuery,
    -localScroll,
    -scrollorama,
    -jquery.belatedPNG,
    (這個東西我第一次看過,我搜尋到一篇網路文章可以看看解決IE6不支持PNG絕佳方案)
  •  
     
  • 從100到80......
    在Muji fitness80的HTML結構中,
    右邊導覽列的ID叫做skipNav,點按skipNav會使畫面捲動
    我看了原始碼之後,發現這個Muji網站使用了localScroll()這個方法,使畫面產生捲動的效果。
    若把localScroll()這個拿掉,動作就會像錨點連結(<a href="#example">example</a>)一樣用跳的。
    請參考以下網址或搜尋"localScroll":(這感覺跟jquery的scrollTop等方法很像)
    jQuery.LocalScroll
    另外這個網站所常使用的還有scrollorama 
    scrollorama有個方法叫做 onBlockChange以及animate(scrollorama.animate())。
  • 模擬....就是Plugin Plugin Plugin... : 
    我後來也嘗試模擬製作同Muji fitness80的練習,其實這個網站很好demo,因為我發現fitness80並無特別去做js/css的壓縮,是很好回推的網站。
    基本上HTML結構都是參考fitness80,精簡了一些外掛檔(我不需要的我就拿掉了),
    Demo Link : http://yiying2.ueuo.com/8cent/
    但是我對於對Demo實在很卡關,詞窮也沒啥素材,只是我很少這樣拆解一個網站,只能說Muji fitness80網站製作簡單,設計美感也很有美滿。

-End

2012年11月2日 星期五

[隨手一記] datapicker 前後日期判斷

[隨手一記]
今天寫好久的...
jQuery datapicker 前後日期判斷 (不過最後沒用到..),但還是留著。

需求 :
  • format date格式(將datapicker 日期欄位的值-取代為/,如2012-11-02取代為2012/11/02)
  • 判斷日期,form日期不能大於end日期。


原 code:

/*定義*/
function formate_str_to_date(val){
 var result = new Date(Date.parse(val.replace(/-/g,"/")));
 return result;/* replace "-"" to "/""  */
};

function compare(from,end,alertmsg){
 var f = from,
  e = end;
 if(f.getYear()>e.getYear()){
  alert(alertmsg); return false;
 }else{
  if((f.getMonth()+1)<=(e.getMonth()+1)){
     if(f.getDate()<e.getDate()){return true;}else{alert(alertmsg);return false;}
  }else{alert(alertmsg);return false;}
 }  
}

/*使用*/
 var $data_picker_from_date_str = $('from欄位').val();
 var $data_picker_end_date_str = $('end欄位').val();

 var format_from_date = formate_str_to_date($data_picker_from_date_str);
 var format_end_date = formate_str_to_date($data_picker_end_date_str);

$('某按鈕').click(function(){
  compare(format_from_date,format_end_date,"from date不能大於end date");
})


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月20日 星期六

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


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

2012年10月4日 星期四

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…………….

2012年9月26日 星期三

使用PHP+jquery+ajax製作簡易自動登入Loign功能

Using PHP + jquery + ajax 
making simple automatic Login Loign function
一直試,
一直試 .....。
最近一直很好奇jquery的ajax是怎麼樣做出來的,突然想到一直很想做這個(登入的loading功能),看到那個loading的gif在那裏轉,感覺真是體驗度加分,不過還有很多要改進的地方,對於ajax我還是個菜鳥咧xd,現在只有做出正確登出,正確登入,驗證有無填寫欄位的功能,若有辦法再加強,會再補新版本。

版本說明:
v1.0可正確登入,可登出 , 沒有註冊功能,所以必須從資料庫建。


Demo檔下載: 
https://github.com/winwu/AjaxPractice-Login


檔案說明:(抱歉還有一個style.css檔沒畫到)
資料庫欄位說明:
資料庫名為:login_test
資料表為:user

-- 表的結構 `user`
--

CREATE TABLE IF NOT EXISTS `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `userid` varchar(11) COLLATE utf8_unicode_ci NOT NULL,
  `password` int(11) NOT NULL,
  `regitster_date` datetime NOT NULL,
  `first_name` char(5) COLLATE utf8_unicode_ci NOT NULL,
  `last_name` char(10) COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=3 ;

--
-- 轉存資料表中的資料 `user`
--

INSERT INTO `user` (`id`, `userid`, `password`, `regitster_date`, `first_name`, `last_name`) VALUES
(1, 'wwutw0925', 1234567, '2012-09-25 00:00:00', 'win', 'wu'),
(2, 'wwutw09251', 1234567, '2012-09-25 00:00:00', 'win', 'wu');



畫面說明:
這是首頁,需輸入ID跟password,若有其一錯誤或未填寫,皆會有error message
可以test/1234567 測試
這是填寫資料後登入的畫面,此時會看到loading在那裏轉啊轉~此時資料已經被帶到login_chk.php去執行,比對資料是否與資料庫吻合。

若資料吻合就會寫登入成功。

但下登出後。

這個畫面是驗證的畫面,若欄位沒有正確填寫,就會出現灰色那一塊。

這裡是code:
db_conn.php
<?php
mysql_connect('localhost','root','root');
mysql_select_db('login_test');
mysql_query("SER NAMES 'utf8'");
//set taiwan zone
date_default_timezone_set('Asia/Taipei');
?>
index.php
<?php
include('db_conn.php');  //include db connection 將來可能會用到
?>
<!DOCTYPE HTML>
<html>
<head>
    <meta charset="UTF-8">
    <title>welcome!</title>
    <script src="http://code.jquery.com/jquery-latest.js"></script>
    <link rel="stylesheet" href="style.css">
</head>
<body>
<script language="javascript">
$(function(){
    $('#submit').mouseover(function(){$(this).css({'background':'black'})});
    $('#submit').mouseout(function(){$(this).css({'background':'#5A2626'})});
});


function userlogin(){
    <!--先取得欄位值-->
    var user_name = $('#user_name').val();
    var user_password = $('#user_password').val();
    <!--判斷有無正確填寫-->
    if(user_name=="" && user_password==""){
        $('#error_msg').text('Please enter your ID & password');
        return false;
    }
    if(user_name==""){
        $('#error_msg').text('Please enter your ID');
        $('#user_name').focus();
        return false;
    }else if(user_password==""){
        $('#error_msg').text('Please enter your password');
        $('#user_password').focus();
        return false;
    };
//真正的ajax動作從這裡開始
    $.ajax({
        url:"login_chk.php",
        data:"user_name="+user_name+"&user_password="+user_password,
        type : "POST",
        beforeSend:function(){
            $('#loading_div').show(); 
            //beforeSend 發送請求之前會執行的函式
        },
        success:function(msg){
            if(msg =="success"){
                $('#login_showname').text('Welcome!'+user_name);
                $('#login_success').text('You have successfully login!');
                $('#login_success').fadeIn();
                $('#error_msg').hide();
                $('#user_login').hide();     
                $('#user_logout').fadeIn();
                //如果成功登入,就不需要再出現登入表單,而出現登出表單    
            }else
            {    
                $('#error_msg').show();
                $('#error_msg').html('Please Login again,<br/>沒有此用戶或密碼不正確');
            }
        },
        error:function(xhr){
            alert('Ajax request 發生錯誤');
        },
        complete:function(){
            $('#loading_div').hide();
            //$('#user_login').hide();         
            //complete請求完成實執行的函式,不管是success或是error
        }
    });    
};
function userlogout(){
    $.ajax({
        url:"logout.php",
        type : "POST",
        beforeSend:function(){
            $('#loadingout_div').show(); 
            $('#login_success').hide();
            $('#error_msg').text('Logout...please wait..');
            $('#user_logout').hide();
            //beforeSend 發送請求之前會執行的函式
        },
        success:function(msg){
            if(msg=="success"){
                $('#user_login').fadeIn();     
            }else
            {    
                $('#error_msg').html('請在登出一次');
            }
        },
        error:function(xhr){
            alert('Ajax request 發生錯誤');
        },
        complete:function(){
            $('#loadingout_div').hide();
            $('#user_login').fadeIn();     
        }
    });    
}
</script>
<div id="login_block">
    <form id="user_login" method="POST">
    <table id="login_table">
        <tr>
          <td>
           <label>ID:</label><input type="text" name="user_name" id="user_name"/><br/> 
           <label>Password:</label><input type="password" name="user_password" id="user_password"/><br/>
           <input type='button' id='submit' value='Login' onclick='userlogin();'/> 
          </td>
        </tr>
    </table>
    </form>
    <div id="error_msg"></div>

    <form id="user_logout" method="POST" style="display:none;">
    <table id="login_table_out">
        <tr>
          <td>
            <span id="login_showname">
            <!--放登入狀態-->
            </span>
           <input type='button' id='submit2' value='Logout' onclick='userlogout();' />
          </td>
        </tr>
    </table>
    </form>
    
    
    <div id="loading_div" style="display:none">
        <img src="ajax_loader.gif"><br/>Login...please wait
    </div>
    <div id="loadingout_div" style="display:none">
        <img src="ajax_loader.gif"><br/>Logout...please wait
    </div>
    <div id="login_success" style="display:none;">
    <!--放you are successfully login-->
    </div>
</div>
<div id="ft">win design it @ 2012 </div>
</body>
</html>

login_chk.php
<?php
session_start();
/* -------------------------- */
/* Check username & password  */
/* -------------------------- */
include('db_conn.php');
sleep(1); 
$userid = isset($_POST["user_name"]) ? $_POST["user_name"] : $_GET["user_name"]; 
$password = isset($_POST["user_password"]) ? $_POST["user_password"] : $_GET["user_password"]; 
$sql = 'SELECT * FROM user WHERE userid = "'.$userid.'" and password="'.$password.'"';
$result = mysql_query($sql);
$row = mysql_fetch_assoc($result);
$record_count = mysql_num_rows($result); 
if($record_count<1){
//無資料回傳no data
    echo 'no data';
}else{
//若有這筆資料則回傳success
    $_SESSION['user_name'] = $userid;
    echo 'success';
    //echo $row['first_name'].$row['last_name'];    for debug use
} 
?>

logout.php
<?php 
//unset($_SEEEION['user_name']);
sleep(2);
echo 'success';
?>

style.css
/*author : win*/
html{
    background:url(./img/bg.jpg) no-repeat center center; min-height:100%;
    background-size:cover;
}
#login_block{
    background: url(./img/lo_bg.png) no-repeat;
    width: 317px;
    height: 400px;
    margin: 0px auto;
    margin-top: 50px;
    padding: 82px 10px 10px 51px;
    font-family: arial
}
#submit,
#submit2{
    background: #5A2626;
    border: 0px;
    color: white;
    padding: 5px 10px;
    width: 243px;
    margin-top: 10px;
    font-size: 18px;
    -webkit-border-radius: 5px;
    -moz-border-radius: 5px;
    border-radius: 5px;cursor: pointer;
}
#error_msg{
    width: 224px;
    background: #525150;
    display: block;
    color: white;
    padding: 0px 10px;
    font-size: 12px;
    margin: 1px;
    line-height: 26px;
    -webkit-border-radius: 5px;
    -moz-border-radius: 5px;
    border-radius: 5px;
}
input[type=text],
input[type=password]{
    border: 1px solid white;
    -webkit-border-radius: 5px;
    -moz-border-radius: 5px;
    border-radius: 5px;
    padding: 5px;
    -moz-box-shadow: 3px 3px 5px #000000;
    -webkit-box-shadow: 2px 2px 3px #424242;
    box-shadow: 2px 2px 2px #5A5A5A;width: 231px;
}
label{
    width: 74px;
    display: block;
    padding: 3px 3px;
}
#loading_div,
#login_success,
#loadingout_div{
    text-align: center;
    width: 252px;
    margin-top: 10px;
}
#login_success{width: 269px;}
#login_showname{
    text-align: center;
    margin: 0 auto;
    display: block;
}
#ft{
    font-family: arial;
    font-size: 10px;
    text-align: center;
}
今天實在睏了,有機會會再好好整理這些code....
然後持續改良他,使他更好用..

上傳到空間: 
http://yiying2.ueuo.com/my_login2/index.php  可以test/1234567 測試

這個登入畫面的練習重點在於,不想讓登入執行過程中有轉頁的感覺,而輸入的帳號密碼,透過ajax傳送到login_chk.php去動作,若資料正確無誤,則會echo "success"傳回index.php,讓首頁得知可以做正確登入後的動作(顯示你已成功登入的畫面)。

另外session跟sql injection都未做。

再來是ajax的動作,當使用者在首頁填入資料後按下Login的按鈕後,就會執行javascript的userlogin的這個function():

   function userlogin(){
      
      //do something
      前面幾行我先驗證是否有接收到資料,若沒有就將錯誤訊息傳到#error_msg 這塊div
      並且return false,後面不需要再執行。
     

     $.ajax({
      //真正的送資料從這裡開始
           

    });
  }

為甚麼loading的那張圖片會轉=>
要讓loading的圖片有幾秒的時間轉動,我這邊做了兩件事
1)  寫在$.ajax({}) 裡面的
               beforeSend: function(){
$('#loading_div').show(); 
},
     就是在做這件動作,beforeSend是發送請求之前會執行的函式
     將loading的gif圖檔放在一個div區塊內,預設css的display為none.
     無論如何,預設是不會有動作的... 除非按下登入或登出,我們才讓這個動畫顯示出來,示
     意使用者資料正在讀取,具有提示的作用。


2)在login_chk.php sleep(2) 讓他睡兩秒再執行

3)當ajax request送出到完成的順序是
beforesend->success/error->complete

請參考:http://blog.ericsk.org/archives/839  Query 學習心得筆記 (5) – Ajax (下) 
Login using Ajax and PHP http://woork.blogspot.tw/2007/10/login-using-ajax-and-php.html
jQuery+Ajax+PHP登錄實例 http://fxc86.blog.hexun.com.tw/51421105_d.html



2012年8月15日 星期三

jQuery Cycle Plugin的consolelog的一個問題

jQuery Cycle Plugin應該很多人都用得很習慣了。只要是想要做幻燈片效果的,或是圖片動畫特效,一般來講我只會想到jQuery Cycle Plugin或是fancybox這兩種。jQuery Cycle Plugin算是非常好上手,步驟最簡單的不超過3步驟,就能達到效果:

  1. link css跟js檔案 
  2. 貼上javascript
  3. 加上要輪播照片的div 跟id   img標籤。


先來個jQuery Cycle Plugin的連結 http://jquery.malsup.com/cycle/

然而今天再練習套用jQuery Cycle Plugin的時候發現了一個bug,關於圖片的bug,這個標題很難下,但說不定只有我有這個問題?!,看到這個問題還蠻訝異的,之前套用這個效果非常成功,但今天重新套用卻出了問題,在我的chrome console log 出現了[以下]這樣的問題。


[cycle] 1 - img slide not loaded, requeuing slideshow: http://127.0.0.1/myweb/images/20110914-03.jpg 0 0
行數 :/myweb/js/jquery.cycle.all.latest.js:28

了解一下整個html檔的狀況:
  • 先來一段<head>標籤之前的內容:
<html>
<head>
<title>練習</title>

<script type="text/javascript" src="js/jquery-1.6.min.js"></script>
<!-- include Cycle plugin -->

<script type="text/javascript" src="js/jquery.cycle.all.latest.js"></script>

<script type="text/javascript" charset="utf-8">
$(document).ready(function() {
    $('#slideshow').cycle({
        fx: 'fade' // choose your transition type, ex: fade, scrollUp, shuffle, etc...source:http://jquery.malsup.com/cycle/basic.html
    });
});
</script>

</head>

這段內容都沒有問題
首先一定要匯入jQuery.js <script type="text/javascript" src="js/jquery-1.6.min.js"></script>
再來要匯入jQuery Cycle Plugin的js<script type="text/javascript" src="js/jquery.cycle.all.latest.js"></script>

然後貼上javascript

$(document).ready(function() {
    $('#slideshow').cycle({
        fx: 'fade' // choose your transition type, ex: fade, scrollUp, shuffle, etc...source:http://jquery.malsup.com/cycle/basic.html
    });
});

id為slidshow的div區塊套用fade的這個特效。

  • 接下來來看div id="slideshow"的內容 :
<div id="container"> 
  <div id="slideshow">
  <img src="images/20110914-03.jpg" alt="照片slideshow"  />
  <img src="images/002.jpg" alt="照片slideshow"  />
  </div>
</div>

整個html頁面的程式碼如上,瀏覽時問題出現了,效果不但沒有起作用,而且還出現consolelog的問題:
順個這個log去看一下jquery.cycle.all.latest.js:28 第28行,很好,看不懂 = =
最後比對與之前做過的練習結果才發現問題在於img的width跟height的屬性,(當初還以為是圖片格式還是我的selector下錯。)

最後解決的方法是,被套用效果的該div標籤的img加上width="" 屬性跟 height=""屬性(其中一個有加就可以work),就可以運作了。

<img src="images/20110914-03.jpg" alt="照片slideshow"  />
<img src="images/002.jpg" alt="照片slideshow"  />

可運作code:

<img src="images/20110914-03.jpg" alt="照片slideshow" width="500" height="200"/>
<img src="images/002.jpg" alt="照片slideshow"  width="500" height="200"/>
//width跟height屬性,只要其中一個有就可以運作。

-end 

Vue multiselect set autofocus and tinymce set autofocus

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