2008/09/28

瀏覽器差異: 標籤的預設行為

<button> 是 form 元素之一,其中的屬性 type 可用的值有 submit、reset、button,預設值是 submit,其效果等同於 <input>:
1. <button type="submit">submit</button> 等同於 <input type="submit">
2. <button type="reset">reset</button> 等同於 <input type="reset">
3. <button type="button">abc</button> 等同於 <input type="button" value="abc">

可是當 <button> 沒有指定 type 時,依據 W3C 的規範,預設等同於 submit,但是在 IE7 下,卻是等同於 button。

for Internet Explorer 7
<button>abc</button> 等同於 <input type="button" value="abc">

for Mozilla Firefox 3
<button>abc</button> 等同於 <input type="submit" value="abc">

因此,如下的表單在 IE 7 與 FF 3 下會有全然不同的行為:






原本預期按下 <button> check 之後,會執行 NameCheck() 函式。
在 IE 7 下會如期運作,但在 FF 3 下,這個表單會直接送出。

因此在使用 <button> 時,建議要指定 type 屬性,以免效果不如預期。

2008/09/27

Javascript 使用 parseInt() 時務必指定進位基數

parseInt() 的第二個參數是指定進位基數,若不指定,parseInt 會依據第一個參數自動判斷。
如果開頭是 0x 或 0X,則視為 16 進位;若開頭是 0,則視為 8 進位;其餘則視為 10 進位。

var e = '1234';
alert(parseInt(e)); // 1234
var f = '01234';
alert(parseInt(f)); // 668, 八進位制的 1234 轉成十進位是 668
alert(parseInt(f, 10)); // 1234, 指定成十進位。

因此在使用 parseInt() 時,除非真的要使用到預設的自動判斷機制,否則請指定進位基數,免得造成自己的困擾。

Ref 1: JavaScript網頁設計師手札
Ref 2: JavaScript parseInt() Function

Javascript 字串轉數值

方法一: Number constructor function

var e = '123';
e = Number(e); // 123

方法二: parseInt() 或 parseFloat()

var e = '123.45abc';
var e1 = parseInt(e, 10); // 123
var e2 = parseFloat(e); // 123.45

若無法轉換成數值時,會回傳 NaN (Not A Number)。

var f = 'abc123';
var f1 = Number(f); // NaN
var f2 = parseInt(f, 10); // NaN
var f3 = parseFloat(f); // NaN


Ref: JavaScript網頁設計師手札

Javascript - 數值轉字串

方法一: String constructor function

var e = 123;
e = String(e);

方法二: toString method

var e = 123;
e = e.toString();

方法三: string concatenation

var e = 123;
var ee = e + '';


Ref: JavaScript網頁設計師手札

2008/09/25

iconv 與 NULL

今天在處理一個文字檔匯入的工作,遇到了 iconv 與 NULL 的小狀況,值得留意一下。

由於網頁是 utf-8,而匯入檔是 big5,因此利用 iconv 來做編碼轉換:

$name = iconv('big5', 'utf-8', $name);

這是再標準不過的寫法了。

但是實際執行匯入時,資料有四萬多筆,卻只匯入了一萬多筆就停了。
打開 log 瞧瞧,發現 MySQL 有錯誤訊息:

Column 'name' cannot be null

原來是有的資料 iconv 轉不出來,就回傳 false,然後欄位 name 又設定不可為 NULL,因此 MySQL 就回傳錯誤訊息。

本來想說,把欄位 name 設定成可接受 NULL 就好,
但這樣又會影響到其他程式,如果其他程式沒有考慮到會有 NULL 的狀況,可能會造成錯誤。
因此最好的做法就是改變匯入時的寫法,遇到 false 就賦予空值,多個小步驟就能解決這個問題。

$name = iconv('big5', 'utf-8', $name);
$name = ($name) ? $name : '';