我有一个函数,它根据行名称为表单项添加更改事件(使用数据库来获取这些)。
这是当前的功能:
$sql = "SELECT * FROM product WHERE storeno = '1' ORDER BY descript";
$result = mssql_query($sql, $msConnection);
if ($result && mssql_num_rows($result) > 0) {
while ($row = mssql_fetch_object($result)) {
$sku = trim($row->mas90sku);
$JQueryReadyScripts .= "
$('#newCount_" . $sku . "_row .cases').change(function() {
var count = 0;
$('#newCount_" . $sku . "_row .cases').each(function () {
count += parseFloat($(this).val());
});
$('#cases_total_" . $sku . "').text(count);
});
$('#newCount_" . $sku . "_row .units').change(function() {
var count = 0;
$('#newCount_" . $sku . "_row .units').each(function () {
count += parseFloat($(this).val());
});
$('#units_total_" . $sku . "').text(count);
});";
}
mssql_free_result($result);
}
如何将其合并到一个影响每一行的调用中,这样我就可以摆脱数据库部分,每行只有2个(或1个)代码,而不是2个。
答案 0 :(得分:2)
你可以为案件和单位做这样的事情(请注意,你需要适当地改变总计数的id)
$('.cases').change(function() {
var id = $(this).attr('id');
var count = 0;
$('#'+id+' .cases').each(function() {
count += parseFloat($(this).val());
});
$('#count_'+id).text(count);
});
答案 1 :(得分:1)
$('*[id^=newCount_]').each(function () {
var $row = $(this),
sku = this.id.replace(/newCount_(.*?)_row/, '$1');
function sumValues($elems) {
var sum = 0;
$elems.each(function () { sum += parseFloat(this.value) });
return sum;
}
$.each(['cases', 'units'], function (i, type) {
$row.on('change', '.' + type, function () {
$('#' + type + '_total_' + sku).text( sumValues($row.find('.' + type)) );
});
});
});
这与PHP无关,只需将其用作常规脚本即可。
它使用.on()
事件委托,因此它需要jQuery 1.7+。对于早期版本的jQuery,您可以使用.delegate()
获得相同的效果。
我建议为你的所有行提供一个通用的CSS类,这样就可以用更简单的东西替换不太好的$('*[id^=newCount_]')
,但这是一个美化的变化。
答案 2 :(得分:0)
类选择器和id选择器之间的主要区别在于id选择器应该是唯一的,类选择器不是。
在更改事件的正文中使用$(this),因此操作是相对的,您可以编写一个处理所有情况的单个更改事件。
<input class="cases" id="newCount_123"></input>
<input class="cases" id="newCount_345"></input>
$('.cases').change(function() {
var count = 0;
var sku = $(this).attr("id");
count += parseFloat($(this).val());
$('#cases_total_' + sku).text(count);
});
这也使JavaScript远离PHP,这很难维护并违反MVC原则。您的服务器端代码负责检索数据并将其发送到客户端,而客户端代码则负责处理视图。
答案 3 :(得分:0)
我不确定这是否适用于您的两种功能。不确定确切的标记。但可能值得一试。
$('#newCount_' + $sku + '_row .cases, #newCount_' + $sku + '_row .units').change(function() {
var count = 0,
thisClass = ( $(this).hasClass('cases') ) ? 'cases' : 'units';
$('#newCount_" . $sku . "_row .'+thisClass).each(function () {
count += parseFloat($(this).val());
});
$('#'+thisClass+'_total_" . $sku . "').text(count);
});