最近,我发布了问题 vbscript capture text in the HTML select option tag 。这对我在 Internet Explorer 平台上的帮助很大。但是,我有一个新项目,其网站稍微复杂一些。该网站有多个嵌套表,这些表的格式被设置为保存 form
元素。我和我的团队已经弄清楚如何在除下拉框(select
标记)之外的大多数元素中获取和设置数据。我们可以从下拉列表中获取文本,但无法更改该值。相反,所有选项都被清除,整个下拉列表为空白。
这是网站代码的修订版本,因为涉及更多代码,但仅显示相关代码:
<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>
为了能够从下拉列表中获取文本,在找到保存下拉列表的表中的节点后,我们使用了类
名称txt_input1
。此代码将为我们提供下拉列表中的整个列表:
objIE.Document.getElementsByTagName("table")(0).getElementsByTagName("td").Item(64).GetElementsByClassName("txt_input1")(0).innerText
我尝试使用以下代码将select
下拉列表的值从“--Select User--”更改为列表中的名称之一:
objIE.Document.getElementsByTagName("table")(0).getElementsByTagName("td").Item(64).GetElementsByClassName("txt_input1")(0).innerText = "卡尔·李斯特"
这导致了空白下拉菜单。如果我将结尾更改为 .Value
,它只会删除显示的“--Select User--”。它仍然不会将值更改为“Carl Lister”。在嵌套表的 select
下拉列表中选择选项
时,我们是否遗漏了一些东西?
最佳答案
对于 select
元素,更改显示值的最佳方法是“选择”菜单中的 option
元素之一。为此,您可以像这样更改代码:
objIE.Document.getElementsByTagName("table")(0).getElementsByTagName("td").Item(64).GetElementsByClassName("txt_input1")(0).childNodes(x).selected = true
上面的代码将选择索引 x
处的子节点(option
元素)并以编程方式选择它,以便该值将显示在 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 有点生疏,所以如果有任何语法错误,我深表歉意。)
关于html - Excel VBA 更改 HTML 选择标记中的选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45963540/