Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   jQuery - осуществление динамического подсчета (https://javascript.ru/forum/jquery/33767-jquery-osushhestvlenie-dinamicheskogo-podscheta.html)

derbass 07.12.2012 13:40

jQuery - осуществление динамического подсчета
 
Доброго времени суток! Есть вопрос, подскажите как осуществить. Итак, есть таблица, с некоторым количеством столбцов и строк. Есть столбец, в котором идет подсчет веса товара, указанного в строке. Как можно с помощью jQuery или JavaScript осуществить подсчет суммы всех значений в столбце?

ОлегА 07.12.2012 14:53

оч просто

<html>
<head>
$('#start').live('click', function(){
    var total = 0;
    
    $('table .weight').each(function(){        
        total += Number($(this).text());
    });
    
    $('table .total').html( total );
});
    
</script>
</head>
<body>
    <table id="tovar">
        <tbody>
            <tr>
                <td>товар1</td><td class="weight">20</td>
            </tr>
            <tr>
                <td>товар2</td><td class="weight">40</td>
            </tr>
            <tr>
                <td>товар3</td><td class="weight">60</td>
            </tr>
        </tbody>
        <tfoot>
            <tr>
                <th colspan="2" class="total"></th>
            </tr>    
        </tfoot>
    </table>
    <input type="button" id="start" value="посчитать вес">
</body>
</html>

derbass 07.12.2012 15:05

Спасибо за подсказку!!
 
Скажите пожалуйста, если я заменю 'click' на 'change', у меня будет меняться значение при изменении веса, я прав? Интересует возможность при изменении веса в какой-либо ячейке, менять и общую сумму веса.

$('#start').live('change', function(){
var total = 0;
$('table .weight').each(function(){
total += Number($(this).text());
});
$('table .total').html( total );
});

ОлегА 07.12.2012 15:15

понимаете change - это событие, на которое сработает кнопка
у вас так работать не будет, как вы хотите сделать подсчет веса?при нажатии на кнопку или допустим как загрузилась страница?

derbass 07.12.2012 15:28

загрузилась страница, есть таблица с одной строкой, там задаются параметры разные, тип товара, и его характеристики, вес. Я могу добавлять строки, удалять их. Единственное что до сих пор не получается - это подсчет суммы. Я могу выложить код того что у меня получилось.

ОлегА 07.12.2012 15:31

давай код и я так и не понял при каком событии ты хочешь считать сумму и вес

ОлегА 07.12.2012 15:33

т.е сначала надо при загрузке подсчитать, а потом еще пересчитывать, если удалили или добавили строки, я правильно понял?

derbass 07.12.2012 15:36

Да-да, правильно. Сейчас код приложу.
$(document).ready(function() {
 
$("select#type").live("change", function() {
    var _this = this;
    chType(_this);
});

$("select#din").live("change", function() {
    var _this = this;
    chDin(_this);
});

$("select#diam").live("change", function() {
    var _this = this;
    chDiam(_this);
    //chVes(_this);
});

$("select#length").live("change", function() {
    var _this = this;
    chLength(_this);
    
    //chVes(_this);
});

$("input#rate").live("change", function() {
    var _this = this;
    chRate(_this);
});

$("input#ves").live("change", function() {
    var _this = this;
    chVes(_this);
});

function chType(_this) {
    var num = $(_this).attr('class').slice(1);
    var type = $(_this).val();
    $("select#din.n"+num).load("/ves/function.inc.php", {'action':'din','type':type}, function() {
        chDin($("select#din.n"+num));
    });
}

function chDin(_this) {
    var num = $(_this).attr('class').slice(1);
    var din = $(_this).val();
    $("select#diam.n"+num).load("/ves/function.inc.php", {'action':'diam','din':din}, function() {
        chDiam($("select#diam.n"+num));
    });
}

function chDiam(_this) {
    var num = $(_this).attr('class').slice(1);
    var din = $("select#din.n"+num).val();
    var diam = $(_this).val();
    $("select#length.n"+num).load("/ves/function.inc.php", {'action':'length','din':din,'diam':diam}, function(data) {
        if (data == '0') {
            $("select#length.n"+num).attr('disabled','disabled');
            //$("input#rate.n"+num).focus();
            $.post("/ves/function.inc.php", {'action':'wightnol','din':din,'diam':diam}, function(data) {
                $("input#wight.n"+num).val(data);
            });
        }
        else {
            $("select#length.n"+num).removeAttr('disabled');
        }
        chLength($("select#length.n"+num));
    });
}

function chLength(_this) {
    var num = $(_this).attr('class').slice(1);
    var din = $("select#din.n"+num).val();
    var diam = $("select#diam.n"+num).val();
    var length = $(_this).val();
    $.post("/ves/function.inc.php", {'action':'wight','din':din,'diam':diam,'length':length}, function(data) {
        $("input#wight.n"+num).val(data);
        chRate(_this);
    });
}

function chRate(_this) {
    var num = $(_this).attr('class').slice(1);
    var wight = $("input#wight.n"+num).val();
    var rate = $("input#rate.n"+num).val();
    var ves = (wight*rate).toFixed(5);
    $("input#ves.n"+num).val(ves);
}

function chVes(_this) {
    var num = $(_this).attr('class').slice(1);
    var wight = $("input#wight.n"+num).val();
    var ves = $("input#ves.n"+num).val();
    var rate = (ves/wight).toFixed(0);
    $("input#rate.n"+num).val(rate);
}

$("button#add").live("click", function() {
    var num = $(this).attr('class').slice(1);
    var newnum = parseInt(num)+1;
    $(this).hide();
    $.post("function.inc.php", {'action':'add','num':num}, function(data) {
        $("table#calc tbody").append(data);
        $("select#type.n"+newnum).focus();
    });
    if (num>1) {
        $("td.n"+num).html('<a class="delrow" href="javascript:void(0)" onclick="del('+num+')"></a>');
    }
});

function del(num) {
    var row = $("tr.n"+num);
    var rowprev = row.prev();
    var rownext = row.next().attr('class');
    var rowprevnum = parseInt(rowprev.attr('class').slice(1));
    row.remove();
    if (rowprevnum != '1') {
        $('td.n'+rowprevnum).html('<button id="add" class="n'+rowprevnum+'" onclick="return false;"></button><a class="delrow delrowfloat" href="javascript:void(0)" onclick="del('+rowprevnum+')"></a>');
    }
    else {
        if (!rownext) {
            $('td.n'+rowprevnum).html('<button id="add" class="n'+rowprevnum+'" onclick="return false;"></button>');
        }
    }
}

derbass 07.12.2012 15:39

Такого типа таблица:

Тип Стандарт Диаметр Длинна Количество Вес +\-

значения подтягиваются из базы. При изменении, например, типа - меняется все остальное. При изменении Стандарта меняется диаметр Длинна и др. При изменении меняется Вес. Интересует реализация общей суммы (или количества, без разницы. Именя одно легко подтянуть и 2е)

derbass 07.12.2012 15:41

Здесь приложил сразу весь код скрипта, много мусора ненужного. Но надеюсь структура и схема понятны)

ОлегА 07.12.2012 15:48

ох многовато приложил, ща я тебе алгоритм накину


<html>
<head>
<script>
$(function(){
    
    function counter(class_name){
        var total = 0;
        
        $('#tovar .'+class_name).each(function(){        
            total += Number($(this).text());
        });
        
        $('#tovar .'+ class_name +'_total').html( total );    
    }
    
    counter('weight'); counter('sum');
        
    $('#start').live('click', function(){
        counter('weight');
        counter('sum');
    });
    
    $('#tovar tr').live('dblclick', function(){
       $(this).remove();
       counter('weight'); counter('sum'); 
    });
});
</script>
</head>
<body>
    <table id="tovar">
        <tbody>
            <tr>
                <td>товар1</td><td class="weight">20</td><td class="sum">200</td>
            </tr>
            <tr>
                <td>товар2</td><td class="weight">40</td><td class="sum">2050</td>
            </tr>
            <tr>
                <td>товар3</td><td class="weight">60</td><td class="sum">2065</td>
            </tr>
        </tbody>
        <tfoot>
            <tr>
                <th>Общий вес</th><th colspan="2" class="weight_total"></th>
            </tr>    
            <tr>
                <th>Общая сумма</th><th colspan="2" class="sum_total"></th>
            </tr>
        </tfoot>
    </table>
    <input type="button" id="start" value="посчитать вес">
</body>
</html>


принцип работы моего кода таков - при загрузке страницы, подсчитываются общий вес и сумма товаров, после загрузки если дважды кликнуть по одному товару, то он удалится и общий вес и сумма пересчитаются, так можно пересчитывать нажатием на кнопку, ну а если добавлен новый товар, тот же принцип как и с удалением, ну его думаю сам допилишь

derbass 07.12.2012 15:53

Да, приложил не то слово как много)) Ещё раз приношу извинения) Сейчас беру напилник и пилю) Спасибо за наводку! Есть нескромный вопрос - можно ли будет отписаться тебе на мыло, если будут вопросы?

