2011-11-24 77 views
0

有人可以帮助我,看看我要去哪里错了吗?验证一组下拉框?

<script type="text/javascript"> 
function validateForm(){ 
var x=document.forms["myForm"]["fname"].value; 
if (x==null || x=="") 
    { 
    alert("Enter Name"); 
    return false; 
    } 
var x=document.forms["myForm"]["car[]"].value; 
if (x==null || x=="") 
    { 
    alert("Select Car"); 
    return false; 
    } 
} 
    function add(tbl1) { 
    var tb = document.getElementById(tbl1); 
    var rowCount = tb.rows.length; 
    var row = tb.insertRow(rowCount); 
    var colCount = tb.rows[1].cells.length; 
    for(var i=0; i<colCount; i++) { 
     var newCell = row.insertCell(i); 
     newCell.innerHTML = tb.rows[1].cells[i].innerHTML; 
    } 
    } 

</script> 
</head> 
<body> 
<form name="myForm" action="post.php" onsubmit="return validateForm()" method="post"> 
First name: <input type="text" name="fname"> 
<br><br> 
<p>2. Your previous cars</p> 
<table id="cars" border="1"> 

<tr><td width = "150"><center>Car</center></td> 

</tr><tr> 

</td><td><select name="car[]"> 
<option value="" selected=“selected”>Select one please</option> 
<option value=Ford> Ford </option> 
<option value=Audi> Audi </option> 
<option value=Volvo> Volvo </option> 
<option value=Nissan> Nissan </option> 
<option value=Car 5>Car 5 </option> 
</select></td> 

</tr></table><br><br> 
<input type="button" value="Add Row" onclick="add('cars')"/> 
<input type="submit" value="Submit"> 
</form> 

我已经创建了汽车的数组所以如果人物角色有更多的汽车,他们可以点击添加,并选择另外一个。如果他们有1辆车,只需输入名称和1辆车,表格可以工作,但是当我点击添加行并选择另一辆车时,它不起作用?

感谢

回答

1

问题是,当存在一个名为“car []”的select元素时,它是一个元素,但是当multipel选择元素名为“car []”时,它是一个数组(元素)。您的验证假定它始终是一个元素,因此它失败。

您可以测试document.forms["myForm"]["car[]"]是否是一个数组,您可能会觉得很尴尬,或者您可以使用document.getElementsByName("car[]"),它会始终返回一组元素供您迭代。

如果数组为空或者第一个元素不符合您的有效性条件,则以下if将评估为true。

var x = document.getElementsByName("car[]"); 
if (x.length == 0 || x[0].value == null || x[0].value == "") { /* do stuff */ } 

此解决方案假定只有第一个必须是有效的(由于缺乏“删除车”按钮,这似乎是最合理的,如果这不是你的本意,在它们之间迭代并返回false如果任何不满足有效性条件

1

你不能有相同的属性name多个输入字段。如果按下Add Row按钮,则组合框将被复制,但它保持相同的名称,因此document.forms["myForm"]["car[]"].value;变得未定义。解决这个问题

一种方法是:

<select name="car[]"><select name="car[1]">而JavaScript的内环更改为以下:

newCell.innerHTML 
    = tb.rows[1].cells[i].innerHTML.replace("car[1]", "car["+rowCount+"]"); 

但是你现在需要遍历每个car[x],为了完成验证。

+0

我想纠正这个问题:具有相同'name'的多个输入字段是有效的(确实是单选按钮必需的),它是'id'必须是唯一的。 – Matt