【问题标题】:Populate jquery select drop down form with multiple lists使用多个列表填充 jquery 选择下拉表单
【发布时间】:2013-08-07 02:53:59
【问题描述】:

我看过很多与我的情况有关的不同帖子,但我仍在学习服务器端和 js 代码,所以我只是不明白如何将其应用于我的问题。

我正在尝试构建一个订单表格来选择要进行丝网印刷的衬衫/服装。我还没有表格中的所有代码,因为我已经遇到了问题,但这里是基本标记:(请记住,我计划在最终选择中获得货币价值,以用于价格估算计算器在我弄清楚这部分之后,与表格中的其他部分一起。)

我不知道如何填充第三个和第四个下拉列表,我已经可以用我的 jquery 标记判断 if($(this).val() == "100% Polyester/100% Cotton") 等将开始重复。

HTML:

    `                <form>
                <select name="garment">
                    <option selected>Choose An Option</option>
                    <option>Short Sleeve T-Shirts</option>
                    <option>Hoodies/Sweatshirts</option>
                    <option>Long Sleeve T-Shirts</option>
                    <option>Tank Tops</option>
                    <option>Shorts &amp; Pants</option>
                    <option>Hats &amp; Accessories</option>
                </select>
                <select name="type">
                    <option selected disabled>Choose an Option</option>
                </select>
                <select name="style">
                    <option selected disabled>Choose an Option</option>
                </select>
                <select name="color">
                    <option selected disabled>Choose a Color</option>
                </select>
            </form>`

jquery:

     `$(document).ready(function() {

    $garment = $("select[name='garment']");
    $type = $("select[name='type']");
    $style = $("select[name='style']");

    $garment.change(function() {

    if($(this).val() == "Short Sleeve T-Shirts") {
        $("select[name='type'] option").remove();
        $("<option>100% Cotton</option>").appendTo($type);
        $("<option>Blended</option>").appendTo($type);
        $("<option>100% Polyester/Athletic</option>").appendTo($type);
    }
    if($(this).val() == "100% Cotton") {
        $("select[name='style'] option").remove();
        $("<option>Regular Fit</option>").appendTo($style);
        $("<option>Premium Slim/Fashion Fit</option>").appendTo($style);
        $("<option>Women's Cut</option>").appendTo($style);
    }
    if($(this).val() == "Blended") {
        $("select[name='style'] option").remove();
        $("<option>Regular Fit</option>").appendTo($style);
        $("<option>Premium Slim/Fashion Fit</option>").appendTo($style);
        $("<option>Women's Cut</option>").appendTo($style);
    }
    if($(this).val() == "100% Polyester/Athletic") {
        $("select[name='style'] option").remove();
        $("<option>Men's</option>").appendTo($style);
        $("<option>Women's</option>").appendTo($style);
    }

    });
    });`

【问题讨论】:

  • 无论是通过 jQuery 还是其他库,您是否习惯使用 ajax?
  • 你可以看看这个库。您似乎想要推出自己的分面搜索实现。这已经为您完成了所有设置:eikes.github.io/facetedsearch.
  • 以前没用过,从我在使用ajax的其他/类似帖子上读到的,我需要将变量数据放入数据库并从中提取?
  • 没有理由使用 ajax 来解决这个问题。事实上,这可能是个坏主意,特别是如果您每次都从服务器中提取下一个下拉列表的数据:下拉列表将不再立即响应。

标签: javascript jquery forms input html-select


【解决方案1】:

给你:

http://plnkr.co/edit/ETLLOaRFojk3wKoCODVg?p=preview

请注意,您只需要编辑linkedDropdowns 数组,其他一切都可以正常工作:

