【问题标题】:How to re-order the value of a multiple select based on user selection order如何根据用户选择顺序重新排序多选的值
【发布时间】:2016-04-06 05:33:57
【问题描述】:

如何根据用户选择选项的顺序而不是 html 中选项的顺序对 select multiple 元素的逗号分隔值重新排序?

例如:

<select multiple>
    <option>1</option>
    <option>2</option>
    <option>3</option>
</select>

...如果用户选择“3”,然后选择“1”,然后选择“2”,则选择的返回值将是“1,2,3”。我怎样才能让它返回“3,1,2”?

注意,我使用的是 jQuery 和 HTML5,所以如果需要,我可以使用这些工具。

谢谢!

【问题讨论】:

  • jsfiddle.net/nbh72tc5你能试试这个吗?
  • @SamTengWong 谢谢,您的示例显示了默认设置。如果选择 3,然后选择 1,然后选择 2,它会提示“1,2,3”。我需要一些将值提示为“3,1,2”的函数,因为这是我选择选项的顺序。
  • @rajesh 是的,在我提出问题之前,我看到了那篇帖子。该问题只是要求返回值 onchange 但该海报不关心选择顺序。
  • 您必须遵循这种方式才能按照您选择的顺序获取值。默认情况下,它总是按从上到下的顺序为您提供。所以你可以做的是在更改事件上你可以将值存储在一个数组中。

标签: javascript jquery html


【解决方案1】:

这会记录每个元素的点击添加并将其保存到一个数组中。当一个项目被取消选择时,它会从数组中移除。

var vals = [];
$(document).ready(function(e) {
  $('#selector').change(function(e) {
    for(var i=0; i <$('#selector option').length; i++) {
      if ($($('#selector option')[i]).prop('selected') ) {
        if (!vals.includes(i)) {
          vals.push(i);
        }
      } else {
        if (vals.includes(i)) {
          vals.splice(vals.indexOf(i), 1);
        }
      }
    }

  })

  $("#final").click(function(e) {
    var order = '';
    vals.forEach(function(ele) {
      order += $($('#selector option')[ele]).val() + ',';
    })

    console.log(order);
  })
})

Codepen:http://codepen.io/nobrien/pen/pydQjZ

【讨论】:

  • 注意。你不需要if (vals.includes(i)) 条件,但是因为我们到达else 块的事实已经意味着vals.includes(i) 是真的。没有错,只是多余的,namean?
【解决方案2】:

提出的解决方案都没有让我满意,所以我想出了这个:

我的解决方案是向多选元素 data-sorted-values 添加一个 html5 属性,我会在其中添加新值,并根据最新更改删除未选择的值。

最终的效果是可以随时查询data-sorted-values,得到当前用户排序值的列表。此外,所有选定的选项都具有“选定”属性。

我希望这可以帮助其他人......

https://jsfiddle.net/p1xelarchitect/3c5qt4a1/

HTML:

<select onChange="update(this)" data-sorted-values="" multiple>
    <option>A</option>
    <option>B</option>
    <option>C</option> 
</select>

Javasript:

function update(menu) {

    // nothing selected
    if ($(menu).val() == null) 
    {
        $.each($(menu).find('option'), function(i) 
        {
            $(this).removeAttr('selected');
            $(menu).attr('data-sorted-values', '');
        });
    } 
    // at least 1 item selected
    else 
    {
        $.each($(menu).find('option'), function(i) 
        {
            var vals = $(menu).val().join(' ');
            var opt = $(this).text();

            if (vals.indexOf(opt) > -1) 
            {
                // most recent selection
                if ($(this).attr('selected') != 'selected') 
                {
                    $(menu).attr('data-sorted-values', $(menu).attr('data-sorted-values') + $(this).text() + ' ');
                    $(this).attr('selected', 'selected');
                }
            } 
            else 
            {
                // most recent deletion
                if ($(this).attr('selected') == 'selected') 
                {
                    var string = $(menu).attr('data-sorted-values').replace(new RegExp(opt, 'g'), '');
                    $(menu).attr('data-sorted-values', string);
                    $(this).removeAttr('selected');
                }
            }
        });
    }
}

【讨论】:

    【解决方案3】:

    试试这个https://jsfiddle.net/ksojitra00023/76Luf1zs/

      <select multiple>
            <option>1</option>
            <option>2</option>
            <option>3</option>
        </select>
        <div id="output"></div>
    
    $('select').click(function(){
      $("#output").append($(this).val());
    });
    

    【讨论】:

      【解决方案4】:
      var data = '3,1,2';
      var dataarray=data.split(",");
      var length =dataarray.length;
      for(i=0;i<length;i++){
          // Set the value
          $('#select').multiSelect('select',dataarray[i]);
      }
      

      【讨论】:

      • 请添加描述并说明这将如何解决问题
      • 虽然此代码可以解决 OP 的问题,但最好包含关于您的代码如何解决 OP 问题的说明。这样,未来的访问者可以从您的帖子中学习,并将其应用到他们自己的代码中。 SO 不是编码服务,而是知识资源。此外,高质量、完整的答案更有可能获得支持。这些功能,以及所有帖子都是独立的要求,是 SO 作为一个平台的一些优势,使其与论坛区分开来。您可以编辑以添加其他信息和/或使用源文档补充您的解释
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-10
      • 1970-01-01
      • 1970-01-01
      • 2023-01-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多