[JQuery] 處理 IE 不支援 HTML5 的 placeholder 屬性 (一次搞定)
/* 2012.8.29 Maple 撰寫 */
原本想說 IE9 有支援 HTML5 了,沒想到這麼好用的 placeholder 屬性居然不支援 = =
PS. placeholder 屬性是設定輸入框中顯示"提示文字"
Google 查到 http://blog.wu-boy.com/2011/11/html5-placeholder-attribute-on-ie/ 的解決方案
原本要照著用,結果這用法使用上不太方便 ( 我想要一次解決全部的 placeholder )
考量可能的使用環境,改成以下程式
本來是想要寫半套 自己可以用就好了
最後想想,既然都 po 出來哩,那還是把它寫完整點好了 Orz
紅字的部份是我無法解決的地方,如果有什麼一勞永逸的方式歡迎指教 ><
在HTML中載入 js 檔案
<!--[if IE]>
<script src = "fixIePlaceholder.js"></script>
<![endif]-->
另外設定CSS,不採用直接修改顏色,因為可能會異動到原本自定義的color
.placeholderColor { color : #A9A9A9 !important; }
檔案 fixIePlaceholder.js 的內容
/*
處理 IE 不支援 HTML5 的 placeholder 屬性
2012.8.29 Maple 撰寫
http://www.dotblogs.com.tw/maplenote/archive/2012/08/29/html5-placeholder-on-ie.aspx
適用 jQuery 1.6 以上的版本,低於 1.6 需把 prop() 改為 attr()
*/
function fix_ie_placeholder()
{
$("[placeholder]").each(function(){
var el = $(this);
var placeholder = el.attr("placeholder");
if(el.prop("type")=="password")//處理密碼欄位
{
el.focus(function ()
{
$(this).prop("type","password");
if($(this).val() == $(this).attr("placeholder"))
{
$(this).val('').removeClass("placeholderColor");
}
}).blur(function ()
{
if($(this).val()=='')
{
$(this).prop("type","text");
$(this).val($(this).attr("placeholder")).addClass("placeholderColor");
}
});
//不採用 el.blur(); 可能會改到預設 focus() 的輸入框
//值相同時,也要修改文字顏色
if(el.val()==''||el.val()==el.attr("placeholder"))
{
el.prop("type","text");
el.val($(this).attr("placeholder")).addClass("placeholderColor");
}
}
else //處理非密碼欄位
{
el.focus(function ()
{
if($(this).val() == $(this).attr("placeholder"))
{
$(this).val('').removeClass("placeholderColor");
}
}).blur(function ()
{
if($(this).val()=='')
{
$(this).val($(this).attr("placeholder")).addClass("placeholderColor");
}
});
//不採用 el.blur(); 可能會改到預設 focus() 的輸入框
//值相同時,也要修改文字顏色
if(el.val()==''||el.val()==el.attr("placeholder"))
{
el.val($(this).attr("placeholder")).addClass("placeholderColor");
}
}
});
}
//送出表單時呼叫,欄位值若等於 placeholder 的值就清空
function clearPlaceholderValue()
{
$("[placeholder]").each(function(){
if($(this).val()==$(this).attr("placeholder"))
{
$(this).val("");
}
});
}
$(function(){
fix_ie_placeholder();
//監聽 submit 事件,此動作會在 onsubmit 後,尚未轉頁前執行
if(typeof window.addEventListener != "undefined") {
window.addEventListener("submit",clearPlaceholderValue);
} else {
$("form").each(function(){
this.attachEvent("onsubmit",clearPlaceholderValue);
});
}
});
最後要注意,送出表單前若有 必填欄位檢核 的 onsubmit 判斷,需要增加判斷 欄位值不可為提示文字
因為 Event Listener 監聽動作會在 onsubmit 的 js 處理後才執行
所以在執行 onsubmit 判斷時,欄位值有可能是提示文字,而非空值
跟監聽事件的動作很不熟,找了一下參考資料 + 測試老半天 ,終於能跑了
以下是有關事件監聽的參考資料
http://tw.newtonstudio.com/?p=59
http://blog.othree.net/log/2007/02/06/third-argument-of-addeventlistener/