1

正确的。我在这里需要帮助。我有一个 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. 这部分工作得很好。但是 - 添加
< td onclick='msgbox(str2)' >零件后,它将无法正常工作。

我单击第一个单元格,我收到一条消息:"Line 1, 'str2' is not defined.".

我实际上想说的是
< td onClick='CellID Me') >CellID稍后在同一个脚本块中成为一个子。我这样做是msgbox为了解决问题。

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

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

非常感谢。

4

2 回答 2

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 中。

于 2013-05-28T13:35:26.610 回答
0

要完成这项MsgBox工作,您必须更改:

"<tr><td onclick=msgbox(str2)>" & rsData("P_Id") & ...

进入这个:

"<tr><td onclick='msgbox(""" & str2 & """)'>" & rsData("P_Id") & ...

但是,我已经告诉过你,代码

"<tr><td onclick='Cell Me'>" & rsData("P_Id") & ...

原则上起作用。我使用 HTA 验证了这一点,该 HTA 在按钮单击时从 CSV 创建表。

VB脚本:

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建议的那样,也可以使用createElementand创建表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
于 2013-05-28T21:19:58.593 回答