我目前正在运行一个有效的html和jQuery代码,但对我来说看起来非常难看。我真的很感激建议这样做更聪明。
目标:使用输入字段更新php生成的表格的单元格。每个单元格都包含一个基本值,该值应与输入相乘。
目前,我读取输入的值,从隐藏输入中获取每个单元格的基本值,并重写每个单元格的整个html(隐藏输入+更新数据)。
Html代码:
<table id='tbl'>
<thead>
<tr>
<th colspan="2">Quantity:
<input type="text" id="quantity" name="quantity" value="1">
</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<input name="1_1" type="hidden" value="11"><span>11</span>
</td>
<td>
<input name="1_2" type="hidden" value="12"><span>12</span>
</td>
</tr>
<tr>
<td>
<input name="2_1" type="hidden" value="21">21
</td>
<td>
<input name="2_2" type="hidden" value="22">22
</td>
</tr>
<tr>
<td>
<input name="3_1" type="hidden" value="31">31
</td>
<td>
<input name="2_2" type="hidden" value="32">32
</td>
</tr>
</tbody>
</table>
脚本:
$('#quantity').keyup(function () {
var quantity = parseFloat($(this).val());
if (quantity == "" || isNaN(quantity))
quantity = 1;
$('#tbl tbody tr td').map(function () {
var $row = $(this);
var $refvalue = $row.find(':input[type=hidden]').val();
var $refname = $row.find(':input[type=hidden]').attr('name');
$row.html('<input name="' + $refname + '" type="hidden" value="' + $refvalue + '">' + $refvalue * quantity);
});
});
小提琴:http://jsfiddle.net/5KKrD/
有更好的方法吗?我可以改变表格,js等等。
此致
答案 0 :(得分:2)
这是我的方法 - 使用data
属性(而不是隐藏的输入)来传递乘数,例如:
<td class="cell" data-value="11">11</td>
有了这个 - 你可以使用jquery非常容易地获取值,例如:
$('.cell').data('value')
答案 1 :(得分:1)
我对你的代码进行了一些改进,它的工作顺利进行
JS CODE:
$('#quantity').keyup(function () {
if ($(this).val()) {
var quantity = parseInt($(this).val());
if (quantity == "" || isNaN(quantity)) quantity = 1;
$('#tbl tbody tr td input').each(function () {
var row = $(this);
var mulVal = row.val() * quantity;
$(this).attr('value', mulVal);
$(this).parent().find('span').text(mulVal);
//var $refvalue = $row.find(':input[type=hidden]').val();
//var $refname = $row.find(':input[type=hidden]').attr( 'name' );
//$row.html( '<input name="'+ $refname +'" type="hidden" value="'+ $refvalue + '">' + $refvalue * quantity );
});
}
});
HTML CODE:
<table id='tbl'>
<thead>
<tr>
<th colspan="2">Quantity:
<input type="text" id="quantity" name="quantity" value="1">
</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<input name="1_1" type="hidden" value="11" /><span>11</span>
</td>
<td>
<input name="1_2" type="hidden" value="12" /><span>12</span>
</td>
</tr>
<tr>
<td>
<input name="2_1" type="hidden" value="21" /><span>21</span>
</td>
<td>
<input name="2_2" type="hidden" value="22" /><span>22</span>
</td>
</tr>
<tr>
<td>
<input name="3_1" type="hidden" value="31" /><span>31</span>
</td>
<td>
<input name="2_2" type="hidden" value="32" /><span>32</span>
</td>
</tr>
</tbody>
</table>
<强> LIVE DEMO 强>
快乐编码:)
答案 2 :(得分:0)
对于您的需求可能有点过度杀戮,但这就是backbone.js的目的 - 从HTML DOM中删除数据,而不是将其视为模型和视图。
http://backbonejs.org/#examples
除此之外,您当前的方法有什么问题 - 您有什么具体想要改进的地方?
答案 3 :(得分:0)
代码清理了一下:
$('#quantity').keyup(function() {
var quantity = parseFloat($(this).val());
quantity = ( quantity == "" || isNaN( quantity ) ? 1 : quantity;
$('#tbl tbody tr td').map(function() {
var $hiddenElement = $(this).find(input[type='hidden']);
$(this).html( '<input name="'+ $(hiddenElement).attr('name') +'" type="hidden" value="'+ $(hiddenElement).val() + '">' + (parseFloat($(hiddenElement).val()) * quantity) );
});
});
答案 4 :(得分:0)
我认为你的很好,我个人唯一要改进的就是将html放在var中并用它作为模板来保持语法更清晰,我会替换它
$row.html( '<input name="'+ $refname +'" type="hidden" value="'+ $refvalue + '">' + $refvalue * quantity );
用这个
var template ='<input name="{name}" type="hidden" value="{refvalue}">{res}</a>';
然后
$row.html(template.replace('{name}', $refname) ); // and so on