石頭成老大在我的「終於用 jQuery 做了一個有趣的服務」提到了在 IE 裡 label 元素的 for 屬性是有 bug 的,我研究了一下,把心得分享給大家。
原本我一直以為表單中的 input 元素只要設定 display: none 或是 visibility: hidden 的話,就沒辦法送出;不過 W3C 中在「 17.13.2 Successful controls 」一節中有明確的規範:
Hidden controls and controls that are not rendered because of style sheet settings may still be successful.
也就是說不論是 display:none 或是 visibility: hidden ,只要是利用 CSS 來讓 control 消失的,都還是應該把值送給後端。
我用了以下的程式測試了一下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | |
結果發現 Firefox 、 Opera 不論有沒有預設的 checked ,在點選 label 後都會正確送出對應的 radio 欄位值。
而 IE6 、 IE7 事實上也是支援,只是它們僅能送出有預設 checked 的 radio 欄位;如果完全沒有預設 checked 的 radion 欄位時,因為點選 label 仍無法讓 radio 的值改變,因此也無法送出任何 radio 值 (就如石頭成老大所說明的) 。
所以我原先誤認 IE 不會理會 display: none 或是 visibility: hidden 的元素,其實是 label 無法作用;但更正確的來說,則是因為 IE 無法接受把 focus 放在不可見的元素上。
換句話說,我們沒辦法在 IE 上 focus 任何被 display: none 或是 visibility: hidden 的元素;而 label 則是 HTML 用來 focus 對應 input 元素的捷徑,也因此就不會有作用了。
註:所以我在「終於用 jQuery 做了一個有趣的服務」裡的作法就是為了避開這個問題。
最後這是不是 bug 呢?我個人倒覺得像是 IE 開發團隊自己的想法。不過 IE 無視於 W3C 標準也不是第一次了,所以石頭成老大說這是 IE 在 W3C 實作上的 bug 其實也不為過。至於解法,大家可以直接參考石頭成老大的說明,這裡我就不多寫了。