2010年11月25日 星期四

透過 jQuery 抓取鍵盤壓下的按鍵

透過 jQuery 抓取 user 所敲的鍵盤按鍵,可以使用 .keydown( ) 方法。詳細介紹可以參考官網 API 的介紹。自己在實作過程中,發現了 .keydown( ) 所回傳的結果,並不一定會與原先我所認知的結果符合。舉例來所,壓下鍵盤上的「G」這個按鍵,理論上他應該回傳「71」的值,但我卻得到「229」。耐著性子把26個英文字母、數字、符號敲完,也都是「229」,還真是怪哩!

於是查了一下,出現229,代表的意思是:ecircumflex

感覺有查等於沒查,還真的看不懂 ecircumflex 代表啥!

於是自己寫了一段測試的 Code 如下:

<!DOCTYPE html>
<html>
<head>
<script src="http://code.jquery.com/jquery-1.4.4.js"></script> 


<script>
$(function(){
 $("#tbxCatch").keydown(function(evt){alert(evt.keyCode);});
});
</script>

</head>
<body>
<input type="text" id="tbxDefault" >
<br>
<input type="text" id="tbxCatch" >
</body>
</html>

測試過程中,曾經有一陣子我按 「G」按鍵,竟然可以得到 「71」的值,很天真的以為是不是自己眼花了!不過,反覆測試了好幾天,終於找到原因了。兇手是:「輸入法」!!在上面的測試範例中,如果你有將輸入法切換到中文模式,則不管你敲鍵盤上的哪個英文字母,都會是「229」,但如果將輸入法切換成英文模式,就可以得到預期的結果。

日後,如果有需要攔截使用者鍵盤所敲的按鍵時,別忘了 「229」喔!!

參考:
http://api.jquery.com/keydown/

補充:

鍵盤編碼方式


