Если оператор возвращает true, хотя выполняется только одно из нескольких условий (jQuery) - PullRequest
0 голосов
/ 16 февраля 2012

Я хочу уведомить пользователей, отвечающих на форму, если какая-либо из опциональных переключателей останется без ответа перед отправкой (чтобы убедиться, что они были пропущены преднамеренно). Моя проблема заключается в том, что, хотя я устанавливаю оператор if с несколькими условиями, оператор if возвращает true, когда выполняется любое из условий, а не когда все они выполняются. Я использую jQuery 1.7.1.

Javascript:

$("#optmsg").show();
function updateFormEnabledOpt() {
if (verifyOpt()) {
    $("#optmsg").hide();
} else {
    $("#optmsg").show();
}
}

function verifyOpt() {
if ($("#formidable input:radio[name='q11']:checked").val() !== 'undefined' && $("#formidable input:radio[name='q12']:checked").val() !== 'undefined' && $("#formidable input:radio[name='q13']:checked").val() !== 'undefined') {
    return true;
} else {
    return false;
}
}

$('#formidable input:radio[name="q11"]').change(updateFormEnabledOpt);
$('#formidable input:radio[name="q12"]').change(updateFormEnabledOpt);
$('#formidable input:radio[name="q13"]').change(updateFormEnabledOpt);​

Итак: как только у любого из трех вопросов будет установлен флажок, #optmsg будет скрыт. Jsfiddle (с небольшим количеством html для скрипта): http://jsfiddle.net/rnPA6/

ОБНОВЛЕНИЕ: Спасибо за помощь! С невероятной скоростью могу добавить! Вот рабочая скрипка: http://jsfiddle.net/rnPA6/14/

Ответы [ 4 ]

2 голосов
/ 16 февраля 2012
Метод

val() возвращает пустую строку, если во входном элементе ничего не установлено, что не равно undefined, из-за чего условие выполнялось. Попробуйте это, которое не пройдет, если значение пусто.

if ($("#formidable input:radio[name='q11']:checked").val() 
     && $("#formidable input:radio[name='q12']:checked").val() 
     && $("#formidable input:radio[name='q13']:checked").val() ) {

}

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

0 голосов
/ 16 февраля 2012

Это будет делать:

function updateFormEnabledOpt() {
  $("#optmsg").show();
  if (($("#formidable input:radio[name='q11']:checked").val() !== undefined) && ($("#formidable input:radio[name='q12']:checked").val() !== undefined) && ($("#formidable input:radio[name='q13']:checked").val() !== undefined)) {
      $("#optmsg").hide();
  } 
}

$('#formidable input:radio[name="q11"]').change(updateFormEnabledOpt);
$('#formidable input:radio[name="q12"]').change(updateFormEnabledOpt);
$('#formidable input:radio[name="q13"]').change(updateFormEnabledOpt);

Смотрите это в действии: http://jsfiddle.net/BwUWp/

0 голосов
/ 16 февраля 2012

Вы сравниваете строку, содержащую текст 'undefined', а не значение undefined.

0 голосов
/ 16 февраля 2012

Вы сравниваете, используя и (&&).В этом jsfiddle я исправил ваш код для использования или (||).

...