Fix 問題: 進入編輯頁面,當點擊其他地方時,判斷頁面是否修改過,并提示相關信息。
問題如下:例如要修改某個人的信息時,進入編輯頁面,當點擊其他地方時,判斷信息是否已被修改過,并提示相關信息。
本例中以個人通訊錄信息為背景, 解決方法如下:
1.首先要有個 Object保存 一開始時從服務器得到的初始數據:
var cachedFormContent = {};

function fCacheForm() { //首先cache個人通訊錄的信息
cachedFormContent.FN = fGetOri("FN");
cachedFormContent.email = fGetOri("EMAIL;PREF");
cachedFormContent.groups = fGetOriGrps();
cachedFormContent.BDAY = fGetOriBDAY();
cachedFormContent.CELL = fGetOri("TEL;CELL;VOICE");
cachedFormContent.ICQ = fGetOri("ICQ");
cachedFormContent.URL = fGetOri("URL");
cachedFormContent.ADR_HOME = fGetOri("ADR;HOME");
cachedFormContent.PC_HOME = fGetOri("PC;HOME");
cachedFormContent.TEL_HOME = fGetOri("TEL;HOME;VOICE");
cachedFormContent.ORGNAME = fGetOri("ORGNAME");
cachedFormContent.ADR_WORK = fGetOri("ADR;WORK");
cachedFormContent.PC_WORK = fGetOri("PC;WORK");
cachedFormContent.TEL_WORK = fGetOri("TEL;WORK;VOICE");
cachedFormContent.FAX = fGetOri("TEL;WORK;FAX");

}
2. 利用 JSON標簽從服務器端得到個人通訊錄的信息,并轉化為js能識別的內容,并寫一個函數用來獲得原來的字段所對應的值
var original = <wm:JSON value="${original_user}" />; //得到初始的個人通訊錄資料

function fGetOri(name) { //name:為字段名, 返回:通訊錄個人屬性
var empty = "";
if (original[name] == null) {
return empty;
}
return original[name];
}

function fGetOriGrps() { //從服務器得到的初始分組
var pabGrps = [];
pabGrps =<wm:JSON value="${original_user['groups']}" />;
return pabGrps;
}
3.寫函數判斷 離開前查看內容是否修改過, 從cacheFormContent 和當前內容對比, 同時要有函數獲取當前屬性的value值
function fCheckBeforeLeaving() { //離開前查看是否修改過
var result = true;
if (fHaveBeenModified()) {
return false;
}
return result;
}

function fHaveBeenModified() { //cache 和當前不同 則表示修改過
var c = cachedFormContent;
return c.FN != fGetContent("p_FN") || c.email != fGetContent("p_EMAIL;PREF") || compareGrps(c, fGetGrps())
|| c.BDAY != fGetContent("p_BDAY")
|| c.CELL != fGetContent("p_TEL;CELL;VOICE") || c.ICQ != fGetContent("p_ICQ") || c.URL != fGetContent("p_URL")
|| c.ADR_HOME != fGetContent("p_ADR;HOME") || c.PC_HOME != fGetContent("p_PC;HOME") || c.TEL_HOME != fGetContent("p_TEL;HOME;VOICE")
|| c.ORGNAME != fGetContent("p_ORGNAME") || c.ADR_WORK != fGetContent("p_ADR;WORK") || c.PC_WORK != fGetContent("p_PC;WORK")
|| c.TEL_WORK != fGetContent("p_TEL;WORK;VOICE") || c.FAX != fGetContent("p_TEL;WORK;FAX");
}

function fGetGrps() { //獲得所屬聯系組
var grps = document.getElementsByName("p_groups");
var checked_grps = [];
for (var i = 0; i < grps.length; i++) {
var grp = grps[i];
if (grp.checked) {
checked_grps[checked_grps.length] = grp.value;
}
}

return checked_grps;
}

function compareGrps(c, grp) {
var groups = c.groups;
if (groups.length != grp.length) {
return true;
}
for (var i = 0; i < groups.length; i++) {
if (groups[i] != grp[i]) {
return true;
}

}
return false;
}

function fGetContent(item0) {
var content = document.getElementsByName(item0);
var val = content[0].value;
return val;
}
4.利用javascript 的 setTimeout()函數 來 每隔一段時間就更新一次cacheFormContent的值(其實在這里每次獲取的值都是相同,只是用作開始時就獲取cacheFormContent),最后用window.onbeforeunload進行加載,注意不要用onload (2者之間的差別請差相關資料)

setTimeout(fCacheForm, 50);


window.onbeforeunload = function() {
var msg = gLang.pab.msg;
var pabForm = $("pabEdit");
if (check && !fCheckBeforeLeaving()) { //檢查是否已修改過,并提示要保存
return msg["pab_save_before_cancel"];
pabForm.submit();
}
}
本例中以個人通訊錄信息為背景, 解決方法如下:
1.首先要有個 Object保存 一開始時從服務器得到的初始數據:

































































































posted on 2008-06-16 21:50 cong 閱讀(622) 評論(0) 編輯 收藏 所屬分類: JavaScript