JQuery условный оператор для 2 элементов формы с тем же классом - PullRequest
1 голос
/ 11 января 2010

Это, вероятно, простой вопрос, но я не могу понять его, поэтому я спрашиваю сообщество.

У меня есть список выбора и текстовое поле в форме. У них обоих одинаковый класс.

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

Пока что я могу заставить его работать только для текстового поля:

$('.affector').change(function(){
if ($(this).val() !== '') {
 $(this).parents('tr').find('input:radio').attr('disabled', false);
 } else {
 $(this).parents('tr').find('input:radio').attr('disabled', true);
 }
});

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

О, да, список выбора заполняется динамически, поэтому мне, вероятно, придется использовать BIND ... и на странице есть несколько полей выбора, поэтому я выбрал класс.

Есть идеи?

ОБНОВЛЕНИЕ: Вот HTML ...

<tr bgcolor=#ffffff>
   <td valign=center>
      Batter # 1
      <div id="txtResult1">  
      <select name="player1" class="affector">
      <option></option> //dynamically populated
      </select>
      </div>

      <input type="text" id="PlayerLocal1" class="affector" name=p1name size=20>
    </td>
    <td>
      <table border=1>
        <tr>
          <td>
        <table border=0 cellspacing=0 cellpadding=0>
            <tr>
                <td><input type=radio name=p1o1 value="1B">1B</td>
                <td><input type=radio name=p1o1 value="FO">FO</td>
           </tr>
       </table>
         </td>
        </tr>
      </table>
    </td>
</tr>

1 Ответ

1 голос
/ 11 января 2010

Прямо сейчас вы проверяете только одно значение вместо обоих, если я правильно понимаю. То есть если срабатывает событие change элемента select, проверяется только значение элемента select, а если срабатывает событие change текстового поля, проверяется только значение текстового поля. Однако вы хотите, чтобы оба были отмечены (И), поэтому я предлагаю что-то вроде этого:

$('.affector').change(updateRadioEnabled);

function updateRadioEnabled() {
    var valueGiven = true;
    $('.affector').each( function() {
        if ($(this).val() == "") {
            valueGiven = false;
        }
    });
    var radio = $('.affector:first').parents('tr').find('input:radio');
    if (!valueGiven) {
        radio.attr('disabled', true);
    } else {
        radio.removeAttr('disabled');
    }
}

РЕДАКТИРОВАТЬ: Примечания: Сообщество Wiki обычно для вопросов, которые приглашают для обмена мнениями в отличие от четких технических ответов. Ваш вопрос явно технический.

.affector:first найдет первый элемент с классом affector и затем прекратит поиск. Я часто делаю это для эффективности (однако см. Комментарий Брэндона ниже). Здесь я просто выбираю этот элемент, чтобы иметь отправную точку для поиска переключателей. Возможно, есть более элегантное решение.

РЕДАКТИРОВАТЬ: Кстати, почему это вики сообщества?

...