JS Search As You Type 教學 之1

三月 5, 2009

係Vista 或 Leopard 甚至Google Desktop, 有一個好方便的功能, 就是Search As You Type. 意思即是, 當你邊打字的時間, 會Search 到你要的東西. 現在, 就用JS 試試這類形的Search.

這篇教學的方法, 是低層次一點, 因為每次都會Search 一次, 而不是將Search 的範圍一直縮小, 教未能做到最佳的效能, 更好的版本會在稍後upload. 另外, 這篇教學為了方便, 便使用了JS prototype 的Library.

1. 要做Search, 我們先要一個Text field 的Element 比使用者Search 東西, 這個相信不會難到我們, 先做一個input 改名. 不過, 我們要加Javascript, 令使用者打字時便Search, 故set onkeyup(即是使用者按完鍵盤, 手指離開的那一下), 便call javascript, 現在我們找一個叫SearchUtility 的object, 入面的search method.

2. Search method 會傳入一個叫event 的東西, 這就是使用者觸發這個onkeyup 的event.

3. 在這個SearchUtility 的Object 入面, 我們準備了一條叫SearchArray 的array, 入面有要被Search 的資料.

4. search function 入面, 會從使用者中接收一個event .我們叫它做e.

5. 一進入去, 我將searchField 的字, 代入value 這個變數. 再準備一個boolean b, 來查一下有沒有找到要找的字. 另外, 有一個
keyCode, 是將使用者按的keycode儲下. 透過event 拿出keyCode, 再將使用者的keyCode 轉成整數, 存到keyCode 的變數之中.

6. 這個if, 保証了user 入的一定是a-z, 0-9

7. 之後用Regular Expression, 將value(text Field內的字), 變成RegularExpression Object, 再加入』i』, 即時ignore case 的意思.

8. 用for loop 一個一個將searchArray 內的 data 檢查, 被RegularExpression Object 查找, 如果找到 0 , 便是大小階不相符, 但是字母正確, 1便是大小階一樣相符, 完全一樣. 如果找到字母一樣, 便將boolean set 做true

9. 最後如果是true, 便alert 一句』ok』.

後話:
用RegularExpression 做search 是因為不想用 == , 要使用者完全正確才顯示. 當使用者打』a』的時侯, 如果用a==Apple, 是永遠false 的, 但是用RegularExpression 的方法便會成為true. 而且如果使用者打』pp』, 亦會是true 的.
HTML:

<input type=『text』 name=『searchField』 value=『』 

id=『searchField』 onkeyup=『SearchUtility.search(event);』>  

JS:

var SearchUtility = {  
 searchArray : new Array(『Apple』, 』Boy』, 』Car』, 』Dog』), //Search data array  
 
 search:function(e){  
     var value = $(『searchField』).value; //the search key  
     var b = false;  
     var keyCode = parseInt(e.keyCode); //user input keycode  
 
     if((keyCode >= 65 && 90 >= keyCode)|(keyCode >= 48 && 57 >= keyCode)){  
         //It will only contain a-z, 0-9  
       
         var RegularExpression = new RegExp(value,』i』);  
         //new a regular expression which is case insentive  
 
         for(i=0;i<searchutility.searcharray.length;i++){>-1){  
                 //the key match the data  
                 b = true;  
             }  
         }  
         if(b){ //that’s mean it can find the item  
             alert(『ok』);  
         }  
     }  
 }  
}

Mouseover 的小Menu

三月 4, 2009
今次要介紹的, 是一個小小的小Menu, 所有東西是配合JS + CSS 做的. Menu 會在使用者的左面出現, 當使用者mouseover 時, 便會跳出來, 當使用者mouse 移開, menu 亦會移走. 
之前講解過如何用element 隱形, 今次就說說如何令element 移走. 原理大同小異, 都是轉CSS 的Attribute. 
首要先要知道, 所謂的彈出Menu 原理其實不是真的彈出了, 而是將其中一部份的東西, 移到使用者看不到的地方. 電腦的x, y 座標都是由左上角數起的, 所以, 當x, y 移到去負數的時間, 使用者便會
看不到. 但是, 要留一點位置, 讓使用者再次mouseover, 令mouse 回到x 是0 的位置, 就像有彈出來的效果了. 
Javascript 的部份: 
<script type=』text/javascript』>
function setMenu(hide){
var tempMenu = document.getElementById(『lowBMenu』);
//找出要變更的Menu名
if(hide){
//如果縮了入去的話
tempMenu.style.left = 0 + ‘px’;
//彈出來
}else{
tempMenu.style.left = -30 + ‘px’;
//縮回
}
} </script> 
HTML+CSS:

<!– menu is the Div element–>
<div id=『lowBMenu』>
onmouseover=』setMenu(true)』
onmouseout=』setMenu(false)』
style=』width:60px;height:100px;
position:absolute;left:-30px;
top:50px;z-index:1001;
background-color:orange』>
<!– CSS setting the menu–>
<div align=『right』>
<table><tbody>
<!–Menu Content–><tr>
<td>M</td></tr><tr>
<td>E</td></tr>
<tr><td>N</td>
</tr><tr><td>U</td>
</tr></tbody></table>
</div>
</div>

