代码之家  ›  专栏  ›  技术社区  ›  Max Kanat-Alexander

是否有任何快速方法可以使用JavaScript从<select>按值获取<option>?

  •  4
  • Max Kanat-Alexander  · 技术社区  · 17 年前

    我有一个<选择>。使用JavaScript,我需要获得一个特定的<选项>从选项列表中,我只知道选项的值。该选项可以选择,也可以不选择。

    这里有一个陷阱:有数千个选项,我需要在一个循环中执行几百次。现在我在“选项”数组中循环,寻找我想要的选项。这太慢了(从某种意义上说,在我非常快的机器上,浏览器一直锁定,直到几分钟后我将其关闭)。

    有没有更快的办法?我将采用特定于浏览器的方式,但当然,采用DOM标准方式会更好。

    8 回复  |  直到 17 年前
        1
  •  7
  •   Tomalak    17 年前

    我会这样做:

    // first, build a reverse lookup
    var optCount      = mySelect.options.length;
    var reverseLookup = {};
    for (var i = 0; i < optCount; i++)
    {
      var option = mySelect.options[i];
      if (!reverseLookup[option.value])
      {
        // use an array to account for multiple options with the same value
        reverseLookup[option.value] = [];
      }
      // store a reference to the DOM element
      reverseLookup[option.value].push(option);
    }
    
    // then, use it to find the option
    var foundOptions = reverseLookup["Value that you are looking for"];
    if (foundOptions && foundOptions.length)
    {
      alert(foundOptions[0].id);
    }
    
        2
  •  2
  •   Paul Whelan    17 年前

    我建议在你的选择中不要有成千上万的选项。

    也许你可以用不同的结构来构建你的数据,我认为有数千条条目的选择似乎是错误的。

    也许你的应用程序需要这样做,但这不是这个元素的典型用法。

        3
  •  1
  •   Mr. Muskrat    17 年前

    这是托马拉克的答案,只是稍微调整了一下速度。您可以看到向下迭代的while循环比向上迭代的for循环快。(我很懒,所以我不会提供链接。)

    var i = mySelect.options.length - 1;
    var reverseLookup = {};
    while ( i >= 0 )
    {
      var option = mySelect.options[i];
      if (!reverseLookup[option.value])
      {
        // use an array to account for multiple options with the same value
        reverseLookup[option.value] = [];
      }
      // store a reference to the DOM element
      reverseLookup[option.value].push(option);
      i--;
    }
    
    // then, use it to find the option
    var foundOptions = reverseLookup["Value that you are looking for"];
    if (foundOptions && foundOptions.length)
    {
      alert(foundOptions[0].id);
    }
    
        4
  •  0
  •   Nick Berardi    17 年前

    不,没有,你真的是在用最好的方法。您可以尝试更快地查找的另一件事是为每个选项提供一个ID标记,这样您就可以将它们作为DOM对象查找,而不是遍历DOM对象的子对象。

        5
  •  0
  •   Lasar    17 年前

    您可以一次遍历所有选项,并将所有项放入关联数组中。那你就去找吧 myOptions[valueImLookingFor] .

    我还没有测试过,不能保证它会更快/更好。但它应该摆脱所有这些循环。

    根据您的设置和需要,您还可以在客户端生成一个javascript数组,并将其放在标记中,而不是(或除此之外)选择。

        6
  •  0
  •   philistyne    17 年前

    我的建议是看一个框架/工具包,如 Dojo and its way of selecting DOM nodes .

    该工具包消除了浏览器的许多不一致性,并允许您快速、轻松地选择和操作DOM节点。

        7
  •  0
  •   John Lemp Chris Heald    17 年前

    我认为这可能是一个指标,表明在一个select中“数千”项可能不是最好的用户体验。也许你应该考虑将你的DROPUDE限制为几个,从而缩小用户选择的结果。

        8
  •  -1
  •   Davide Gualano    17 年前

    使用jQuery,类似这样的操作可能会更快:

    $("#idselect option[value='yourval']")
    

    http://docs.jquery.com/Selectors/attributeEquals#attributevalue