2015年9月30日 星期三

Combo box, Checkbox, Radio button disabled後值被清空的解決方法

這是前幾天開發時同事發現的問題,我覺得這問題還挺嚴重,也很重要,所以把過程和結果記錄下來和有需要的朋友分享。

Domino Server version: 8.5.3 FP6

在Web表單中有些Combo box, Checkbox, Radio button,若將其disable,於存檔後,欄位值將被清空,原先在8.5.2時並無此問題!

一般的建議為以隱藏條件取代使用HTML的Disabled屬性,但公司有使用集中安控控管,無法一一修改所有表單欄位,因此開始查看發生原因為何。

最後同事幫忙找到了解決方法,原來是8.5.3在FP2後才提供,但必須在Notes.ini中加一DominoDisableKeywordReset參數,連結如下:

http://www-10.lotus.com/ldd/nd85forum.nsf/DateAllFlatWeb/c5ceb75f77158a4a85257ab000741dc0?OpenDocument

若disabled則顏色反灰,無法編輯,但也導致submit後欄位值將被清空
我實地將表單以HTML格式另存在桌面執行,發現若是disabled則等如無此選項,也不會有值,不是只有在domino上執行會如此。

在設定Notes.ini後,結論如下,

DominoDisableKeywordReset=3

1. 若為新表單,如果此欄位無預設值,手動選擇後再disabled存檔,則欄位值仍會被清空。

2. 若為新表單,如果此欄位有預設值,手動選擇後再disabled存檔,則欄位值為預設值,手動選擇值無效。

3. 若為已存檔之文件,開啟後若disabled再存檔,並不會清空欄位值,也不會變更欄位值。

因此若有新文件不希望讓user自行選擇,但又不能固定給預設值的,除了以上的Notes.ini設定外,我提供一個方法和大家分享,測試程式如下:

在onLoad,Combo欄位給了值後,把其他不需要的值disabled

document.forms[0].fdcombo.options[2].selected = true;

for(j=0; j<document.forms[0].fdcombo.length;j++) {
if (document.forms[0].fdcombo.options[j].selected==false){
document.forms[0].fdcombo.options[j].disabled=true
}
}


checkbox, radio button欄位,radio同combo,未選擇的就disabled。checkbox和另外二者不同的是,再點取自身使可修改為空值,所以不適用上面的方法,但可以將onclick事件改為return false, 在按下時就不會有任何變動。

radio當然也可以改為return false, 但若有不同的event觸發也都要一併更改, 比較麻煩。

document.forms[0].fldCheckBox[2].checked = true;
document.forms[0].fldRadio[1].checked = true;

var Ele = document.getElementsByTagName("input");
for(i=0; i<Ele.length;i++) {
if (Ele[i].type=='checkbox') {
var x=Ele[i];x.onclick=function x() {return false;}
}else if (Ele[i].type=='radio' && Ele[i].checked==false) {
Ele[i].disabled=true;
}
}

這種作法和原來直接將欄位disabled的差別,除了不會有欄位值被清空的疑慮,且只將未選擇的欄位反灰,已選或設定值仍為黑色,反差效果更為明顯。

而Checkbox則仍為黑色只是再去勾選是無效的,能有效避開現有值被修改。