Web Ads 唔易做

二月 28, 2009

近十年, 廣告市場由電視機, 轉到電腦已成不爭的事實. 記得初時睇的Internet 廣告都係那類你係第一萬個人上這個網頁, 有什麼什麼大獎之類, 和那些彈到周圍都係新畫面的廣告. 之後隨住大家用的電話線, 變成寬頻線, 就由單單文字或圖片的廣告, 變成動畫. 

不過有家G 字頭的公司依然以文字和圖片為主, 但係佢就利用好多使用者的資料, Focus on Target 的Customers 之上. 近年的Web Ads 簡直係愈玩愈勁, 除左大玩Flash 之外, 亦大玩CSS, JavaScript, 特別係Yahoo HK 那類大廣告, 真係難致信. 現在做廣告, 真係識少點軟件, 都落後於人… …

網頁Drag and Drop淺淡

二月 28, 2009
在網頁上要達成Drag and Drop 的做法有不少, 不過我只會集中在Javascript 上, 雖然HTML5 都有Support Drag and Drop , 不過暫時Support HTML5 的瀏覽器卻有限, 先不談.
一般來說, JS 要達成Drag and Drop 的方法亦有不少, 先介紹Library 的由walterzorn 提供:
這個JS 的Library 十分有趣, 除了cross platform, 而且亦有key listener, 可以按住shift 制進行放大圖片, 又可以限制圖片的變大變細的比倒, 甚至連Drag and Drop 的方法都可以加以控制,
另外一個是WebToolKit 的:
這個是我個人的至愛, 因為這個利用一件叫DragHandler 的Object, 負責Listen 住所有Drag到 的Div Object, 所有Drag Begin, Dragging 同Drop 的動作, 都可以自己加上去. 十分方便, 而且易用.
當然, 亦可以用jQuery 玩更多的特效, 不過因為我沒有時間玩jQuery, 所以遲點先再介紹, 暫時先介紹這2個方法.
不過以我所知, 幾乎大部份的JS Drag and Drop 都係用Listener, 睇mousedown 的event , 再改果件野的CSS 以達到做到Drag and Drop 的效果. 雖然話這類Drag and Drop 的solution 係cross platform, 不過事實並唔係完全一定做到架. 因為當你用mobile 的browser, 就做唔到…. ….想像一下, 你雖然有Drag and Drop 的動作係部手機上面, 不過完全唔同Desktop 的使用者經驗, 就連Mobile Safari 都唔得, 唔係講笑. 這個可能要等Palm Pre 的HTML5 Browser 才能做到尼!
希望遲點會有更進一步的發現. 
walterzorn:
http://www.walterzorn.com/dragdrop/dragdrop_e.htm
WebToolkit:
http://www.webtoolkit.info/javascript-drag-and-drop.html

為Mac 的風扇調速

二月 22, 2009
不知為什麼, Mac 行Java 的程式, 感覺總係差差的, 除了因為要經Java VM 會慢一點之外, 速度或隱定性還是比較差, 特別用到比較大型的IDE, 如Netbeans, 簡直是地獄, 因為多數會令系統的Loading 加大. 其實loading 大的問題不大, 但是有時溫度和loading 成正比, 就令人十分擔心, 所以都安了一個叫Fan Control 的程式. 這樣便可以在System Preferences 控制Mac 的風扇了, 免得機件過熱而出現硬件損壞了. 
重點: 免費的!
http://www.lobotomo.com/products/FanControl/

Reload 網頁的一小part

二月 21, 2009
如果你一個網頁有一大張, 不過只係一小part要reload. 那就要分開一個小小的iframe 將畫面界開, 那便可以只控制那小小的位置的部份reload, 而非整個網頁.
<iframe src=』http://www.google.com』 width=』50%』 height=』100px』></iframe>

隱形Elements 不能Mouseover

二月 16, 2009

話說, 要做到一件Div 的東西, 想令佢未經過佢的時間, 就唔好show 出來. 一mouseover 就出來. 當初想成件事係CSS set visible 便解決. 但是, 事實就無如此簡單, 原來CSS hidden 了的Element, 係mouseover 之後都無反應, 所以就只好換方法. 就係opacity, 當佢mouseover 時就opacity  set 回1, mouseout 時便變回0 的方法達成. 如果用CSS hidden 件Element, 佢將會永遠唔會比你用 mouseover 變回 visible … … 不過, 你可以用其他方法改回他的CSS variable, 但非透過 mouseover.

<div id=』mouseOverTest』 style=』border: 1px dashed red;

background: silver none repeat scroll 0% 0%;

position: absolute; width: 30px; height: 30px;

left: 306px; top: 252px; opacity: 0;』

onmouseover=』document.getElementById(‘mouseOverTest’).style.opacity=1″ onmouseout=』document.getElementById(‘mouseOverTest’).style.opacity=0″

</div>

同一個Loop, 不同的Performance

二月 14, 2009

 