ОлегА 07.12.2012 15:54

вот это трудночитаемый код,

$.post("/ves/function.inc.php", {'action':action,'type':type,'din':din,'diam':diam,'length':length,'rate':rate,'ves':ves},


лучше делайте так

$.post("/ves/function.inc.php", {
     'action' : action,
     'type'   : type,
     'din'     : din,
     'diam'   : diam,
     'length' : length,
     'rate'    : rate,
     'ves'     : ves
},


это не ошибка, просто так на много наглядней))

ОлегА 07.12.2012 15:54

пиши, не вопрос, но я редко туда захожу, лучше тут в личку пиши

derbass 07.12.2012 16:13

Понял, мой косяк. Читабельность кода следует чтить:)

derbass 07.12.2012 16:21

это у нас получается анонимная функция, если я правильно понимаю.
$(function(){
    function counter(class_name){
        var total = 0;
        $('#tovar .'+class_name).each(function(){       
            total += Number($(this).text());
        });
        $('#tovar .'+ class_name +'_total').html( total );   
    }
    counter('weight'); counter('sum');
    $('#start').live('click', function(){
        counter('weight');
        counter('sum');
    });
    $('#tovar tr').live('dblclick', function(){
       $(this).remove();
       counter('weight'); counter('sum');
    });
});

