事实证明,做到这一点的方法是通过操作 HTML 元素,而不是通过影响多选 ui 元素。我用这两行代码完成了它:
$(".selected li:contains('d')", $($('#mySelect').parent()[0])).insertAfter($(".selected li:contains('a')", $($('#mySelect').parent()[0])))
$("#mySelect option[value='d']").insertAfter($("#mySelect option[value='a']"))
当然,这种方法有一个明显的弱点,因为它会移动每个包含字母 d 的视觉元素并在每个包含字母 a 的视觉元素之后复制它,但修复它只是一个改变的问题我如何选择元素。整体方法在这里非常重要,现在我已经掌握了,剩下的就是蛋糕了。
编辑:这是我的最终代码:
var previtem = null;
var prevvalue = '';
$.each(values, function(i, item) {
var text = $("#mySelect option[value='"+item+"']").text();
$('#mySelect').multiselect("select", text);
$.each($('.selected li:contains('+text+')', $($('#mySelect').parent()[0])), function(i, item) {
if ($(item).text() == text) {
// We only move it if it's not the first one in
// By definition it won't be moved to the start, so this will always work
if (previtem != null) {
$(item).insertAfter(previtem);
}
previtem = $(item);
}
});
// Again, only move the option if it's not the first one in
if (prevvalue != '')
$("#mySelect option[value='"+item+"']").insertAfter($("#mySelect option[value='"+prevvalue+"']"));
prevvalue = item;
});