話說這個世界做同一件事, 可以有唔同方法. 上次講到係網頁上面畫線, 都有3個唔同的方法. 估唔到, 玩For Loops 都可以Optimize Code.  

平時的For Loop 應該係如此:

    for (var i=0;i<length;i++){

        // modify testVal here

    }

不過, 發現有一個Duff’s Fast 的方法, 可以令For Loop 走得更快… …至於原理係如何, 就有待探討, 不過我自己的非正式Testing, 係快一點點的…. … 不過可能因為我Testing 唔夠大, 個效不太明顯.

        var testVal=0;

        var n = iterations % 8;

        while (n–)

        {

         testVal++;

        }

        n = parseInt(iterations / 8);

        while (n–)

        {

            testVal++;

            testVal++;

            testVal++;

            testVal++;

            testVal++;

            testVal++;

            testVal++;

            testVal++;

        }

1/3/09 補遺:

在最後增加loop 的次數之下, 發現真的改善了效能. 原理是, 因為%8 之後, 整個loop 的分析True / False 的時間少了. 打個比如, 如果你要行81一個圈, 如果用傳統的做法, 便要斷定81次這個condition是否正確, 但若是這樣, 整個斷定condition 的次數便大幅下降了. 不用每一圈都要斷定一次, 從而提高了Looping 的效率

http://www.websiteoptimization.com/speed/10/10-3.html

 

網頁畫線方案

二月 14, 2009

話說做Project , 經常要畫圖, 畫圖一向都係電腦其中一個好吃力的工序. 如果用低Level 的語言, 可以控制硬件, 都可以話有方法解決, 不過如果個UI 係網頁, 畫圖就會出現大問題. 而Project 集中做的野, 係畫線. 畫幾條線當然冇問題, 畫得多都唔好話唔驚!

係網頁, 傳統的畫線方法, 係將一條線分成好多個Div Tag. 不過問題就出現, 如果你愈行愈多線, 就愈來愈多Div Tag, 可以係幾條線就上千個Tag, 你都唔好話唔好得人驚. 有Javascript 的Library 可以實行尼個做法, 不過真係好慢, 畫少圖的都ok, 一多圖就出事:

http://www.walterzorn.com/jsgraphics/jsgraphics_e.htm

之後, 亦有人打算用CSS + JS 去實現, 效果比前者好少少. 原理係用Div 同 CSS 砌2個三角形出來, 一個大一點黑色三角形, 一個細一點的白色三角形, 利用大, 小三角形斜邊的差距, 模擬出一條斜線出黎. 而實際上係利用了2個三角形畫一條線. 不過都唔係完美解決, 因為當線的數量增加, 就愈黎愈多三角形, 而且會出現三角形疊三角形的情況, 令到有部分線段顯示不到:

http://infimum.dk/HTML/slantinfo.html

最後, 現在最新的HTML 5, 有Canvas 的Tag, 可以做到真正多線都高效的表現. 因為佢係一個Canvas. 你係上面畫幾多線, 都係一個Canvas. 相信Canvas, 係經瀏覽器利用低層次的語言實現, 不過真正原理亦有待研究. 點都好, 佢係畫多線的必然選擇…. …不過最大問題係佢畫少線食的資源比以上2者都高, 而且係IE 未Support (不過這個是IE 的問題啦). 不過最好的, 係可以將佢畫番圖出黎, 又或者做埋3D:

https://developer.mozilla.org/En/Canvas_tutorial

JavaScript Download Youtube

二月 9, 2009

有好多工具都可以download Youtube 的片, 不過我個人認為, Download 愈多Tools , 就愈煩.

所以, 在網上發現一段Script, 只要加入Bookmark, 每次按那個制, 便可以自動在Youtube 多出了一個Download 為MP4 的Link…. ….以下就係Code:

javascript:if%20(document.getElementById(‘download-youtube-video’)==null%20&&%20!!(document.location.href.match(/http:\/\/[a-zA-Z\.]*youtube\.com\/watch/)))%20{var%20yt_mp4_path=
http://www.youtube.com/get_videofmt=18&video_id=’+swf
Args['video_id']+‘&amp;t=’+swfArgs['t'];
%20var%20div_embed=document.getElementById(‘watch-embed-div’);div_embed.innerHTML=div_embed.innerHTML+‘%3Cbr%20
/%3E%20%3Cspan%20id=\’download-youtube-video\’%3E%3Ca%20href=\’+yt_mp4_path+
\’%3EDownload%20as%20MP4%3C/a%3E%20′+%20%20(
(navigator.userAgent.indexOf(‘Safari’)!=-1)?‘(control-

click%20and%20select%20%3Ci%3EDownload%20linked%20file
%20as%3C/i%3E)’:(‘(rightclick%20and%20select%20%3Ci%3E
Save%20′+%20(navigator.appName==‘Microsoft%20Internet

%20Explorer’?‘target’:‘link’)%20+‘%20as)%3C/i%3E’))+‘%3C/span%3E’;}void(0);


Follow

Get every new post delivered to your Inbox.