А как можно сделать ,что бы я мог считать общий вес, при изменении вес какого-нибудь товара?
$("input#weight").live("change", function() {
    var _this = this;
    chWeight(_this);
});

...
...
...
и её обработка:
function chWeight(_this) {
    var num = $(_this).attr('class').slice(1);
    var weight= $("input#weight.n"+num).val();
    var total = 0;
        $('#tovar .'+class_name).each(function(){       
            total += Number($(this).text());
        });
        $('#tovar .weight').html( total );   
    }

});

derbass 07.12.2012 16:24

Мне просто вот что инетересно - как правильн оразграничить, что бы они обе считали свои задачи, отдельно. Когда у меня функции не анонимные ,я могу их добавить, например, и в свой обработчик нажатия кнопки "+" при добавлении строки, и общее количество веса или цены у меня пересчитается

ОлегА 07.12.2012 16:35

что бы change работал нужно его привязать к текстовому поле например:

<input type="text" value="20" class="input_sum">

$('.input_sum').live('change', function(){ 
alert($(this).val())
})

derbass 07.12.2012 16:45

Пытаюсь подвязать на свою задачу, в принципе пока ясно)

derbass 07.12.2012 16:51

$("input#allCount").live("change", function() {
    var _this = this;
    chCount(_this);
});
...
...
function chCount(_this){
		 var total = 0;
        $('input#rate').each(function(){       
            total += Number($(this).text());
        });
        $('input#rate').html( total );   
    }

привязал к элементу, указал где и что считать, добавил взов функции пересчета при нажатии кнопки добавить и удалить. Ппц, все равно одна и та же беда

ОлегА 07.12.2012 17:00

так он у тебя из inputa значение и не тащит тут поэтому и не робит
и это че $('input#rate')?

id не должны повторяться в структуре, всё до понедельника мну тут не будет, по больше литературы почитай всё станет понятно)

derbass 07.12.2012 17:33

Вот я как раз и хотел задать вопрос -почему значение из input не тянется))

ОлегА 10.12.2012 07:55

потому что значение из input надо тянуть как $(this).val() а не $(this).text(), text надо писать только если нужное тебе значение заключено в теги, т.е например <div>значение</div> будет браться как $('div').text(), а val() это значит value у inputa

derbass 10.12.2012 07:59

Разобрался, спасибо за наводку! Кстати, ID может быть и не уникальным.
Скидываю пример, может кому в будущем пригодится. Задача: Есть несколько столбцов, необходимо создать общую сумму заданных столбцов. При изменении значений в ячейках столбцов необходимо соответствующее изменение итоговой суммы. ТАк же необходимо раскидать эту функцию, по другим сункциям, для того что бы происходило изменение значений. + использовал разные способы округления и пр.

$("input#total").live("change", function() {
    var _this = this;
    chCol(_this);
});

function chCol(_this){
	 
        var total = 0;
        $("input#ves").each(function(){       
            total += (parseInt(($(this).attr('value')*10000))/10000);

        });
        $("input#total").val(total.toFixed(4));   
    }

ОлегА 10.12.2012 14:15

ID должно быть всегда уникальным, нельзя что бы оно применялось в нескольких элементах, может оно на вид и работает пока, но в будущем по любому столкнешься с проблемой

derbass 10.12.2012 18:17

Пока, тьфу-тьфу, работает без проблем. Попробую переправить, код по наследству достался, придется переделывать. По-немногу материал осваиваю, нахожу косяки.

ОлегА 10.12.2012 22:42

да там ниче сложного поменяй все id которые у тебя дублируются на класс и соответственно код под классы переделай там так еще проще просто # надо сменить .


Часовой пояс GMT +3, время: 14:30.