添加选项以选择框而不用Internet Explorer关闭框吗?

时间:2020-03-06 14:31:27  来源:igfitidea点击:

我正在尝试构建一个带有多个下拉选择框的网页,这些下拉选择框在首次打开时会异步加载其选项。这在Firefox下效果很好,但在Internet Explorer下效果不好。

下面是我要实现的一个小示例。基本上,有一个选择框(ID为" selectBox"),其中仅包含一个选项(" Any")。然后,有一个onmousedown处理程序,在单击该框时会加载其他选项。

<html>
 <head>
  <script type="text/javascript">
    function appendOption(select,option) {
      try {
        selectBox.add(option,null); // Standards compliant.
      } catch (e) {
        selectBox.add(option);      // IE only version.
      }
    }

    function loadOptions() {
      // Simulate an AJAX request that will call the
      // loadOptionsCallback function after 500ms.
      setTimeout(loadOptionsCallback,500);
    }

    function loadOptionsCallback() {
      var selectBox = document.getElementById('selectBox');
      var option = document.createElement('option');
      option.text = 'new option';
      appendOption(selectBox,option);
    }
  </script>
 </head>
 <body>
  <select id="selectBox" onmousedown="loadOptions();">
   <option>Any</option>
  </select>
 </body>
</html>

所需的行为(Firefox会这样做)是:

  • 用户会看到一个封闭的选择框,其中包含"任何"。
  • 用户单击选择框。
  • 选择框将打开以显示一个唯一的选项("任何")。
  • 500毫秒后(或者AJAX调用返回时),下拉列表将扩展为包括新选项(在此示例中,硬编码为"新选项")。

这就是Firefox所做的,这很棒。但是,在Internet Explorer中,只要在" 4"中添加了新选项,浏览器就会关闭选择框。选择框确实包含正确的选项,但是该框已关闭,要求用户单击以重新打开它。

那么,有人对我如何在不关闭IE下拉框的情况下异步加载选择控件的选项有任何建议吗?

我知道我可以在单击框之前加载列表,但是我正在开发的实际表单包含许多此类选择框,它们相互关联,因此如果我可以加载,这对客户端和服务器都会更好每组选项仅在需要时使用。

另外,如果结果是同步加载的,则在选择框的onmousedown处理程序完成之前,IE将按预期显示完整列表,但是,同步加载在这里是个坏主意,因为它会在网络请求被完全锁定时完全"锁定"浏览器。发生。

最后,我还尝试了在添加新选项后使用IE的click()方法打开选择框,但是不会重新打开选择框。

任何想法或者建议,将不胜感激! :)

谢谢!

保罗

解决方案

我们是否考虑过在表单上其他相关字段之一的onblur事件中调用loadOptions方法?这将在单击列表之前将列表加载到下拉框中,但是行为仍应相似。

我认为我们将探索稍微不同的选项来获取所需的内容,因为如果我们使用onmousedown或者onclick事件,则Internet Explorer可能会关闭该下拉列表。使用这些事件的另一个缺点是,如果用户使用键盘选择字段,则可能永远不会调用方法。

我建议加载不依赖页面加载中其他选择框的选择内容。然后,在那些选择的onchange事件中,加载依赖于它们的其余选择的内容。

从编程的角度来看,想法是合理的,但是我们会在单击选择和填充所有选项(从用户的角度看似乎很草率)之间得到一定的滞后。

我找到了解决方案,问题似乎出在IE的onclick,hover,mouseover等实现上。将项目添加到下拉列表后,下拉列表关闭。如果我们没有在select属性中提供方法,请让jquery在运行时添加功能。

$(function() {
    jQuery(".selectBox").live("focus", function() {
       loadOptions();
     });
});

整个页面:

<html>
<head>
    <script src="jquery-latest.js" type="text/javascript"/>
</head>
<body>
    <select id="selectBox" onmousedown="loadOptions();">
        <option>Any</option>
    </select>
    <script type="text/javascript">
        $(function() {
            jQuery(".selectBox").live("focus", function() {
                loadOptions();
            });
        });
        function appendOption(select, option) {
            try {
                selectBox.add(option, null); // Standards compliant.
            } catch (e) {
                selectBox.add(option);      // IE only version.
            }
        }

        function loadOptions() {
            // Simulate an AJAX request that will call the
            // loadOptionsCallback function after 500ms.
            setTimeout(loadOptionsCallback, 500);
        }

        function loadOptionsCallback() {
            var selectBox = document.getElementById('selectBox');
            var option = document.createElement('option');
            option.text = 'new option';
            appendOption(selectBox, option);
        }
    </script>
</body>