/** * This function is to check if a form (or a container of implements) has been changed. * JK 2004-01-05 * formObj:the checked form * exceptObjName:the name of whitch need not be checked; * For example:isFormChangedFun(document.frm,"ACheckbox,BRadio,CSelect"); */ function isFormChanged(formObj,exceptObjName) { if(formObj==null) formObj=document.forms[0]; if(exceptObjName==null) exceptObjName==""; var selectObjs=formObj.getElementsByTagName("SELECT");//For Select Obj for(var i=0;i<selectObjs.length;i++) { if((selectObjs[i].name=="")||(eval("/(^|,)"+selectObjs[i].name+"(,|$)/g").test(exceptObjName))) continue; for(var j=1;j<selectObjs[i].length;j++) { if(selectObjs[i].options[j].defaultSelected!=selectObjs[i].options[j].selected) return true; } }
* This function is to check if a form (or a container of implements) has been changed.
* JK 2004-01-05
* formObj:the checked form
* exceptObjName:the name of whitch need not be checked;
* For example:isFormChangedFun(document.frm,"ACheckbox,BRadio,CSelect");
*/
function isFormChanged(formObj,exceptObjName)
{
if(formObj==null) formObj=document.forms[0];
if(exceptObjName==null) exceptObjName=="";
var selectObjs=formObj.getElementsByTagName("SELECT");//For Select Obj
for(var i=0;i<selectObjs.length;i++)
{
if((selectObjs[i].name=="")||(eval("/(^|,)"+selectObjs[i].name+"(,|$)/g").test(exceptObjName))) continue;
for(var j=1;j<selectObjs[i].length;j++)
{
if(selectObjs[i].options[j].defaultSelected!=selectObjs[i].options[j].selected)
return true;
}
}
var inputObjs=formObj.getElementsByTagName("INPUT");//For Input Obj
for(var i=0;i<inputObjs.length;i++)
{
if((inputObjs[i].name=="")||(eval("/(^|,)"+inputObjs[i].name+"(,|$)/g").test(exceptObjName))) continue;
if((inputObjs[i].type.toUpperCase()=="TEXT")&&(inputObjs[i].defaultValue!=inputObjs[i].value))
return true;
else if(((inputObjs[i].type.toUpperCase()=="RADIO")||(inputObjs[i].type.toUpperCase()=="CHECKBOX"))
&&(inputObjs[i].defaultChecked!=inputObjs[i].checked))
return true;
}
var textareaObjs=formObj.getElementsByTagName("TEXTAREA");//For Textarea Obj
for(var i=0;i<textareaObjs.length;i++)
{
if((textareaObjs[i].name=="")||(eval("/(^|,)"+textareaObjs[i].name+"(,|$)/g").test(exceptObjName))) continue;
if(textareaObjs[i].defaultValue!=textareaObjs[i].value)
return true;
}
return false;
}
<head>
<script>
var haveChange=false;
var changeWay="这些地方你作了更改,要保存吗?\n";
function ifChange(n)
{
if(changeWay.indexOf(n)<=0){
haveChange=true;
changeWay=changeWay+";"+n;
}}
</script>
</head>
<body onunload="if(haveChange==true){if(confirm(changeWay)==true){alert('保存');}}">
姓名<input type=text name=text1 value=t1 onChange="ifChange(previousSibling.toString())"><br>
性别<input type=text name=text2 value=t2 onChange="ifChange(previousSibling.toString())"><br>
年龄<input type=text name=text3 value=t3 onChange="ifChange(previousSibling.toString())"><br>
</body></html>
就可以了,一楼的正确。2楼3楼的贴那么多垃圾干什么?不过顺便说一句,这个也不绝对。
1)用defaultValue判断不适用于checkbox, radio, file.
2)defaultValue指的是那个生成表单元素的原始HTML赋予的初始值,
就意味着,如果你的初始值不是从HTML赋予的(eg.javascript),
那么,就不能用defaultValue==value来判断是否是用户有修改了。所以,另一种更可靠的方法是,在页面onload之后,记录每个表单域的初始值。
根据元素类型的不同:
obj.oValue = obj.value;
或 obj.oDisabled = obj.disabled;
或 obj.oChecked = obj.checked;
或 obj.oSelectedIndex = obj.selectedIndex;
回复人: cuixiping(无心) ( ) 信誉:98 2005-4-5 10:53:16 得分: 5 用 obj.defaultValue==obj.value
就可以了,一楼的正确。
///////////////////////////////////////////////////
既然 1 楼的已经说了,你又罗唣些什么呢。2楼3楼的贴那么多垃圾干什么?
//////////////////////////////////////////////////
贴这么多的代码来帮助楼主。所以,另一种更可靠的方法是,在页面onload之后,记录每个表单域的初始值。
/////////////////////////////////////////////////////////////////////
爱机遇到这种“程序员”编出来的程序,算是倒了十八辈子的霉。
不好意思。跟2楼的道个歉。
刚才没仔细看,现在看了一下,2楼的代码是对的,也比较完善。
////////////////////////////////////////////////////////
知错能改,善大莫然,以前是有眼无珠,现在终于还是找了个玻璃球塞进去了。
只可惜你的脑子啊,还是空空如也!!!1、2楼给的程序都是同一个调,也就是你所认为“正确”的答案。不错,他们的答案是正确的,也是传统的、经典的但为什么我看了这么正确、经典和答案,我还是写了另一个答案呢?我仅仅是想告诉诸如你一类的人物:解决问题的方法有千千万万种,可别把你的脑子弄死了!像你这样:一进来就武断地认为一楼的正确(除了傻子外,谁都看得出来),二楼的错误,接着又发现新大陆似的“原来二楼的也正确!”——这就是脑子已经让所谓的正统知识毒死了的征兆。我不敢承认我的程序完全正确,因为当有一种情况出现时,它是不一定正确的,即:当用户更改了表单域的值,并且在该表单域失去焦点后,用户又再次回来把它改回原值。这种情况,你可以说用户修改了该表单域的值,也可以说他没有修改过表单的值。在这种情况下,如果你认为他曾经修改过表单域的值,你需要最后提醒用户到底是否要对那个表单域作更改时,那么一楼、二楼的答案就不怎么正确了;反之,我的程序就不太正确。
你用过“记事本”程序吗?你在记事本程序中选择一段文字后按键盘上的“Ctrl + X”和“Ctrl + V”各一次,然后将记事本程序关闭,你发现了什么?它问你是否要保存更改!!!不光是“记事本”,还有“word2000”、“PhotoShop”、“Flash”和你编网页用的“DW”,几乎是所有的大型软件都是这样,那怕你将它的文档又重新改回原样,它们都依然认为你作了更改。傻瓜,你明白了什么了吗?这个贴子里的所有代码,只有我的可以做到这一点。而你一个背着两颗红星星的人却在这里说傻话,不好笑吗?
如果你不跟 2 楼的道歉,我倒不想跟你争论些什么,偏偏你跟他道了歉,而没有跟我道歉,我一直在等你,等你看明白我的那段程序,可惜,以你的智能,我高估了你!
公司之前所用的处理与三楼的方式类似
俺到公司,之后的处理就改成了二楼的方式
改掉只是为了偷懒,免得每个element都加onchange,道个歉应该不难
但原谅一个人没道歉应该也不算难吧“智能”或者是“智商”
成为尊重或轻视一个人的理由,似乎不大恰当吧