具有onclick故障的动态生成的HTML表的HTA

时间:2013-05-28 13:08:47

标签: vbscript onclick html-table hta

右。我需要帮助。我有一个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进行问题排查。

明确定义了{p> str2,所以我在这里明显遗漏了一些东西......

这里的任何帮助都会很棒,我会发疯...

非常感谢。

2 个答案:

答案 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建议,也可以使用createElementappendChild创建表格,例如像这样:

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