keycode   0 =
keycode   1 =
keycode   2 =
keycode   3 =
keycode   4 =
keycode   5 =
keycode   6 =
keycode   7 =
keycode   8 = BackSpace BackSpace
keycode   9 = Tab Tab
keycode  10 =
keycode  11 =
keycode  12 = Clear
keycode  13 = Enter
keycode  14 =
keycode  15 =
keycode  16 = Shift_L
keycode  17 = Control_L
keycode  18 = Alt_L
keycode  19 = Pause
keycode  20 = Caps_Lock
keycode  21 =
keycode  22 =
keycode  23 =
keycode  24 =
keycode  25 =
keycode  26 =
keycode  27 = Escape Escape
keycode  28 =
keycode  29 =
keycode  30 =
keycode  31 =
keycode  32 = space space
keycode  33 = Prior
keycode  34 = Next
keycode  35 = End
keycode  36 = Home
keycode  37 = Left
keycode  38 = Up
keycode  39 = Right
keycode  40 = Down
keycode  41 = Select
keycode  42 = Print
keycode  43 = Execute
keycode  44 =
keycode  45 = Insert
keycode  46 = Delete
keycode  47 = Help
keycode  48 = 0 equal braceright
keycode  49 = 1 exclam onesuperior
keycode  50 = 2 quotedbl twosuperior
keycode  51 = 3 section threesuperior
keycode  52 = 4 dollar
keycode  53 = 5 percent
keycode  54 = 6 ampersand
keycode  55 = 7 slash braceleft
keycode  56 = 8 parenleft bracketleft
keycode  57 = 9 parenright bracketright
keycode  58 =
keycode  59 =
keycode  60 =
keycode  61 =
keycode  62 =
keycode  63 =
keycode  64 =
keycode  65 = a A
keycode  66 = b B
keycode  67 = c C
keycode  68 = d D
keycode  69 = e E EuroSign
keycode  70 = f F
keycode  71 = g G
keycode  72 = h H
keycode  73 = i I
keycode  74 = j J
keycode  75 = k K
keycode  76 = l L
keycode  77 = m M mu
keycode  78 = n N
keycode  79 = o O
keycode  80 = p P
keycode  81 = q Q at
keycode  82 = r R
keycode  83 = s S
keycode  84 = t T
keycode  85 = u U
keycode  86 = v V
keycode  87 = w W
keycode  88 = x X
keycode  89 = y Y
keycode  90 = z Z
keycode  91 =
keycode  92 =
keycode  93 =
keycode  94 =
keycode  95 =
keycode  96 = KP_0 KP_0
keycode  97 = KP_1 KP_1
keycode  98 = KP_2 KP_2
keycode  99 = KP_3 KP_3
keycode 100 = KP_4 KP_4
keycode 101 = KP_5 KP_5
keycode 102 = KP_6 KP_6
keycode 103 = KP_7 KP_7
keycode 104 = KP_8 KP_8
keycode 105 = KP_9 KP_9
keycode 106 = KP_Multiply KP_Multiply
keycode 107 = KP_Add KP_Add
keycode 108 = KP_Separator KP_Separator
keycode 109 = KP_Subtract KP_Subtract
keycode 110 = KP_Decimal KP_Decimal
keycode 111 = KP_Divide KP_Divide
keycode 112 = F1
keycode 113 = F2
keycode 114 = F3
keycode 115 = F4
keycode 116 = F5
keycode 117 = F6
keycode 118 = F7
keycode 119 = F8
keycode 120 = F9
keycode 121 = F10
keycode 122 = F11
keycode 123 = F12
keycode 124 = F13
keycode 125 = F14
keycode 126 = F15
keycode 127 = F16
keycode 128 = F17
keycode 129 = F18
keycode 130 = F19
keycode 131 = F20
keycode 132 = F21
keycode 133 = F22
keycode 134 = F23
keycode 135 = F24
keycode 136 = Num_Lock
keycode 137 = Scroll_Lock
keycode 138 =
keycode 139 =
keycode 140 =
keycode 141 =
keycode 142 =
keycode 143 =
keycode 144 =
keycode 145 =
keycode 146 =
keycode 147 =
keycode 148 =
keycode 149 =
keycode 150 =
keycode 151 =
keycode 152 =
keycode 153 =
keycode 154 =
keycode 155 =
keycode 156 =
keycode 157 =
keycode 158 =
keycode 159 =
keycode 160 =
keycode 161 =
keycode 162 =
keycode 163 =
keycode 164 =
keycode 165 =
keycode 166 =
keycode 167 =
keycode 168 =
keycode 169 =
keycode 170 =
keycode 171 =
keycode 172 =
keycode 173 =
keycode 174 =
keycode 175 =
keycode 176 =
keycode 177 =
keycode 178 =
keycode 179 =
keycode 180 =
keycode 181 =
keycode 182 =
keycode 183 =
keycode 184 =
keycode 185 =
keycode 186 =
keycode 187 = acute grave
keycode 188 = comma semicolon
keycode 189 = minus underscore
keycode 190 = period colon
keycode 191 =
keycode 192 = numbersign apostrophe
keycode 193 =
keycode 194 =
keycode 195 =
keycode 196 =
keycode 197 =
keycode 198 =
keycode 199 =
keycode 200 =
keycode 201 =
keycode 202 =
keycode 203 =
keycode 204 =
keycode 205 =
keycode 206 =
keycode 207 =
keycode 208 =
keycode 209 =
keycode 210 = plusminus hyphen macron
keycode 211 =
keycode 212 = copyright registered
keycode 213 = guillemotleft guillemotright
keycode 214 = masculine ordfeminine
keycode 215 = ae AE
keycode 216 = cent yen
keycode 217 = questiondown exclamdown
keycode 218 = onequarter onehalf threequarters
keycode 219 =
keycode 220 = less greater bar
keycode 221 = plus asterisk asciitilde
keycode 222 =
keycode 223 =
keycode 224 =
keycode 225 =
keycode 226 =
keycode 227 = multiply division
keycode 228 = acircumflex Acircumflex
keycode 229 = ecircumflex Ecircumflex
keycode 230 = icircumflex Icircumflex
keycode 231 = ocircumflex Ocircumflex
keycode 232 = ucircumflex Ucircumflex
keycode 233 = ntilde Ntilde
keycode 234 = yacute Yacute
keycode 235 = oslash Ooblique
keycode 236 = aring Aring
keycode 237 = ccedilla Ccedilla
keycode 238 = thorn THORN
keycode 239 = eth ETH
keycode 240 = diaeresis cedilla currency
keycode 241 = agrave Agrave atilde Atilde
keycode 242 = egrave Egrave
keycode 243 = igrave Igrave
keycode 244 = ograve Ograve otilde Otilde
keycode 245 = ugrave Ugrave
keycode 246 = adiaeresis Adiaeresis
keycode 247 = ediaeresis Ediaeresis
keycode 248 = idiaeresis Idiaeresis
keycode 249 = odiaeresis Odiaeresis
keycode 250 = udiaeresis Udiaeresis
keycode 251 = ssharp question backslash
keycode 252 = asciicircum degree
keycode 253 = 3 sterling
keycode 254 = Mode_switch
keycode 188 = comma semicolon
keycode 189 = minus underscore
keycode 190 = period colon
keycode 191 =
keycode 192 = numbersign apostrophe
keycode 193 =
keycode 194 =
keycode 195 =
keycode 196 =
keycode 197 =
keycode 198 =
keycode 199 =
keycode 200 =
keycode 201 =
keycode 202 =
keycode 203 =
keycode 204 =
keycode 205 =
keycode 206 =
keycode 207 =
keycode 208 =
keycode 209 =
keycode 210 = plusminus hyphen macron
keycode 211 =
keycode 212 = copyright registered
keycode 213 = guillemotleft guillemotright
keycode 214 = masculine ordfeminine
keycode 215 = ae AE
keycode 216 = cent yen
keycode 217 = questiondown exclamdown
keycode 218 = onequarter onehalf threequarters
keycode 219 =
keycode 220 = less greater bar
keycode 221 = plus asterisk asciitilde
keycode 222 =
keycode 223 =
keycode 224 =
keycode 225 =
keycode 226 =
keycode 227 = multiply division
keycode 228 = acircumflex Acircumflex
keycode 229 = ecircumflex Ecircumflex
keycode 230 = icircumflex Icircumflex
keycode 231 = ocircumflex Ocircumflex
keycode 232 = ucircumflex Ucircumflex
keycode 233 = ntilde Ntilde
keycode 234 = yacute Yacute
keycode 235 = oslash Ooblique
keycode 236 = aring Aring
keycode 237 = ccedilla Ccedilla
keycode 238 = thorn THORN
keycode 239 = eth ETH
keycode 240 = diaeresis cedilla currency
keycode 241 = agrave Agrave atilde Atilde
keycode 242 = egrave Egrave
keycode 243 = igrave Igrave
keycode 244 = ograve Ograve otilde Otilde
keycode 245 = ugrave Ugrave
keycode 246 = adiaeresis Adiaeresis
keycode 247 = ediaeresis Ediaeresis
keycode 248 = idiaeresis Idiaeresis
keycode 249 = odiaeresis Odiaeresis
keycode 250 = udiaeresis Udiaeresis
keycode 251 = ssharp question backslash
keycode 252 = asciicircum degree
keycode 253 = 3 sterling
keycode 254 = Mode_switch

