Условный оператор jquery для 2 элементов формы с одним и тем же классом

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

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

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

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

$('.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);
 }
});

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

О да, список выбора заполняется динамически, поэтому мне, вероятно, придется использовать 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>

person Community    schedule 11.01.2010    source источник
comment
!= вместо !== может помочь...   -  person munch    schedule 11.01.2010
comment
Вы можете показать соответствующий html?   -  person Brandon Henry    schedule 11.01.2010
comment
хорошо, добавил HTML. По сути, поля выбора/текста находятся в одном TD, и их изменение должно отключить переключатели.   -  person tresstylez    schedule 11.01.2010
comment
Кто-нибудь может убрать это с вики сообщества?   -  person Tom Bartel    schedule 12.01.2010


Ответы (1)


Сейчас вы проверяете только одно значение вместо обоих, если я правильно понимаю. То есть, если срабатывает событие change элемента 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');
    }
}

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

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

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

person Community    schedule 11.01.2010
comment
Понятия не имею, почему это вики сообщества - просто решил поставить галочку, чтобы узнать ;) Что такое .affector:first? Означает ли это первый элемент с классом аффектора? Кроме того, $(this).val() должен работать и для списка выбора? - person tresstylez; 11.01.2010
comment
Смотрите редактирование. О $(this).val(): Как насчет того, чтобы просто попробовать, прежде чем задавать такие вопросы? Да, это работает для выбранных элементов. - person Tom Bartel; 11.01.2010
comment
вы ошибаетесь в том, как работает :first. он получает все совпадения, затем берет первое. понятия не имею, почему это. spadgos.com/?p=51 - person Brandon Henry; 11.01.2010
comment
Большое спасибо, Брэндон, это действительно полезно. Не знал об этом, просто использовал здравый смысл (чего вам, вероятно, не следует делать в веб-разработке...) - person Tom Bartel; 12.01.2010