从multiselect获取最近选择的列表框项

时间:2014-08-20 17:10:26

标签: c# jquery listbox

我有一个允许多选的项目列表框。 我正在尝试选择最新的最新项目,而不是订单值,而是用户最后选择的项目。

如果我尝试打印.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");
        });
    }
});

我可以使用其他东西来获取我的多选列表框的最新选定值吗?

2 个答案:

答案 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});
});

DEMO

答案 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();
        });