我有一堆复选框,用户可以从他们想要加载的系统列表中进行选择。复选框的创建方式如下:
'***************************************************************
' Print systems from DB in a table for the load page.
'***************************************************************
Function PrintSystemTable()
Set con = CreateObject("ADODB.Connection")
con.Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & systemsDBPath
Set systemRs = CreateObject("ADODB.Recordset")
systemRs.CursorLocation = adUseClient
Set sensorRs = CreateObject("ADODB.Recordset")
sensorRs.CursorLocation = adUseClient
document.write("<table class=satelliteList>")
document.write("<tr class=""tableHeader"">")
document.write("<td>Select</td>")
document.write("<td width=""100"">System Name</td>")
document.write("<td width=""100"">Description</td>")
document.write("<td width=""75"">Files</td>")
document.write("</tr>")
systemRs.Open "SELECT * FROM System ORDER BY SystemName", _
con, adOpenStatic, adLockOptimistic
do until systemRs.eof
document.write("<tr valign=""top"">")
document.write("<td>")
document.write("<INPUT TYPE=CHECKBOX NAME=""system"" VALUE=""" & systemRs("SystemName") & """>")
document.write("</td>")
document.write("<td>")
document.write(systemRs("SystemName"))
document.write("</td>")
document.write("<td>")
document.write(systemRs("Description"))
document.write("</td>")
document.write("<td>")
document.write(guiPath & systemRs("Satellite"))
sensorRs.Open "SELECT * FROM SystemSensors WHERE System='" & systemRs("SystemName") & "'", _
con, adOpenStatic, adLockOptimistic
do until sensorRs.eof
document.write("<br>" & guiPath & sensorRs("Sensor"))
sensorRs.movenext
loop
sensorRs.Close
document.write("</td>")
'adoDBRecordset("FieldName") & "<br>")
document.write("</tr>")
systemRs.movenext
loop
document.write("</table>")
con.Close
End Function
它们不是一种形式。我试图通过他们的名字(系统)访问我的复选框,并迭代它们以查看哪个被检查。
'find the systems that are selected
'access an array of all the checkboxes?
Dim checkboxes
Set checkboxes = document.getElementsByName("system")
'For i=0 to UBound(checkboxes)
For Each chk in checkboxes
' If (checkboxes(i).checked = true) Then
If (chk.checked = true) Then
document.write("A checkbox is checked <br>")
Else
document.write("Unchecked <br>")
End If
'document.write(chk.value & "<br />")
Next
我尝试过迭代使用for和for循环。我得到同样的错误。以下是发生的事情:
现在我的数据库中有两个测试样本,所以我可以选择两件事。如果我选择第一个项目并按下运行我的检查程序脚本的按钮,则会打印“选中一个复选框”,我的页面上出现错误(权限被拒绝),说我无法访问已检查的属性。它不打印“未选中”。如果我选择我的SECOND项目,取消选中第一项,则打印“未选中”并且不打印“选中复选框”。
如果我选择这两个项目,则会打印“选中一个复选框”,并给出相同的错误。
如果我没有选择任何一个项目,它会打印“未选中”ONCE(而不是每个未检查项目一次),我得到相同的权限拒绝错误,告诉我无法访问已检查的属性。
在我开始测试已检查的值之前,我尝试打印每个复选框的值,但尝试访问value属性也让我被拒绝。
奇怪的是它似乎对第一个元素“工作”(因为它只为一个元素打印一条适当的消息),即使它仍然会抛出一个权限被拒绝的错误。这让我相信我要么没有正确使用document.getElementsByName()(它是否返回一个数组?),或者我没有正确迭代......或者其他一些超出我的神秘感。
这是CLIENT-SIDE vbscript,而不是ASP。 Javascript也不是一个选项;我出于特定原因使用客户端vbscript和HTML。不要为自己使用它而烦恼自己并告诉我这是愚蠢的,因为我同意;我没有选择。
如何访问和遍历我的同名(系统)复选框,看看哪些被检查并获得它们的价值?
答案 0 :(得分:1)
页面加载后的任何document.write()都将替换整个页面,这就是脚本只找到第一个复选框而不是其他复选框的原因。
我已按如下方式修改了您的代码,现在一切正常:
<SCRIPT LANGUAGE="VBScript">
<!--
Dim checkboxes
Set checkboxes = document.getElementsByName("system")
Set e = document.createElement("p") 'ADDED
document.body.appendChild e 'ADDED
' For i=0 to UBound(checkboxes)
For Each chk in checkboxes
' If (checkboxes(i).checked = true) Then
If (chk.checked = true) Then
e.innerHtml = e.InnerHtml + "A checkbox is checked <br>" 'MODIFIED
Else
e.innerHtml = e.InnerHtml + "Unchecked <br>" 'MODIFIED
End If
'document.write(chk.value & "<br />")
Next
</SCRIPT>
我希望这能回答你的问题。