2010年11月23日 星期二

Reporting Service 2008 R2 全形英文及符號出現亂碼

近日開始用 Reporting Service 2008 開發新的報表,我使用的是英文版。在佈署報表之後,透過 URL 去存取報表服務,我選擇的是 PDF 格式輸出。檢視 PDF 內容時,發現所有全形的英文或是標點符號,全都變成亂碼了。


有點不解的,是在預覽報表時,結果其實還蠻正常的。點選匯出 PDF 時,這份 PDF 內容也是正常的。



詳細去檢視報表內容的屬性時,發現在 FontFamily 的預設值是「Arial」,試著換別的字型,於是我選了「(新)細明體」,再重新佈署一次報表。發現換了細明體後, PDF 的內容就可以正常顯示全形的英文及標點符號了。



原來在 Reporting Service 裡,你所要呈現的文字,跟你所挑選的字形會有如此大的關係。但依常理來說,開發工具是不該讓設計者有如此困惑的情況,或許這次微軟也有什麼難言之隱也說不定(因為我在預覽報表時,執行匯出 PDF 是正常;但透過 URL 存取報表卻出現亂碼)。除了使用(新)細明體能解決上述我所遇到的問題外,測試其它種中文字型,「標楷體」也可以正常顯示,但,「微軟正黑體」則不行。

