右。我需要帮助。我有一个HTA,它运行完全正常。直到我对我的代码执行以下操作。我正在使用VBScript。代码如下:
<Script language="vbscript">
Sub DisplayDB_Click
Dim conn, str1, str2
str2 = "Hello"
MainTitle.InnerHTML = "<h2>Main Call Queue</h2>"
Set conn = CreateObject("ADODB.Connection")
conn.Open "DSN=LongbowLogin"
Set rsData = conn.Execute("SELECT * FROM MainTable WHERE CallStat='Open' ORDER BY P_ID DESC;")
str1 = "<table border=1 cellpadding=5><tr><th>Call Id</th><th>Full Name</th><th>Postcode</th><th>Site Code</th><th>Problem Title</th><th>Category</th><th>SubCategory</th><th>Call Status</th></tr>"
Do Until rsData.EOF = True
str1 = str1 & "<tr><td onclick=msgbox(str2)>" & rsData("P_Id") & "</td><td>" & rsData("FirstN") & "</td><td>" & rsData("PostCode") & "</td><td>" & rsData("SiteNumber") & "</td><td>" & rsData("PTitle") & "</td><td>" & rsData("PCat") & "</td><td>" & rsData("SCat") & "</td><td>" & rsData("CallStat") & "</td></tr>"
rsData.moveNext
Loop
str1 = str1 & "</table>"
MainDisplay.InnerHTML = str1
conn.Close
Call CheckState
End Sub
此代码从SQL Select语句中生成HTML表,并将其放在MainDisplay
下名为InnerHTML
的Span标记中。这部分工作得很漂亮。但是 - 我添加了
< td onclick='msgbox(str2)' >
部分,它不起作用。
我点击第一个单元格,然后收到一条消息:"Line 1, 'str2' is not defined."
。
我其实想要说出来
< td onClick='CellID Me') >
,CellID
后来在同一个脚本块中。我正在执行此操作msgbox
进行问题排查。
str2
,所以我在这里明显遗漏了一些东西......
这里的任何帮助都会很棒,我会发疯...
非常感谢。
答案 0 :(得分:1)
VBScript没有变量插值:
>> Dim str2 : str2 = "I'm str2 and this is my content"
>> Dim sRes : sRes = "<td onclick=MsgBox str2></td>"
>> WScript.Echo sRes
>>
<td onclick=MsgBox str2></td>
您必须将内容拼接到结果中 - 并遵循VBScript关于括号和引号的规则:
>> Dim str2 : str2 = "I'm str2 and this is my content"
>> Dim sRes : sRes = "<td onclick='MsgBox """ & str2 & """'></td>"
>> WScript.Echo sRes
>>
<td onclick='MsgBox "I'm str2 and this is my content"'></td>
这解释了您的直接问题。您的真实世界任务 - 将onclick事件处理程序附加到所有TD - 通过使用DOM(.createElement,appendChild)创建表比通过尝试将字符串连接驯服为.innerHTML更好地解决。
答案 1 :(得分:0)
要使MsgBox
工作,您必须更改此内容:
"<tr><td onclick=msgbox(str2)>" & rsData("P_Id") & ...
进入这个:
"<tr><td onclick='msgbox(""" & str2 & """)'>" & rsData("P_Id") & ...
但是,我已经told you代码
了"<tr><td onclick='Cell Me'>" & rsData("P_Id") & ...
原则上有效。我通过HTA验证了这一点,通过按钮单击从CSV创建表格。
<强>的VBScript:强>
Sub DisplayDB_Click
Set conn = CreateObject("ADODB.Connection")
conn.Open "Driver={Microsoft Text Driver (*.txt; *.csv)};" & _
& "Dbq=c:\Temp;Extensions=asc,csv,tab,txt;"
Set rsData = conn.Execute("SELECT * FROM sample.csv;")
str1 = "<table border=1 cellpadding=5><tr>"
For Each field In rsData.Fields
str1 = str1 & "<th>" & field.Name & "</th>"
Next
str1 = str1 & "</tr>"
Do Until rsData.EOF
str1 = str1 & "<tr>"
For Each field In rsData.Fields
str1 = str1 & "<td onclick='Cell Me'>" & field.Value & "</td>"
Next
str1 = str1 & "<tr>"
rsData.moveNext
Loop
str1 = str1 & "</table>"
MainDisplay.InnerHTML = str1
conn.Close
End Sub
Sub Cell(obj)
MsgBox obj.innerHtml
End Sub
<强> HTML:强>
<p><input type="button" onClick="DisplayDB_Click" value="Show Table"/></p>
<div id="MainDisplay"></div>
如果此代码不适合您,则问题出在HTA的其他位置。
根据Ekkehard.Horner建议,也可以使用createElement
和appendChild
创建表格,例如像这样:
Sub Cell
MsgBox Me.innerHtml
End Sub
Function NewField(text, isHeader)
If isHeader Then
Set e = document.createElement("th")
Else
Set e = document.createElement("td")
End If
e.AppendChild document.createTextNode(text)
e.onClick = GetRef("Cell")
Set NewField = e
End Function
Function NewRow(values, isHeader)
Set r = document.createElement("tr")
For Each v In values
r.appendChild NewField(v, isHeader)
Next
Set NewRow = r
End Function
Sub DisplayDB_Click
...
lastCol = rsData.Fields.Count-1
Dim cols
ReDim cols(lastCol)
For i = 0 To lastCol
cols(i) = rsData.Fields(i).Name
Next
Set thead = document.createElement("thead")
thead.appendChild NewRow(cols, True)
Set tbody = document.createElement("tbody")
Do Until rsData.EOF
For i = 0 To LastCol
cols(i) = rsData.Fields(i).Value
Next
tbody.appendChild NewRow(cols, False)
rsData.MoveNext
Loop
Set table = document.createElement("table")
table.appendChild thead
table.appendChild tbody
document.getElementById("parent").appendChild table
...
End Sub