Проверка одного переключателя не работает в доступном сценарии проверки JavaScript - PullRequest
2 голосов
/ 01 января 2011

Я случайно сгенерировал серию переключателей, например

<input type="radio" name="creatorusers" value="1">
<input type="radio" name="creatorusers" value="1">
<input type="radio" name="creatorusers" value="1">
<input type="radio" name="creatorusers" value="1">
.....so on

Но я получаю только ОДИН переключатель и выполняю валидацию javascript, указанную для chk независимо от того, выбран переключатель или нет, тогда он не работаетПожалуйста, помогите мне решить эту проблему.

mycreator = -1;

  for (i=frm.creatorusers.length-1; i > -1; i--) {
  if (frm.creatorusers[i].checked) {
  mycreator = i; i = -1;
  }
  }
  if (mycreator == -1) {
  alert("You must select a Creator User!");
  return false;
  }

Ответы [ 5 ]

5 голосов
/ 01 января 2011

Всегда (!) Используйте ключевое слово var. В противном случае ваши переменные будут в глобальной области видимости (да, даже в теле функций), что может привести к ошибкам, которые трудно отследить.

Как указал @ Феликс , creatorusers будет массивом только в том случае, если в форме более одного элемента с таким именем. Вы можете создать одноэлементный массив, когда необходимо обойти это.

Вот абстрактная функция, которая может проверять произвольный список флажков.

function ensureChecked(checkboxes, error) {
  if (checkboxes) {
    var cbx = (checkboxes.length > 0) ? checkboxes : [checkboxes]; 
    for (var i=0; i<cbx.length; i++) {
      if (cbx[i].checked) {
        return true;
      }
    }
    alert(error);
  }
  return false;
}

позвонить как

ensureChecked(frm.creatorusers, "You must select a Creator User!");
3 голосов
/ 01 января 2011

Ах, теперь я получил. Если у вас есть только одна радиокнопка, то frm.creatorusers не является массивом. Просто пропустите это:

var mycreator = -1;
var checked = false;

if(typeof frm.creatorusers.length === 'number') {
    for (var i=frm.creatorusers.length; i--; ) {
      if (frm.creatorusers[i].checked) {
          mycreator = i;
          checked = true;
          break;
      }
    }
}
else if(frm.creatorusers.checked){
    mycreator = //? what here?
    checked = true;
}

if(!checked) {
     alert("You must select a Creator User!");
     return false;
}

Если mycreator был только для проверки, была ли выбрана кнопка или нет, вы можете полностью удалить ее из кода выше.

Некоторые дополнительные примечания к вашему коду:

  • Всегда объявляйте переменные с var, иначе они будут глобальными.
  • Используйте break для завершения цикла.
  • Может быть, это только из-за копирования и вставки, но наличие большого количества переключателей с одинаковым значением не имеет особого смысла.
2 голосов
/ 01 января 2011

Вы можете сделать что-то вроде этого:

function validate(frm){
    var isChecked = false;

    for (var i=0; i<frm.elements.length; i++)
    {
       if (frm.elements[i].type === 'radio'){
         if (frm.elements[i].checked === true){
           isChecked = true;
           break;
         }
       }
    }

    if (isChecked === true){
       return true;
    }
    else{
       alert('You should select an option first !');
    }
}

Теперь вам нужно вызвать вышеуказанную функцию для onsubmit события вида:

<form onsubmit="return validate(this);">

Теперь функция validate гарантирует, что хотя бы одна радиокнопка отмечена, в противном случае она не будет отправлена.

1 голос
/ 27 июня 2011

Вместо этого вы можете попробовать что-то вроде этого:

<html>
<head>
<script type="text/javascript">     
function confirmsubmit() {
       var btn = document.formname.buttonname

       if (btn.checked == false) 
       {
        window.alert("You did not click the button.");
        btn.focus();
        return false;
        }

        return true;
}
</script>
</head>

<body>

<form method="post" action="mailto:youremail@yourdomain.com" 
name="formname" onsubmit="return confirmsubmit();">
click here: <input type="radio" name="buttonname"><br />

    <p><input type="submit" value="Submit" name="submit"></p>

</form>

</body>
</html>
1 голос
/ 25 марта 2011

это должно сделать

function isRadioSelected(btn) {

    if(typeof btn.length === 'number') {
        for(var i=0;i<btn.length;i++)
            if(btn[i].checked) return true

    }else{
        if(btn.checked) return true
    }

    return false

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...