【问题标题】:How to get the last selected option from a multiselect?如何从多选中获取最后选择的选项?
【发布时间】:2011-12-30 06:37:01
【问题描述】:

我正在寻找一种方法来使用 jQuery 在多选表单中获取最后一个用户选择的选项。

我不是在寻找列表中的最后一项,而是在寻找用户点击的最后一项。

【问题讨论】:

  • 您必须自己跟踪上次选择的项目。

标签: jquery multi-select


【解决方案1】:

类似的东西

var lastSelected = null;
$('.multiSelectOptions').click(function(){
    lastSelected = this.value;
});

【讨论】:

  • 1.不需要each,并且2.当this.value更容易时不要使用$(this).val()
【解决方案2】:

使用this.value 在上面的答案中,当用户按住Ctrl 并单击并选择了多个项目时,它会返回列表中第一个选择的值,即使这不是最后一次单击。试试这个:

var previouslySelected = [];
$("#myMultiselect").change (function() {
    // Get newly selected elements
    var currentlySelected = $(this).val();
    var newSelections = currentlySelected.filter(function (element) {
        return previouslySelected.indexOf(element) == -1;
    });
    previouslySelected = currentlySelected;

    if (newSelections.length) {
        // If there are multiple new selections, we'll take the last in the list
        var lastSelected = newSelections.reverse()[0];
    }
});

【讨论】:

    【解决方案3】:

    基本上,您需要维护一个堆栈,以跟踪最后选择的项目。我写了这个函数来更新我的堆栈。

    var determineLastSelectedReportNumber = function (selectedReportNumbers, oldSelectedReportNumbers) {
        var newlyAddedReportNumbers = 
        selectedReportNumbers.filter(function (n) {
            return oldSelectedReportNumbers.indexOf(n) == -1;
        });
    
        var removedReportNumbers = 
        oldSelectedReportNumbers.filter(function (n) {
            return selectedNumberArray.indexOf(n) == -1;
        });
    
        //Remove the removed reportNumbers from the stack.
        if (removedReportNumbers.length > 0) {                        
            removedReportNumbers.forEach(function (removedReportNumber) {
                for (var i = 0; i < selectedNumbersStack.length; i++) {
                    if (selectedNumbersStack[i].toString() === removedReportNumber.toString()) {
                        selectedNumbersStack.splice(i, 1);
                        break;
                    }
                }
            });
        }
    
        //Add the added reportnumbers to the stack. Push();
        if (newlyAddedReportNumbers.length > 0) {
            selectedNumbersStack.push(newlyAddedReportNumbers);
        }
    
        //Set the last selected from top of the stack. Peek();
        var lastSelectedReportNumber = "";
        if(selectedNumbersStack.length > 0){
            lastSelectedReportNumber = selectedNumbersStack[selectedNumbersStack.length -1];
        }
    
        return lastSelectedReportNumber;
    }
    

    这是我的 onChange 实现:

    var reportNumberChanged = function () {
        var $reportNumber = $(this);
        var selectedNumber = $reportNumber.val();
    
        oldSelectedNumberArray = selectedNumberArray;
        selectedNumberArray = jQuery.makeArray(selectedNumber);
    
    
        var lastSelectedReportNumber = determineLastSelectedReportNumber(selectedNumberArray, oldSelectedNumberArray);
        $("#TheLastSelectedReportNumber").val(lastSelectedReportNumber);        
        resetDelayRetrieveReportInfo();
    }
    

    我不妨向你展示我的完整代码:

    var selectedNumberArray = jQuery.makeArray($('#SelectedReportNumbers').val());
    //Initial selectedNumbersStack.
    var selectedNumbersStack = selectedNumberArray;
    
    var counterInitialValue = 3;
    var counter = counterInitialValue;
    var counterInterval = -1;
    
    function delayRetrieveReportInfo() {
        counter--;
        if (counter === 0) {
            retrieveReportInfo($("#TheLastSelectedReportNumber").val());
            clearInterval(counterInterval);
        }
    }
    
    function resetDelayRetrieveReportInfo() {
        clearInterval(counterInterval); //The previous interval is cancelled.
        counter = counterInitialValue;
        counterInterval = setInterval(function () { delayRetrieveReportInfo() }, 1000);
    }
    

    这是多选的连接:

    // Hookup function to change events of select lists
    $('#SelectedReportNumbers').change(reportNumberChanged);
    

    您可以重复使用我的一些代码来创建您自己的“lastSelected”实现。

    【讨论】:

      猜你喜欢
      • 2012-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-14
      • 1970-01-01
      • 2015-02-19
      • 1970-01-01
      相关资源
      最近更新 更多