Совместное добавление входных данных AJAX forms при обновлении пользователя

#javascript #jquery

#javascript #jquery

Вопрос:

ОБНОВЛЕНИЕ 3

James, MondayTotal, — это класс в тегах span, например,

     <span class="TimebreakdownTotalWeek">Mon</span>
<span class="MondayTotal">0</span>
 

ОБНОВЛЕНИЕ 2

Это функция, которая загружает всю неделю, с понедельника по воскресенье, и дает общее количество. Я пробовал, эта функция изменяет класс ‘.totalhours’ на мой mondaytotal, который затем загружает еженедельный итог в эту переменную. Затем я добавляю ‘Monday’ перед моим Count, который, похоже, добавляет только текущие строки monday в мой класс mondaytotal.

Так, например, у меня есть три строки с ‘.Monday0’, ‘.Monday1’ и ‘.Monday2’. Мой итог за понедельник будет содержать общее значение, но переопределяет его при вводе следующего значения. Итак, я ввожу 1 в Monday0, MondayTotal тогда равен 1, но когда вы вводите 2 в Monday1 вместо MondayTotal, равного 3, он просто переопределяет его и теперь содержит 2 — так что в основном он не добавляет строки вместе.

Я думаю, это связано с тем (чтобы, как я вижу, пожалуйста, поправьте меня, если я ошибаюсь), что его «индекс» каждый раз просто сбрасывается на 0 и не выполняется цикл правильно.

  var LoadHourTotals = function(Count) {
    if (typeof Count === "undefined" ) {
        var $total = $('.TotalHours');
        var $value = $('.Input');
    } else {
        var $total = $('.' Count);
        var $value = $('.' Count);
    }

    $value.on('input', function (e) {
        var total = 0;
        $value.each(function (index, elem) {
            if (!Number.isNaN(parseFloat(this.value, 10))) total = total   parseFloat(this.value, 10);
        });
        $total.html(total);
    });
} //End
 

Обновить

Джеймс, ты имеешь в виду HTML-форму, в которую я ввожу? Если это так, то это не так просто, он создается с использованием помощника формы CakePHP, но есть код,

 <input name="data[0][maintime]" class="TimebreakdownInput Monday0" type="text">
 

Затем, когда пользователь нажимает, чтобы загрузить другой элемент формы, он добавит,

 <input name="data[1][maintime]" class="TimebreakdownInput Monday1" type="text">
 

Затем далее, например,

 <input name="data[2][maintime]" class="TimebreakdownInput Monday3" type="text">
 

Затем то же самое для всех остальных дней. Если это не то, о чем вы просите, пожалуйста, объясните подробнее, что вам нужно,

Спасибо.


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

Но сейчас я работаю над суммированием всех дней, поэтому у меня есть общее количество для всех понедельников, вторников и т. Д., А также общее количество за всю неделю (но я не работал над этим let).

 var LoadDailyTotal = function(Count) {
    var $WeekTotal = $('.MondayTotal');

    if (typeof Count === "undefined" ) {
        var $WeekValue = $('.Monday0');
    } else {
        var $WeekValue = $('.Monday' Count);
    }

    $WeekValue.on('input', function(e) {
        var totalweek = 0;
        var currentTotal = parseFloat ($('.MondayTotal').html() );

        $WeekValue.each(function (index, elem) {
            if (!Number.isNaN(parseFloat(this.value, 10))) totalweek = totalweek   parseFloat(this.value, 10);
        });
        $WeekTotal.html(currentTotal   totalweek);
    });
}
 

Прямо сейчас это работает, но я не думаю, что цикл работает правильно. В загружаемой строке по умолчанию вы вводите (например) 1, затем добавляете новую строку, загруженную AJAX, и говорите, что вы вводите 2, что в сумме составляет 3. Но если вы обновите первую строку до 2, она должна быть 4, но я получаю 5, поэтому он сохраняет общее количество, чего я не хочу. Что мне нужно, так это обновить общее количество в каждой строке, если и когда пользователь изменится.

Извините, если я неправильно объяснил себя, пожалуйста, внесите изменения, чтобы объяснить лучше, если это необходимо или если вам нужно больше кода.

Спасибо,

Комментарии:

1. В вашем обработчике событий вы добавляете недавно введенное значение к итогу (поэтому, если у вас есть только одна строка, скажем Monday0, и продолжаете изменять ее значение, ваш итог будет суммой всех введенных вами чисел). Чтобы исправить это, вам нужно будет просуммировать все . Monday0 -> элементы .MondayN каждый раз, когда вводится число. Можете ли вы показать html для элемента .Monday0, а также для .MondayTotal, пожалуйста?

2. Может быть, я не правильно понимаю, не будет ли цикл по вашим тегам ввода давать вам желаемое общее количество? (вы можете фильтровать атрибут .class на основе подстроки, содержащей день недели, который вы хотите отфильтровать). Если вы подготовите jsfiddle, с которым мы можем поиграть, это было бы намного приятнее 🙂

3. Да, и это действительно работает, в строке это самостоятельно. Поэтому при добавлении mon -> sun выводится мой итог (я публикую эту функцию через секунду) за эту неделю. Но когда я хочу, чтобы это было сделано, теперь добавьте все понедельники вместе и дайте мне общее количество для них. Затем каждый день сам по себе.

4. Извините, я пытаюсь настроить скрипку JS, но это сложно, поскольку я использую циклы AJAX и PHP для настройки некоторых из них, но я постараюсь

5. Я думаю, я попросил HTML для .MondayTotal, чтобы было проще исключить его при суммировании.

Ответ №1:

Если вы добавили класс для каждого дня, то вы могли бы, например, выбрать все понедельники, а затем сложить их значения.

 <input name="data[0][maintime]" class="TimebreakdownInput Monday0 Monday" type="text">
<input name="data[1][maintime]" class="TimebreakdownInput Monday1 Monday" type="text">
<input name="data[2][maintime]" class="TimebreakdownInput Monday2 Monday" type="text">

var getDayTotal = function(day){
   var days=$('.' day);
   var total =0;
   days.each(function(){
       total =parseFloat(this.value, 10);
   });
   return total;
}

$('.mondayTotal').html(getDayTotal('monday'));
 

Комментарии:

1. Теперь я вроде как справился с этим, я публикую код, с которым я должен работать ниже

Ответ №2:

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

   var LoadMondayTotals = function() {
    $('.TimebreakdownInput').change(function() {
        var MondayInputs = []; //Array to store all monday daily inputs
        var MondayTotals = 0; //Store Array total for display

        $(".Monday").each(function() { 
            var values = parseFloat( $(this).val() );   
            if (isNaN(values)) { values = 0; } //Set value to 0 if its not a number
            MondayInputs.push(values);
        });

        $.each(MondayInputs, function() {
            MondayTotals  = this; //Count though array, add into total
        });

        $('.MondayTotal').html(MondayTotals); //Display / Add total into HTML
    });
 } //End of LoadMondayTotals
 

Спасибо

за вашу помощь