var linkedDropdowns = {
  "garment": {
    "Short Sleeve T-Shirts": ["100% Cotton", "Blended", "Polyester/Athletic"],
  },
  "type": {
    "100% Cotton": ["Regular Fit", "Premium Slim/Fashion Fit", "Women's Cut"],
    "Blended": ["Regular Fit", "Premium Slim/Fashion Fit", "Women's Cut"],
    "100% Polyester/Athletic": ["Men's", "Women's"]
  },
  "style": null 
};
$(function() {

    var dropdownNames = Object.keys(linkedDropdowns);

    dropdownNames.forEach( function(dropdownName) {

      var curIndex = dropdownNames.indexOf(dropdownName);
      if (curIndex === dropdownNames.length - 1)
        return;

      var curDropdown = $("select[name='" + dropdownName + "']");
      var nextDropdown = $("select[name='" + dropdownNames[curIndex+1] + "']");
      var nextOptions = linkedDropdowns[dropdownName];       

      curDropdown.change(function() {

          nextDropdown.find('option').remove().end();
          nextOptions[$(this).val()].forEach(function(curType) {
              $("<option>" + curType + "</option>").appendTo(nextDropdown);
          });
      });

    });
});

【讨论】:

  • 老兄……太棒了。非常感谢。但是有一个问题......当我到达最终选择时,我应该在哪里应用值?我需要有一个值才能应用到应用程序的下一部分。
  • 嘿,我编辑了帖子以进一步重构代码,现在您只需要编辑一个数组。至于你上面的问题,你能澄清一下吗?为什么不能只使用 jquery 读取最终下拉列表的值?
  • 有一个新问题问你,通过使用这种方法,我如何区分不同变量中的文本是否相同?即当有多个下拉菜单时“100% Cotton”var linkedDropdowns = { "garment": { "Short Sleeve T-Shirts": ["Regular Fit", "Premium Slim/Fashion Fit", "Women's Cut", "100% Polyester/Athletic"], }, "type": { "Regular Fit": ["100% Cotton", "Blends"], "Premium Slim/Fashion Fit": ["100% Cotton", "Blends", "V-Neck"], "Women's Cut": ["100% Cotton", "Blends"], "100% Polyester/Athletic": ["Men's", "Women's"], }, "style": null };
  • 两个选项:一个,您可以使用整个下拉列表序列,而不仅仅是最后一个的值,来唯一标识产品。我可能会选择这条路线。另一个选项是指定每个下拉列表的“值”字段与其“文本”(我们现在拥有的和用户看到的)分开。这将允许您指定产品 ID 或其他唯一标识符。支持这一点需要对当前代码进行一些更改。
  • 第一个选项的标记是什么样的?我确实需要给最终选择一个隐藏的价格值,我可以将它放入一个函数中来计算订单的价格。例如,在有人挑选了 Hanes V 领后,需要将价格乘以 X 的尺寸/数量部分中的文本输入,再加上一些其他输入。
【解决方案2】:

如果我理解正确,您似乎需要关系数据。而不是列表使用文件。

例如

{
  "type":"Short Sleeve T-Shirts",
  "subtypes":[
    "100% Cotton",
    "100% Polyester/Athletic",
    "Blended"
  ],
  "colors":[
    "Blue",
    "Black",
    "Red"
  ]
}

或者如果信息是嵌套的

{
  "type": "Short Sleeve T-Shirts",
  "subtypes":
  [
    {
      "name":"100% Cotton",
      "colors":[
        "Blue",
        "Black",
        "Red"
      ]
    },
    {
      "name":"100% Polyester/Athletic",
      "colors":[
        "Purple",
        "Green",
        "Orange"
      ]
    }
  ]

}

我不知道您在使用 jquery 时是否受到限制,但这会让人头疼。

您是否考虑过使用像 angular 这样的 MV* 框架?

【讨论】:

  • 如果您要投反对票,请说明理由。否则我不知道你为什么不给我投票。
  • 我愿意接受所有建议。 angular.js 有什么好处?我以前从未使用过。
  • angularjs 是一个 MV* 框架,可以将 js 数据绑定到 html。 Angular 是一种流行的解决方案,我非常喜欢它。这是基本概念视频youtube 在该视频中,他首先向您展示 jquery,然后更改为 angular 以向您展示它们的比较方式。他们的主页上有基本的例子angularjs.org
  • 欣赏,我去看看。如果我遇到困难会回帖。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-06
  • 2018-10-05
  • 2015-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多