javascript - JQuery 在 SELECT 之间移动项目并过滤意外行为

标签 javascript jquery html

这是一个现场演示:jsfiddle

过滤对于左侧的框来说效果很好。

在两个列表之间移动项目也效果很好。

当我将一个项目移动到右侧框中,然后进行过滤时,就会出现问题,它会删除右侧框中的所有内容。

如何让它在过滤时将项目留在右侧框中,并且如果这些项目位于右侧框中,则不让这些项目显示在左侧框中(以避免重复)?

//MOVE SPECS BETWEEN BOXES
    function moveListItems(sourceID, destinationID) {
        var whatToMove = $("#"+sourceID+"  option:selected");

        if ( sourceID = "excluded-select" ) {
            whatToMove.attr('class', 'included-option');
        }
        if ( sourceID = "included-select" ) {
            whatToMove.attr('class', 'excluded-option');
        }

        whatToMove.remove().appendTo("#"+destinationID);
        return false;
    }

    $("#move-right-btn").click(function(){
        moveListItems("excluded-select", "included-select");
        return false;
    });

    $("#move-left-btn").click(function(){
        moveListItems("included-select", "excluded-select");
        return false;
    });




    var $opts = $(".excluded-option");

    $("#filter-specs-text").keyup(function () {
        var searchString = $(this).val().toLowerCase();
        $("#excluded-select").empty().append($opts);

        $(".excluded-option").each(function () {
            var text = $(this).text().toLowerCase();

            //found a match - show this entry
            if (text.indexOf(searchString) > -1) {
                $(this).prop("disabled", false);
            }

            //no match - hide this entry
            else {
               $(this).prop("disabled", true).detach();
            }
        });

    });

最佳答案

问题是 $opts 始终包含所有 .excluded-option,在您编写的 onkeyup 处理程序中,它会附加所有$opts 到第一个选择并过滤列表,这就是为什么包含的选项(应保留在第二个选择中)被推回到第一个选择。要解决此问题,您必须在每次在 2 个选择之间移动项目时更新 $opts:

$("#filter-specs-text").keyup(function () {
  //...
  //Use $opts here instead of $('.excluded-option')
  $opts.each(function () {
    //...
  }
}
function moveListItems(sourceID, destinationID) {
     var whatToMove = $("#"+sourceID+"  option:selected");         
     //here you update the $opts accordingly...
     if(sourceID == "excluded-select") $opts = $opts.not(whatToMove);
     else $opts = $opts.add(whatToMove);

     whatToMove.remove().appendTo("#"+destinationID);
 return false;
}

请注意,您应该更新 $opts,而不是每次触发 keyup 时重新选择 .excluded-option,这样这样做太糟糕了。

Demo.

关于javascript - JQuery 在 SELECT 之间移动项目并过滤意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23788122/

相关文章:

javascript - D3 缩放 - 无法读取未定义的属性 'apply'

javascript - 条件中的 window.addEventListener

java - 多个提交按钮,javascript

javascript - jQuery 自动完成 - 结果链接

javascript - 属性值改变后是否起作用?

javascript - Ext JS 6 - 未触发 gridcolumn 的 sortchange 事件

jquery - 使用 jQuery 获取 "img"id

javascript - 在 Highcharts 上添加额外的系列

javascript - 单击 anchor 时显示更多 Div?

javascript - 将不断变化的 jQuery 变量存储到 session 或本地存储