问题描述:
问题很简单,就是使用<s:iterator 动态生成一些table行,行里面有可编辑的项input,可直接在表格修改,修改后自动保存数据库。
<s:iterator value="u5bfqdList" var="obj" status="stuts">
<tr οnclick="selectRow(<s:property value="ID"/>)">
<td><input type="checkbox" name="check_box[]" value="<s:property value="ID"/>"/> </td>
<td></td>
<td></td>
<td></td>
<td><s:textfield name="EXCOST" cssClass="input_02" size="12"/></td>
<td><input type="text" name="GX01" size="12" value="" id="GX01"/></td>
<td></td>
<td></td>
<td></td>
</tr>
</s:iterator>
问题分析:
要做的事很简单,就是获取到当前修改到的input的值。但问题就是如果获取到这个值。
1.给input配上ID号明显不行,因为这个是动态生成的,如果配一个ID,那全部列的这个td都是同一个id。错误。
2.配动态id。问题是搞了半天也无法在动态值<s:textfield内部加上另一个动态值。而且就算加上了,在取值的时候也要判断当前行什么的,作一番逻辑操作。
3.使用this。this很强大,但我做了半天也用this取不到值,this.val(),总是undefined。就算取到值了,取到的也只是当前input的值,也不好去取另一个input的值。
问题解决:
$(document).ready(function() {
var EXCOST_value="";
var GX01_value="";
$("input[name='EXCOST'],input[name='GX01']").focus(function(){
EXCOST_value=$(this).parent().parent().children("td").eq(5).find("input").attr("value");
GX01_value=$(this).parent().parent().children("td").eq(6).find("input").attr("value");
});
$("input[name='EXCOST'],input[name='GX01']").blur(function(){
var $EXCOST_input=$(this).parent().parent().children("td").eq(5).find("input").attr("value");
var $GX01_input=$(this).parent().parent().children("td").eq(6).find("input").attr("value");
alert("EXCOST_value Before:"+EXCOST_value+" after:"+$EXCOST_input+"\nGX01_value Before:"+GX01_value+" after:"+$GX01_input);
if((EXCOST_value!=$EXCOST_input) || (GX01_value!=$GX01_input)){
alert("执行数据库操作");
var a={
EXCOST:$EXCOST_input,
EAMCODE:$GX01_input
};
}
else {
alert("Nothing Changed");
}
});
});
1.不知道为什么,使用js(即在input后面加click函数,再写函数内容)的方式做不出来,老是获取不到
$(this).parent().parent().children("td").eq(6).find("input").attr("value");
,这种jquery的$(document).ready()的方式就是可以的。
2.其实
$(this).parent().parent().children("td").eq(6).find("input").attr("value");
这一句取的就是当前的值,而我用这种明显曲线救国的方法,实在是因为this.attr("value")取不到值,这种先找爷爷再找孙子的方式,我是无力吐槽了。。。。
先这样用着吧。。。。