2010-07-21 33 views
1

我有一堆複選框,用戶可以從他們想要加載的系統列表中進行選擇。複選框的創建方式如下:無法訪問複選框屬性(客戶端VBScript)

'*************************************************************** 
' 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 each循環。無論哪種方式我都會得到同樣的錯誤這裏是發生了什麼:

現在我在我的數據庫中有兩個測試樣本,所以我得到兩件事我可以選擇。如果我選擇第一個項目並按下運行我的檢查腳本的按鈕,則會打印「檢查複選框」,並在我的頁面上顯示錯誤(權限被拒絕),表示我無法訪問檢查的屬性。它不打印「未選中」。如果我選擇我的第二個項目,不選中第一個項目,它會打印「未選中」,而不打印「已選中複選框」。

如果我選擇這兩個項目,它會打印「檢查複選框」一次,並給出相同的錯誤。

如果我不選擇任何一項打印「未檢查」ONCE(而不是每個未檢查項目一次),並且我得到相同的權限拒絕錯誤告訴我我無法訪問檢查的屬性。

在我開始測試選中的值之前,我嘗試打印每個複選框的值,但試圖訪問value屬性也給了我權限被拒絕。

奇怪的是,它似乎是「工作」的第一個元素(因爲它只會打印一個元素適當的消息),即使它仍然拋出權限被拒絕的錯誤。這導致我相信我要麼不正確地使用document.getElementsByName()(它是否返回一個數組?),要麼我沒有正確地迭代......或者其他一些超越我的神祕事物。

這是CLIENT-SIDE vbscript,不是ASP。 Javascript也不是一個選項;出於特定原因,我使用HTML的客戶端vbscript。不要因爲我使用它而告訴我這是愚蠢的,因爲我同意;我沒有選擇。

如何訪問和遍歷我的同名複選框(系統),並查看哪些被選中並獲取它們的值?

回答

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> 

我希望這回答了你的問題。

+0

太棒了!謝謝!我甚至沒有想到document.write會中斷其餘的代碼... – Lauren 2010-07-23 13:30:49