Изменить выпадающий список и переключатели с помощью jQuery

#jquery

#jquery

Вопрос:

У меня есть длинная страница, на которой задаются вопросы и внизу указывается общий балл.

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

Сценарий:

     $(document).ready(function(){
        //iterate through each textboxes and add keyup
        //handler to trigger sum event
        $(".txt").each(function() {
            $(this).keyup(function(){
                calculateSum();
            });
        });
    });

    function calculateSum() {
        var sum = 0;
        //iterate through each textboxes and add the values
        $(".txt").each(function() {

            //add only if the value is number
            if(!isNaN(this.value) amp;amp; this.value.length!=0) {
                sum  = parseFloat(this.value);
            }
        });
        //.toFixed() method will roundoff the final sum to 0 decimal places
        $("#sum").html(sum.toFixed(0));
    }
  

HTML:

         <p>Select weight:<br />
          Underweight (-1 point)<input class="txt" type="radio" name="weight" value="-1" /><br />
          Normal weight ( 1 point)<input class="txt" type="radio" name="weight" value=" 1" checked="checked" /><br />
          Underweigth (-1 point)<input class="txt" type="radio" name="weight" value="-1" />
        </p>

        <p>Select vision impairment: 
          <select id="heath-status">
            <option class="txt" value="1">Normal and healthy ( 1)</option>
            <option class="txt" value="-1">Mild impairment (-1)</option>
            <option class="txt" value="-2">Moderate impairment (-2)</option>
            <option class="txt" value="-3">Moderate/Severe impairment (-3)</option>
            <option class="txt" value="-4">Severe impairment (-4)</option>
            <option class="txt" value="-5">Severe/Extreme impairment (-5)</option>
            <option class="txt" value="-6">Extreme impairment (-6)</option>
          </select>
          </p>
        <p>Enter number of limbs you have (1 point for each limb): <input class="txt" type="text"/></p>

        <p>Enter number of days per week you exercise (1 point for each day): <input class="txt" type="text"/></p>

        <p>Grand total health score: <span id="sum">0</span></p>
  

Наполовину рабочий пример:http://jsfiddle.net/hMgpM /

Ответ №1:

http://jsfiddle.net/hMgpM/7/

Здесь есть несколько вещей. Вам нужен не класс для каждого отдельного, <option> а скорее select . Вы суммировали все параметры, а не только выбранный. Аналогично, переключатели необходимо обрабатывать по-разному, чтобы суммировать только выбранные.

Кроме того, вы захотите суммировать не только при вводе текста, но и при выборе переключателя или изменении значения поля выбора. Вы также можете немного почистить это, избавившись от функции-оболочки, поскольку вы можете просто передать функцию напрямую. Кроме того, each был ненужным. При вызове чего-то вроде keyup оно будет привязано ко всем элементам вашего объекта jquery, поэтому нет необходимости выполнять цикл.

 <p>Select weight:<br />
    Underweight (-1 point)<input class="rad" type="radio" name="weight" value="-1" /><br />
    Normal weight ( 1 point)<input class="rad" type="radio" name="weight" value=" 1" checked="checked" /><br />
    Underweigth (-1 point)<input class="rad" type="radio" name="weight" value="-1" />
</p>

<p>Select vision impairment: 
    <select id="heath-status" class="txt">
        <option  value="1">Normal and healthy ( 1)</option>
        <option  value="-1">Mild impairment (-1)</option>
        <option  value="-2">Moderate impairment (-2)</option>
        <option  value="-3">Moderate/Severe impairment (-3)</option>
        <option  value="-4">Severe impairment (-4)</option>
        <option  value="-5">Severe/Extreme impairment (-5)</option>
        <option  value="-6">Extreme impairment (-6)</option>
    </select>
</p>
<p>Enter number of limbs you have (1 point for each limb): <input class="txt" type="text"/></p>

<p>Enter number of days per week you exercise (1 point for each day): <input class="txt" type="text"/></p>

<p>Grand total health score: <span id="sum">0</span></p>
  

 $(document).ready(function() {
    //iterate through each textboxes and add keyup
    //handler to trigger sum event
    $("input.txt").keyup(calculateSum);
    $("select.txt").change(calculateSum);
    $(".rad").click(calculateSum);

    calculateSum();
});

function calculateSum() {
    var sum = 0;
    //iterate through each textboxes and add the values
    $(".txt").each(function() {

        //add only if the value is number
        if (!isNaN(this.value) amp;amp; this.value.length != 0) {
            sum  = parseFloat(this.value);
        }
    });

    $(".rad:checked").each(function() {
        sum  = parseFloat(this.value);
    });
    //.toFixed() method will roundoff the final sum to 2 decimal places
    $("#sum").html(sum.toFixed(0));
}
  

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

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

2. Моим единственным предложением было бы использовать $('name=[weight] :checked') вместо этого. Это даст вам только одну отмеченную переключающую кнопку, и вам не придется выполнять другую $.each с помощью инструкции if.

3. Обновлено с помощью :checked . Кроме того, вы можете просто вызвать свой метод в document.ready , и он будет вычисляться при загрузке.

4. Я заметил это обновление, работа на высшем уровне. Сейчас ложусь спать, уже 3 часа ночи.

Ответ №2:

Вы могли бы попробовать

 $(document).ready(function(){
    //iterate through each textboxes and add keyup
    //handler to trigger sum event
    $(".txt").each(function() {
        $(this).keyup(function(){
            calculateSum();
        });
    });
});

function calculateSum() {
    var sum = 0;
    //iterate through each textboxes and add the values
    $("input.txt:checked, select .txt:selected, input.txt:not(:radio)").each(function() {
        //add only if the value is number
        if(!isNaN(this.value) amp;amp; this.value.length!=0) {
            sum  = parseInt(this.value);
        }
    });
    //.toFixed() method will roundoff the final sum to 2 decimal places
    $("#sum").html(sum.toFixed(0));
}
  

По сути, вы не выбрали правильные поля для суммы.

Измените здесь:http://jsfiddle.net/hMgpM/1 /

Редактировать — чтобы все работало лучше, вы также должны сделать

         $(this).bind("click keyup", function(){
            calculateSum();
        });
  

вместо

         $(this).keyup(function(){
            calculateSum();
        });
  

Поиграйте здесь http://jsfiddle.net/hMgpM/3 /

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

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

2. Отличная работа, еще раз спасибо Никола, вы с Джеймсом действительно помогли.

3. @Dan я уже все добавил, и я редактирую, я добавил событие olso для других элементов