在IE9中,HTML选项标签值属性返回" undefined "

HTML Option tag value property returns “undefined” with web-browser control in IE9

本文关键字:属性 返回 标签 undefined 选项 IE9 HTML      更新时间:2023-09-26

下面是一个使用WebBrowser控件进行导航的网页上的javascript函数。我有两个列表框和一个"添加"按钮之间。我在左侧列表框中选择多个项目,然后点击添加按钮,这样这些项目就会被复制到右侧列表框中。Add按钮调用的javascript函数如下所示:

问题:当我在WebBrowser控件上浏览页面时(版本无关紧要),我看到以下问题:

selList.options[j].value returns “undefined” . 
selList.options[j].text does return the correct text for the OPTION element.

所选OPTION的期望值应该类似于"11187|1"。(它只是寻找选项html元素的值属性)。注意selList.options[j]。Selected还返回有效的"true"或"false"值。

这在ie6, IE7或IE8中不会发生。这在IE 9浏览器中不会发生。这只发生在使用WebBrowser控件从Excel (VBA)与IE9的机器上的表单。奇怪的是,当在。net应用程序中使用web浏览器控件时,这不会发生。IE9。它似乎仅限于在Excel中使用控件。

//////////////////////////////////////////////////

    function getSelectionString(selList) 
    {
      var aSelections = new Array();
      var listLength = selList.options.length;
      //alert("list Length "+listLength);
      for(var j=0; j < listLength; j++)
      {
            if(selList.options[j].selected) 
            {
                 var sItem = selList.options[j].value; //sItem returns “undefined” !!!
                  aSelections.push(sItem);
            }
  }
  return aSelections.join(",");
}

///////////////////////////////////////////////////////////////

——SAMPLE of select tag for source select list -

<select name=”srcList”>
<option value='44725|1'>1st Auto & Cas Ins Co (44725-P)</option>
<option value='10750|1'>1st Choice Auto Ins Co (10750-P)</option>
<option value='35700|1'>2 10 Home Buyers Warranty of VA (35700-P)</option>
<option value='11187|1'>2-10 Hbw of NV Inc (11187-P)</option>
</select>

我在VB中的webbrowsercontrol中遇到了同样的问题。Net Word插件。在使用IE9的Citrix服务器(W2K8 R2)上,下拉列表的值在(Ajax)回发时是未定义的。但是,同样的控件在同一台服务器上的Outlook插件和正常的IE9浏览器窗口中都可以正常工作。在浪费时间检查代码,搜索网页后,我发现有一个注册表项可以解决我们的问题:

[HKEY_LOCAL_MACHINE'SOFTWARE'Wow6432Node'Microsoft'Internet Explorer'MAIN'FeatureControl'FEATURE_USE_WINDOWEDSELECTCONTROL]

此键具有此值"winword.exe"=dword:00000001,并且该键中没有Outlook.exe。因此,在将值设置为"winword.exe"=dword:00000000之后,一切正常。

参见:http://support.microsoft.com/kb/927377

这是经过极大简化的html文件。请另存为test.html

<html>
<script>
    function submitClick(form) {
      var aSelections = new Array();
      var selectionList = form.selectionList;
      var listLength = selectionList.options.length;
      alert("list Length "+listLength);
      for(var j=0; j < listLength; j++){
            //alert("got ["+j+"] "+selectionList.options[j].value);
            if(selectionList.options[j].selected) {
                alert("got Selected["+j+"] - value is - "+selectionList.options[j].value);
                var sItem = selectionList.options[j].value;
                aSelections.push(sItem);
           }
        }
        aSelections.join(",");
        alert("Selected values "+aSelections);
        return false;
    }
</script>
<form name="selectForm">
<table>
    <tr>
        <td><select name="selectionList" size="12" style="width:390" styleClass="companySelection" multiple="true">
<option value='44725|1'>1st Auto & Cas Ins Co (44725-P)</option>
<option value='10750|1'>1st Choice Auto Ins Co (10750-P)</option>
<option value='35700|1'>2 10 Home Buyers Warranty of VA (35700-P)</option>
<option value='11187|1'>2-10 Hbw of NV Inc (11187-P)</option>
</select><br>
</td><td>
<input class=insButton type="button"  value="Add >"
         onClick="submitClick(this.form)" />
</td><td>
</td>
<br>
</form>
</html>

设置:

在使用IE9的机器上,在Excel中(版本无关),放下ActiveX命令按钮。

删除浏览器控件

在commandbutton1的回调中,调用以下代码:

Private Sub CommandButton1_Click()
     WebBrowser1.Navigate ("C:'temp'test.html")
 End Sub

复制:

ie9 (works):在ie9.0中启动test.html。使用鼠标选择左侧列表框中的所有4个项目,然后单击"添加"。

您将获得一个计数,并将显示所有值。

Via App(不工作):启动Excel。单击命令按钮。这将在web浏览器控件中加载页面。使用鼠标选择左侧框中的所有4个项目。您将得到一个计数,但这一次,值将显示为" undefined "

答案吗?有人知道为什么会这样吗?

我以前也遇到过同样的问题。不幸的是,我在互联网上没有找到关于这个问题的任何东西。无论如何,我做了一个变通。它是神奇的,因为value本身是未定义的,但可以从属性集合中获得。如果适合您,请使用以下解决方案。

    function getOptionValue(opt) {
           var val;
           if (opt) {
                  if (typeof (opt.value) == "undefined") {
                         if (opt.attributes && opt.attributes["value"]) {
                               val = opt.attributes["value"].value;
                         }
                  }
                  else
                         val = opt.value;
           }
           return val;
    }

我认为这是由于IE浏览器和从Excel打开的IE浏览器实例的行为不同造成的。不同的接口用于相同的HTML选项元素(DispHTMLWndOptionElementDispHTMLOptionElement)。