最小化jQuery函数

时间:2012-04-07 04:08:59

标签: php javascript jquery

我有一个函数,它根据行名称为表单项添加更改事件(使用数据库来获取这些)。

这是当前的功能:

    $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个。

4 个答案:

答案 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);
});