最近,我发布了问题vbscript capture text in the HTML select option tag。这对我在Internet Explorer平台上的帮助很大。但是,我有一个新项目,网站有点复杂。该网站有多个嵌套表格,其格式设置为容纳$(document).ready(function(){
$('#device_select').change(updateURL);
$('#face_select').change(updateURL);
$('#position_select').change(updateURL);
});
个元素。我和我的团队已经找到了如何在大多数元素中获取和设置数据,除了下拉框(function listenForChanges(){
$('#device_select').change(updateURL);
$('#face_select').change(updateURL);
$('#position_select').change(updateURL);
}
标记)。我们可以从下拉列表中获取文本,但我们无法更改该值。相反,所有选项都被清除,整个下拉列表都是空白的。
这里是网站代码的修订版,因为涉及的代码要多得多,但只显示了相关的代码:
document.ready
为了能够从下拉列表中获取文本,我们在查找包含下拉列表的表中的节点后使用$(document).ready(listenForChanges);
名称form
。此代码将为我们提供下拉列表中的完整列表:
select
我已尝试更改" { - 1}}下拉菜单的值 - 选择用户 - "使用以下代码到列表中的一个名称:
<html xmlns="http://www.w3.org/1999/xhtml">
<head>...</head>
<body>
<form id="form1" action="AssignOFS.aspx" method="post">
<div class="aspNetHidden">...</div>
<div class="aspNetHidden">...</div>
<table width="100%" align="center" cellspacing="0">
<tbody>
<tr>
<td>
<table width="100%" align="center" cellspacing="0">...</table>
</td>
</tr>
<tr>
<td>
<table width="100%" align="center" cellspacing="0">
<tbody>
<tr>...</tr>
<tr>...</tr>
<tr class="tr_data">...</tr>
<tr>
<td align="center">
<div id="pnlBtn1">...</div>
<div id="pnlView">
<table width="100%" align="center" cellspacing="0">
<tbody>
<tr>...</tr>
<tr>...</tr>
<tr class="tr_data">
<td align="center">...</td>
<td valign="top">...</td>
<td valign="top">...</td>
<td valign="top">...</td>
<td nowrap="" valign="top">...</td>
<td align="left">...</td>
<td align="center">...</td>
<td align="center">
<select name="user" class="txt_input1" id="user" onchange="javascript:addUser(227);">
<option value="">--Select User--</option>
<option value="0123">Amy Jones (000456321)</option>
<option value="0432">Brian Wyatt (000745632)</option>
<option value="0345">Carl Lister (000874563)</option>
<option value="0654">Daniel Michaels (000987456)</option>
<option value="0567">Elizabeth Sweeny (001456321)</option>
<option value="0876">Fran Tarris (001745632)</option>
<option value="0789">Gail McMurphy (001874563)</option>
<option value="1098">Hannah Barisce (001987456)</option>
</select>
</td>
</tr>
</tbody>
</table
</div>
</td>
</tr>
</tbody>
</table>
</td>
</tr>
</tbody>
</table>
</form>
</body>
</html>
这导致空白下拉。如果我将结尾更改为class
,则只删除&#34; - 选择用户 - &#34;从被显示。它仍然没有将价值改为&#34; Carl Lister&#34;。在嵌套表格中txt_input1
下拉列表中选择objIE.Document.getElementsByTagName("table")(0).getElementsByTagName("td").Item(64).GetElementsByClassName("txt_input1")(0).innerText
时,我们是否会遗漏某些内容?
答案 0 :(得分:2)
对于select
元素,更改显示值的最佳方法是&#34;选择&#34;其中一个option
元素是菜单的一部分。为此,您可以像这样更改代码:
objIE.Document.getElementsByTagName("table")(0).getElementsByTagName("td").Item(64).GetElementsByClassName("txt_input1")(0).childNodes(x).selected = true
上面的代码将在索引option
处选择子节点(x
元素)并以编程方式选择它,以便该值将显示在select
元素中。选项的索引从0开始,因此x = 0
选择第一个选项(在本例中为Amy Jones
)。
您还可以将上述代码简化为:
objIE.Document.getElementsByClassName("txt_input1")(0).childNodes(x).selected = true
或者您甚至可以id
执行此操作,因为您已为该菜单分配了ID:
objIE.Document.getElementById("user").childNodes(x).selected = true
如果您想从下拉列表中选择员工姓名,您可以遍历现有选项并找到正确的选项(代码改编自this question中的VBA代码):
Dim el As IXMLDOMNode
Dim childNode As IXMLDOMNode
el = objIE.Document.getElementById("user")
For Each childNode in el.ChildNodes
If InStr(childNode.innerText, emplName) Then
childNode.selected = true
Exit For
End If
Next childNode
在此示例中,emplName
是您要选择的员工。
(我的VBA有点生疏,所以如果任何语法都关闭,我会道歉。)
答案 1 :(得分:2)
谢谢@freginold,感谢您的帮助。我和我的团队提出了一个解决方案,扩展了我们已经开发的解决方案。
tdNode = 64
i = 0
For Each objOption In objIE.Document.GetElementsByTagName("table")(0).GetElementsByTagName("td")(tdNode).GetElementsByClassName("txt_input1")(0).Options
Q(i) = objOption.Text & "-" & objOption.Value
QNm = QNm & "|" & Q(i)
i = i + 1
If objOption.Selected Then
strWQ = objOption.Text
End If
If i > 53 Then
MsgBox "stuck"
SetEverythingToNothing
End If
Next
QNm = QNm & "|=" & strWQ
a = 1
MyArray = Split(QNm, "|")
For a = LBound(MyArray) To UBound(MyArray)
If InStr(MyArray(a), UserName) Then
strWQ = MyArray(a)
End If
Next
SelQ = Mid(strWQ, InStr(strWQ, "-") + 1, Len(strWQ) - InStr(strWQ, "-"))
For Each objOption In objIE.Document.GetElementsByTagName("table")(0).GetElementsByTagName("td")(tdNode).GetElementsByClassName("txt_input1")(0).Options
If objOption.Value = SelQ Then
objOption.Selected = True
objIE.Document.GetElementsByTagName("table")(0).GetElementsByTagName("td")(tdNode).GetElementsByClassName("txt_input1")(0).OnChange
Else
objOption.Selected = False
End If
Next