1

我有两个下拉菜单,因为更改第一个下拉菜单会触发一个 jquery change(),它会从第一个下拉菜单中发布带有公司 ID 的帖子。然后运行一个 sql 查询来获取为该公司工作的人员列表,并用选项填充选择框。这工作正常,我已将 sql 查询设置为 ORDER BY admin_name。但是当 jquery 开始将选项插入下拉列表时,它似乎是按选项值排序(admin_id)。我可以做些什么来保持按 admin_name(选项的文本)排序的选项。下面是负责添加选项的 jQuery 代码:

$.post("listSignedBy.php", { company_id: company_id },
                function(data) {
                        alert(data); <-- this shows that the data is sorted correctly by the admin name.
                        var select = $('#signed_by');
                        if(select.prop) {
                                  var options = select.prop('options');
                        }
                        else {
                                  var options = select.attr('options');
                        }
                        $('option', select).remove();

                        var obj = jQuery.parseJSON(data);
                                    options[options.length] = new Option('-- Select Signed By --', '');
                        $.each(obj, function(val, text) {
                                    options[options.length] = new Option(text, val);
                        });
                        select.val(selectedOption);

                });  

感谢您的任何帮助,如果您需要任何进一步的信息来帮助排除故障/修复,请告诉我。

根据要求,示例 JSON 数据:

{"19082":"Aaron Smith","19081":"Becky Doe"}

所以在这种情况下,我想要的是:

<option value='19082'>Aaron Smith</option>
<option value='19081'>Becky Doe</option>

但是不是按文本排序,而是按值排序,所以我得到:

<option value='19081'>Becky Doe</option>
<option value='19082'>Aaron Smith</option>
4

2 回答 2

1

对象未排序。它实际上是按照迭代的顺序插入的。

但是,如果返回响应的顺序不是所需的顺序,那么最好的方法是先插入选项并对选项进行排序。见下文,

演示:http: //jsfiddle.net/gGd82/3/

// convert OPTIONs NodeList to an Array
// - keep in mind that we're using the original OPTION objects
var ary = (function(nl) {
    var a = [];
    for (var i = 0, len = nl.length; i < len; i++) {
      a.push(nl.item(i));
    }
    return a;
})(options);
// sort OPTIONs Array
ary.sort(function(a, b) {
    return a.text < b.text ? -1 : a.text > b.text ? 1 : 0;    
});
// remove all OPTIONs from SELECT (don't worry, the original
// OPTION objects are still referenced in "ary") ;-)
options.length = 0;

// (re)add re-ordered OPTIONs to SELECT
select.html(ary);

select.prepend($('<option />').text('-- Select Signed By --').val(''));

参考: 使用 Javascript 对下拉列表进行排序

于 2012-09-24T16:05:30.230 回答
0

通过创建以下函数,然后在输入所有选项的 .each() 之后引用该函数,我能够使其工作:

function Sort(a, b) {    
                return (a.innerHTML > b.innerHTML) ? 1 : -1;
};

$.post("listSignedBy.php", { company_id: company_id },
                function(data) {
                        var select = $('#signed_by');
                        if(select.prop) {
                                  var options = select.prop('options');
                        }
                        else {
                                  var options = select.attr('options');
                        }
                        $('option', select).remove();

                        var obj = jQuery.parseJSON(data);
                                    options[options.length] = new Option('-- Select Signed By --', '');
                        $.each(obj, function(val, text) {
                                    options[options.length] = new Option(text, val);
                        });
                        $('#signed_by option').sort(Sort).appendTo('#signed_by');
                        select.val(selectedOption);

                }); 
于 2012-09-24T16:10:28.637 回答