每当我从<s:select />
下拉框中选择一个值时,它就会填充我的&lt; s:form>
表格中的其余值。我正在使用的列表是占位符,但不应该影响它。
此外,只有在我从默认
表格代码:
<table id="pricingInput" class="footable" style="width: 700px; table-layout: fixed; margin-left: auto; margin-right: 25px; float:right; margin-bottom:50px;">
<thead><tr><th style="text-align: center;">Account Name</th><th style="text-align: center;">Annual kWh Volume</th><th style="text-align: center">Rate Class</th><th style="text-align: center;">Add Another?</th></tr></thead>
<tr>
<td><s:textfield name="nameHolder" /></td>
<td><s:textfield name="volumeHolder" /></td>
<td><s:select headerValue="Choose Rate Class" name="rateClass" list="months" /></td>
<td>
<input type="button" class="addButton" value="Add" />
<input type="button" value="Delete" onclick="deleteRow(this)">
</td>
</tr>
</table>
所以总的问题是什么可能导致这种行为?那么我该如何纠正或预防呢?由于我以前从未遇到任何其他struts项目,我不知道从哪里开始,Google没有太多帮助。
编辑:
用于添加/删除行的JavaScript(免责声明它可能比我需要的更复杂,我在网站上找到它并且在这个主题上有点困惑):
<script type="text/javascript">
$(function addRow(){
$("#pricingInput").on('click', 'input.addButton', function() {
var $tr = $(this).closest('tr');
var allTrs = $tr.closest('table').find('tr');
var lastTr = allTrs[allTrs.length-1];
var $clone = $(lastTr).clone();
$clone.find('td').each(function(){
var el = $(this).find(':first-child');
var id = el.attr('id') || null;
if(id) {
i = id.substr(id.length-1);
var prefix = id.substr(0, (id.length-1));
var splitString = prefix.split("[");
prefix = splitString[0];
if(splitString[1] != null){
var splitStringAgain = splitString[1].split("");
prefix = prefix+(i+1)+splitStringAgain[1];
}
else
prefix = prefix+"[" + (i+1) + "]";
//el.attr('id', prefix);
//el.attr('name', '['+(i+1)+']');
prefix=undefined;
splitString=undefined;
}
});
$clone.find('input:text').val('');
$tr.closest('table').append($clone);
});
$("#pricingInput").on('change', 'select', function(){
var val = $(this).val();
$(this).closest('tr').find('input:text').val(val);
});
});
</script>
<script>
function deleteRow(r)
{
var i = r.parentNode.parentNode.rowIndex;
document.getElementById("pricingInput").deleteRow(i);
}
</script>
页面加载代码:
@SuppressWarnings("unchecked")
@Override
public String execute(){
months = new ArrayList<String>();
years = new ArrayList<String>();
months.add("01");
months.add("02");
months.add("03");
months.add("04");
months.add("05");
months.add("06");
months.add("07");
months.add("08");
months.add("09");
months.add("10");
months.add("11");
months.add("12");
years.add("2014");
years.add("2015");
years.add("2016");
years.add("2017");
years.add("2018");
years.add("2019");
years.add("2020");
utility_map.put("DUQ", rate_class_duq);
utility_map.put("Met_Ed", rate_clas_met_ed);
utility_map.put("Penn_Power", rate_class_pp);
utility_map.put("PPL", rate_class_ppl);
utility_map.put("Penelec", rate_class_penelec);
utility_map.put("Penn_Power", rate_class_pp);
utility_map.put("WPP", rate_class_wpp);
return SUCCESS;
}
表格提交代码:
@Override
public String execute() {
try{
nameList = Arrays.asList(nameHolder.split(","));
volumeList = Arrays.asList(volumeHolder.split(","));
for(int x = 0; x<nameList.size(); x++){
Pricing holder = new Pricing();
try{
if(nameList.get(x) != null && volumeList.get(x) != null){
if(volumeList.get(x).isEmpty() != true && nameList.get(x).isEmpty() != true){
holder.setName(nameList.get(x));
holder.setVolume(Double.valueOf(volumeList.get(x)));
pricing.add(holder);
}
}
}
catch(Exception e){
StringWriter writer = new StringWriter();
PrintWriter printWriter = new PrintWriter( writer );
e.printStackTrace( printWriter );
printWriter.flush();
String stackTrace = writer.toString();
System.out.print(stackTrace);
}
}
}
catch(Exception e ){
addActionError("An unknown error occured. Plase try reloading the page.");
return ERROR;
}
return SUCCESS;
}
答案 0 :(得分:2)
看起来你要添加到每个select的onChange的事件处理程序可能是罪魁祸首:
$("#pricingInput").on('change', 'select', function(){
var val = $(this).val();
$(this).closest('tr').find('input:text').val(val);
});
当&lt; select&gt;更改,您将找到所有&lt; input type =“text”&gt;最近的&lt; tr&gt;内的标签到&lt; select&gt;更改并将每个文本输入的值设置为&lt; select&gt;。
的值摆脱那个事件处理程序,你的问题应该消失。