【问题标题】:Selecting options and filter values in select box jquery在选择框jquery中选择选项和过滤值
【发布时间】:2012-12-12 09:30:05
【问题描述】:

我的问题是当我在任何一个选择框中选择一个选项,然后在另一个选择框中选择另一个选项时,值会自动更改。我该如何解决这个问题。我想根据我的选择过滤值并在不使用插件的情况下将其显示在表格中。

Here is my code:

http://jsfiddle.net/pW6P6/4/

【问题讨论】:

  • 当您从任何选择框中更改选择时,您将重新加载所有选择框并重新过滤所有 g_Vehicle 列表。您想仅过滤当前选择而不重新加载先前(已选择)的选项。你应该重新考虑你的编码逻辑。
  • 我同意@roasted。在你的 fxnReLoading.... 你正在重新加载所有选择值
  • 不重新加载如何进行过滤??
  • 使用缓存系统,我的意思是一个对象数组作为 g_Vehicle,您将在每次选择更改时填充它并过滤抛出这个数组。如果年份选择(主要选择)发生变化,请从 g_Vehicle 重新加载原始列表并刷新所有选择框。
  • @Chinnu,我同意了。需要一些时间

标签: javascript jquery


【解决方案1】:

我将您的排序功能合并为一个功能。

即, fxnSelectYear、fxnSelectMake、fxnSelectModel、fxnSelectSubModel 到 fxnUpdateGrid

如果你能将你的 fxnReLoading.. 函数组合成一个会更好。

DEMO

希望这会有所帮助。随时问我问题。

【讨论】:

    【解决方案2】:

    哇哦,这么小任务的代码太多了...

    无论如何,在您的每个“更改功能”中,您都在重新加载其他过滤器选择。这就是重置选择框的原因

    例如:

    fxnSelectMake = function () {
        $('#tableID tr').remove();
        g_newRows = "";
        $.each(g_Vehicle, function (index) {
            if (g_Vehicle[index].Make == $('#DropDown_Make').val()) {
                fxnCreateRow(g_Vehicle, index);
            }
        });
        $('#tableID').append(g_newRows);
        fxnReLoadingModelFilters();         // <-- this is what i mean
        fxnReLoadingSubModelFilters();      // <-- and this
        fxnReLoadingYearFilters();          // <-- and this
    
    },
    

    但这只是第一部分。你的主要问题是这段代码:

    $.each(g_Vehicle, function (index) {
      if (g_Vehicle[index].Make == $('#DropDown_Make').val()) {
        fxnCreateRow(g_Vehicle, index);
      }
    });
    

    您的 g_Vehicle-Object 仍然是这里的 TOTAL 对象,您只是在检查当前选择的值(不是年份等)

    我编写了一个函数“isInIndex”,它检查所有 4 个当前选择的值,并且仅在当前车辆行对所有 4 个选择框都有效时才返回 true:

    isInIndex = function(vehicle) {
      return ($("#DropDown_Year").prop("selectedIndex") === 0 || vehicle.Year === $('#DropDown_Year').val()) &&
          ($("#DropDown_Make").prop("selectedIndex") === 0 || vehicle.Make === $('#DropDown_Make').val()) &&
          ($("#DropDown_Model").prop("selectedIndex") === 0 || vehicle.Model === $('#DropDown_Model').val()) &&
          ($("#DropDown_SubModel").prop("selectedIndex") === 0 || vehicle.SubModel === $('#DropDown_SubModel').val())
    }
    

    然后我在您的每个“更改函数”中调用此函数:

    $.each(g_Vehicle, function (index) {
      if (isInIndex(g_Vehicle[index])) {
        fxnCreateRow(g_Vehicle, index);
      }
    });
    

    这里更新和工作的小提琴:http://jsfiddle.net/pW6P6/10/

    编辑:您的代码中可能有很多优化可能性,其中之一是您应该将 jQuery-Objects 保存到变量中,并使用它们:

    例如:

    var $dropDownMake = $('#DropDown_Make');
    
    // and later
    $dropDownMake.val()
    

    【讨论】:

    • 感谢您的耐心等待。这里的选择框没有根据选项过滤。
    • 这是什么意思?期望的行为是什么?在我更新的小提琴中,表格正在根据所选值进行更新。例如。如果我选择 2012 年和子模型 d,则显示 2 行。如果我删除子模型过滤器(在子模型选择中选择第一个选项),则会显示 3 行(2012 年的所有条目)。试试小提琴吧:jsfiddle.net/pW6P6/10
    • 你说得对。表格正在更新,但选择框选项未更新。请检查一次。例如:如果我选择 2012 ,make 应该是 def, pqr,但它显示了所有选项。
    • 您的代码有点混乱。您应该准确定义所需的行为,然后丢弃此代码。选择此代码的一部分并在您的新代码中使用它。如果您不想使用插件,请将此代码放入插件中(您将在此处找到模式:github.com/addyosmani/jquery-plugin-patterns)。但显然您需要考虑您的代码必须做什么(例如,如果选择了一年,是否可以更改此选择?如果没有,您可以禁用此框。等等...
    【解决方案3】:

    如果你想保存你的逻辑。您可以在删除每个选项之前保存所选值,并在重新初始化您的选择值后选择它:

    http://jsfiddle.net/pW6P6/9/

    var selected = $('#DropDown_Year option:selected').val();
    $('#DropDown_Year option[value]').remove();
    iHtmlYear = fxnOptions(g_YearsArray);
    $('#DropDown_Year').append(iHtmlYear);
    $("#DropDown_Year option[value=" + selected + "]").attr("selected", true);
    

    【讨论】:

    • 我会保存选择的值,但是网格完全重新加载了,猜想@Chinnu 需要看一下
    • 我也想过滤相关的选项和表格。
    • 那么,为什么不使用像datatables.net 这样的插件。它会更快,可能更干净:D 就像这个例子一样:datatables.net/release-datatables/examples/api/…
    • 不使用插件我想完成这个。
    猜你喜欢
    • 2011-10-27
    • 2016-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-26
    相关资源
    最近更新 更多