0

我有一个学生列表,每个学生旁边都有复选框。现在,我必须运行一个批处理,但在发送该请求之前,我需要能够在至少选中一个复选框的情况下继续该请求。

到目前为止,我的 JS 函数代码是:

function batchOPTAllocate(){
var pid = encodeURIComponent(document.getElementById('alOptList').value);
var proceed = 0;
var elements = document.getElementsByName('stid[]');  
var data = [];
for (var i = 0; i < elements.length; i++){
if (elements[i].checked){ 
    data.push('stid[]='+elements[i].value);
} else{
    proceed = 1;
    alert("You are required to select at least one student.");
    break;

        }
    }
if(proceed === 0){
params = "&paper="+pid+"&"+data.join('&');

if (window.XMLHttpRequest)
  {
     xmlhttp=new XMLHttpRequest();
}
else
{
     xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
 }
     xmlhttp.onreadystatechange=function()
 {
    if (xmlhttp.readyState==4 && xmlhttp.status==200)
  {
// some code here...
  }
}
xmlhttp.open("POST","batch.php",true);
xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xmlhttp.send(params);

}

}

即使使用上面的代码,如果选中其中一个复选框,它仍然会发出警报。

4

3 回答 3

2

data如果选中某个项目,您似乎正在向数组中添加元素。为什么不将警报移出 for 循环并仅在长度data为零时才调用它?

像这样的东西:

if(data.length == 0)
{
    // alert
}else{
    // carry on
}
于 2013-08-10T04:54:53.840 回答
0

如果甚至没有选中一个复选框,您的代码也会发出警报,因为只需进入您的 else 块一次,然后继续将不再为 0

于 2013-08-10T04:55:05.043 回答
0

您的逻辑有点偏斜,因为它在第一个非检查项目上中止

for (var i = 0; i < elements.length; i++){
  if (elements[i].checked){ 
    data.push('stid[]='+elements[i].value);
  } else{
    proceed = 1;
    alert("You are required to select at least one student.");
    break;
  }
}

我会使用:

var proceed = 0;
for (var i = 0; i < elements.length; i++){
  if (elements[i].checked){ 
    data.push('stid[]='+elements[i].value);
    proceed++;
  } 
}
if( proceed != 0 ) {
    alert("You are required to select at least one student.");
    break;
} else {
  //--- process students
}
于 2013-08-10T05:05:16.093 回答