結論是,在 Reporting Service 2008 R2,透過 URL 存取 PDF 格式的報表時,若要正常顯示全形的英文及標點符號,必須使用「(新)細明體」或「標楷體」。

在 Reporting Service 2008 R2 後,開始支援匯出 word 格式的報表,最後也針對匯出 word , excel 格式報表去檢視是否有上述的問題,結果是 word 與 excel 都可以正常顯示。所以只有在報表格式是 PDF 時,需要特別注意這亂碼問題。


參考文章:
01:http://missice.pixnet.net/blog/post/24265150
02:http://social.msdn.microsoft.com/forums/zh-TW/240/thread/324bdcc8-7a60-4d1d-bd94-3e97fd701c99

2010年11月18日 星期四

禍之所由,常在於智用,不在於性動。

「夫不慮而欲,性之動也;識而後感,智之用也。性動者,遇物而當,足則無餘;智用者,從感而求,勌而不已。故世之所患,禍之所由,常在於智用,不在於性動。」


這句話是引自嵇康的<答難養生論>,其意略作如下:
那些不需思索而產生的欲望,是屬於人類本性的需求。譬如你肚子餓了,自然就會有想要吃東西的欲望。但累積了許多不同經驗之後,你開始就會有好惡差別的感受,這是因為你的「心」已經開始在分別,知道哪些是好吃的、哪些又是不好吃的。

對於原始本性的需求,只要獲得了基本的物質供給,就不會再有多餘的乞求。但是對於那些已起美醜、好惡的心來說,則會為了滿足各種不同感受上的需求來費盡心思,也給自己起了許多煩惱、多了很多事情去憂心。譬如說,如果提供午餐的菜單只有一種,那你就沒啥好挑剔,就它了。但如果有很多種菜單可選擇,那反而你會因為不知道要挑哪一種菜單而煩惱。

所以,世人所面臨到的煩惱、所遭遇到的禍害,常常是起因於內心的貪求與好惡,而並不是自己最原始的需求。

而在嵇康同文出處,也提到養生五難,都可視為「智用」的壞處:

原文:

養生有五難:名利不滅,此一難也。喜怒不除,此二難也。聲色不去,此三難也。滋味不絕,此四難也。神慮轉發,此五難也。五者必存,雖心希難老,口誦至言,咀嚼英華,呼吸太陽,不能不回其操,不夭其年也;五者無於胸中,則信順日濟,玄德日全,不祈喜而有福,不求壽而自延。此養生大理之所效也。


注:

勌,勉也。勸或作勌。讀作:ㄐㄩㄢˋ

參考:

01:老、莊養生哲學的流變與影響
02:兩漢魏晉哲學史
03:嵇康與葛洪的養生論

2010年11月8日 星期一

jQuery 判斷 DataList 是否被挑選



Asp.net 的 DataList,轉換成 HTML 後,就會變成:


<select size="4" name="ListBox1" id="ListBox1">
<option value="Item01">Item01</option>
<option value="Item02">Item02</option>
<option value="Item03">Item03</option>
</select>

當我們想透過 jQuery 來判斷使用者是否挑選了其中一個項目,其判斷方法可以如下:

if ($("select[id$=ListBox1] option:selected").size() == 0)
{
    // 沒有被挑選
        $("#spanShow").html("No Selected");
}
else
{
  //有被挑選
       $("#spanShow").html($("select[id$=ListBox1] option:selected").val());
}


參考網站:Check if option is selected with jQuery, if not select a default