2009年6月30日 星期二

javascript RegExp object literal syntax

今天看到一段javascript code 長的像下面這樣
if (/pattern/i.test(str))
//do something

一開始我看不懂/pattern/i到底是什麼東西
查了以後才知道 原來這是正規表示式物件的實體語法(RegExp object literal syntax)
之前只知道javascript有陣列實體語法 例如
var a=[1, "kerker", 555];

還有物件實體語法例如
var o={
p1 : 1,
p2 : "kerker",
p3 : {pp1:1, pp2:2} //巢狀物件
};

這些語法已經很方便了 但是我沒有想到javascript還有RegExp物件的實體語法!!
我有一瞬間震驚了 想不到javascript這麼方便阿...
不過也許這事廣為人知的 只是我太孤陋寡聞/_\(JavaScript:The Definitive Guide不知道拿到多久了 完全沒有好好看過 冏)

恩..javascript 真的是一個很不錯的語言阿

script tag的defer屬性

當瀏覽器瀏覽網頁時 他會一邊parse HTML code並顯示出來 一邊parse script標籤中的script code並執行
然而 在使用script標籤時 若是加上defer屬性 像這樣 < script defer="defer" >
則瀏覽器會在整個頁面都load完成後才開始去parse此標籤內的script code並執行
如果在script tag中的code都是function之類的 不會改變頁面內容的code的話 則加上defer屬性可以加快頁面被顯示的速度
defer屬性是HTML4的標準 FX跟IE現在都支援此屬性

2009年6月27日 星期六

mysql subquery

mysql select語句中加上 limit x 就可以限制查詢最多回傳x筆資料
但是如果需要的情況是 只想查詢資料表中的第1~第50筆那要怎麼辦
這可以用mysql的子查詢語法來達成 例如

select * from (select * from table1 limit 50) as derived_table where id!='kerker';

括號中間的select語句會先做查詢 然後回傳第0~49筆資料 接著外面的select再從這50筆資料作查詢
需要注意的是必須要給一個alias name(也就是上面的devived_table)給derived table才是合法的查詢

2009年6月12日 星期五

variable-length array

本來的C語言(C99之前)是不能用變數來宣告陣列長度的 例如:
int i[length];

後來C99標準中允許了這樣的宣告方式 但是C++並沒有這樣的標準
C++的動態陣列還是使用vector比較好

http://www.clarkcox.com/blog/?p=74#footnote_0_74
這裡有一篇文章寫到VLA的壞處 當stack pointer指到不正確的地方時 程式會發生什麼事沒人知道
這的確是直得思考的地方

另外 要將多維陣列傳給函式當參數時 除了第一維的維度可以不給之外 其餘都要給
例如 int func(int array[][4]); 這樣的寫法

2009年6月9日 星期二

client端執行filesystemobject

很久之前試過在client端執行filesystemobject去做寫檔的動作
當時IE跳出提示訊息 而只要使用者同意 就可以執行
最近聽說為了安全性 現在IE已將adodb.stream或是shell.application這類activex物件禁止

於是我用以下code試著在client端做寫檔的動作
dim fso
set fso=createobject("Scripting.FileSystemObject")
set test=fso.createtextfile("C:\\test.txt", true)
test.writeline("kerker")
test.close

網頁沒有提示 什麼都沒有發生 看來是已經禁止了
後來找到原因 是IE把設定改掉了
只要到網際網路選項->安全性->自定等級->起始不標示為安全的activex控制項 改成提示
再次執行 IE就跟上次一樣 跳出提示訊息 同意後 這段code就成功執行了

2009年6月2日 星期二

javascript event 傳播

javascript事件傳播流程 資料來源:w3c school

事件傳播

在 2 級 DOM 中,事件傳播分為三個階段:
第一,捕獲階段。事件從 Document 對象沿著文檔樹向下傳遞給目標節點。如果目標的任何一個先輩專門註冊了捕獲事件句柄,那麼在事件傳播過程中運行這些句柄。
第二個階段發生在目標節點自身。直接註冊砸目標上的適合的事件句柄將運行。這與 0 級事件模型提供的事件處理方法相似。
第三,起泡階段。在此階段,事件將從目標元素向上傳播回或起泡回 Document 對象的文檔層次。

http://www.quirksmode.org/js/events_order.html
這裡有詳盡的解釋