我有一个允许多选的项目列表框。 我正在尝试选择最新的最新项目,而不是订单值,而是用户最后选择的项目。
如果我尝试打印.val()
,我会得到所选值的列表,但我想要最新的(val()中的最后一个)。
我尝试使用:last
,如此:
$("#MainContent_lbTeams option:selected:last").val();
但是最后一次是按照ID从上升到下降的顺序工作,当有人选择一个值时,它不能正常工作。
例如,如果我有一个包含4个项目的列表框。如果我按升序选择它们,我上面发布的内容正确打印。但是如果我点击第1个,那么第4个,然后回到第2个我上面发布的第4个项目(即使我最近选择了第2个项目)。
//when a team is selected
//tell the user what this does to the record
$("#MainContent_lbTeams").on('change', function () {
//was a value selected?
var latest_value = $("#MainContent_lbTeams option:selected:last").val();
var latest_text = $("#MainContent_lbTeams option:selected:last").text();
alert(latest_value);
alert(latest_text);
if ($("#MainContent_lbTeams :selected").length > 0) {
$("#MainContent_lblTeamMembers").text("Members of '" + latest_text + "':");
// act only when the returned promise is resolved
PopulateMembers(latest_value).then(function () {
$("#MainContent_lbMembers_chosen a").removeClass("search-choice-close");
});
}
});
我可以使用其他东西来获取我的多选列表框的最新选定值吗?
答案 0 :(得分:0)
不确定是否有更好的方法,但因为它是多方式,您可以在added
中找到所有已添加对象的对象数组,并在removed
中找到已删除的对象数组。
$('select').on('change', function () {
var latest_value = $(this).data('value') || {},
latest_text = $(this).data('text') || {},
new_value = {},
new_text = {},
added = [],
removed = [];
$("option:selected", this).each(function(){
new_value[$(this).val()] = true;
new_text[$(this).text()] = true;
if($(this).val() in latest_value){
delete latest_value[$(this).val()];
delete latest_text[$(this).text()];
}else{
added.push({value: $(this).val(), text: $(this).text()});
}
});
for(v in latest_value){
removed.push({value: latest_value[v], text: latest_text[v]});
}
console.log('added', added);
console.log('removed', removed);
$(this).data({value: new_value, text: new_text});
});
答案 1 :(得分:0)
我最终做了一些不同的事情。 鉴于多选的.val()存储为数组,我采用了两个数组之间的差异。以下是我最终的结果:
var myTeam = [];
$("#trMembers").hide();
$("#MainContent_lbTeams").on('change', function () {
//was a value selected?
//store the difference of what teams are selected vs myTeam[]
var diff = [];
jQuery.grep($("#MainContent_lbTeams").val(), function (el) {
if (jQuery.inArray(el, myTeam) == -1) diff.push(el);
});
if (diff.length > 0) {
var latest_value = diff; //has the latest selected value
var latest_text = $("#MainContent_lbTeams option[value='" + diff + "']").text(); //stores the text
if ($("#MainContent_lbTeams :selected").length > 0) {
$("#dTeamNotice").show();
$("#MainContent_lblTeamMembers").text("Members of '" + latest_text + "':");
// act only when the returned promise is resolved
PopulateMembers(latest_value).then(function () {
$("#MainContent_lbMembers_chosen a").removeClass("search-choice-close");
$("#trMembers").fadeIn();
});
} else {
//hide it...
$("#dTeamNotice").css("display", "none");
$("#trMembers").hide();
}
}
myTeam = $("#MainContent_lbTeams").val();
});