Javascript HTML选项标记值属性在IE9中使用web浏览器控件返回“未定义”

Javascript HTML选项标记值属性在IE9中使用web浏览器控件返回“未定义”,javascript,excel,winforms,webbrowser-control,internet-explorer-9,Javascript,Excel,Winforms,Webbrowser Control,Internet Explorer 9,下面是我使用WebBrowser控件导航的网页上的javascript函数。我有两个列表框,中间有一个“添加”按钮。我在左侧列表框中选择多个项目,然后点击Add按钮,这样这些项目就会被复制到右侧列表框中。Add按钮调用的javascript函数如下所示 问题:当我在WebBrowser控件上导航页面时,版本无关紧要,我看到以下问题: selList.options[j].value returns “undefined” . selList.options[j].text does retu

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

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

selList.options[j].value returns “undefined” . 

selList.options[j].text does return the correct text for the OPTION element.
所选选项的预期值应该类似于11187 | 1。它只是查找OPTION html元素的value属性。请注意,selList.options[j].selected还返回有效的“true”或“false”值

这在IE6、IE7或IE8中不会发生。 这在IE 9浏览器中不会发生。 只有在使用IE9的计算机上,在Excel VBA中对表单使用WebBrowser控件时,才会发生这种情况。 奇怪的是,在.NET应用程序&IE9中使用webbrowser控件时,这种情况并没有发生。 它似乎仅限于使用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(",");
}
///////////////////////////////////////////////////////////////

    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(",");
}
-源选择列表的选择标记示例-

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

这是一个大大简化的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工作原理:在IE9.0中启动test.html。使用鼠标选择左侧列表框中的所有4项,然后单击“添加”

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

Via应用程序不工作:启动Excel。单击命令按钮。这将在webbrowser控件中加载页面。使用鼠标选择左侧框中的所有4项。您将获得一个计数,但这次,该值将显示“undefined”


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

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

    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 web浏览器和从Excel打开的IE web浏览器实例之间的不同行为造成的。不同的接口用于相同的HTML选项元素DispHTMLWndOptionElement和DispHTMLOptionElement。

我在VB.Net Word加载项中遇到了与webbrowsercontrol相同的问题。在带有IE9的Citrix服务器W2K8 R2上,Ajax回发上未定义DropDownList的值。但是,同一个控件在同一服务器上的Outlook加载项中以及在正常的IE9浏览器窗口中运行良好。在浪费时间检查代码、搜索web之后,我发现有一个注册表项修复了我们的问题:

[HKEY\u LOCAL\u MACHINE\SOFTWARE\Wow6432Node\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE\u USE\u WINDOWEDSELECTCONTROL]

此键的值为winword.exe=dword:00000001,而Outlook.exe在该键中不可用。因此,将该值设置为winword.exe=dword:00000000后,一切正常

另见:

如何调用getSelectionString函数?它是由另一个javascript函数调用的,该函数在单击页面上的“添加”按钮时被调用。此函数遍历所有选项,查看选择了哪些选项,创建一个“,”分隔的选项值属性字符串,如44725 | 111187 | 1,并返回它。所有这些都可以在IE浏览器上正常工作。但当我通过Excel VBA使用WebBrowser控件时,此函数会将所选选项的值属性视为未定义,因此只返回,。