代码之家  ›  专栏  ›  技术社区  ›  SedJ601

如何从包含分隔符“USE”的结果中创建新标记?

  •  1
  • SedJ601  · 技术社区  · 9 年前

    更新的问题

    "keyword USE 1 or more keywords" project

    $('.productName').select2({
      ajax: {
        url: "https://api.myjson.com/bins/9t7gz",
        dataType: 'json',
        type: "GET",
        delay: 250,
        data: function(params) {
          return {
            key: params.term // search term
          };
        },
        processResults: function(data) {
          for (var d = 0; d < data.length; d++) {
            if (data[d].text.includes(" USE ")) {
              var dataItems = data[d].text.split(" USE ");
              if (dataItems[1].toString().includes(";")) {
                var dataKeywordItems = dataItems[1].toString().split(";");
                for (var ii = 0; ii < dataKeywordItems.length; ii++) {
                  var option3 = new Option(dataKeywordItems[ii].toString().trim(), dataKeywordItems[ii].toString().trim(), true);
                  $('.productName').append(option3);
                }
              } else {
                var option = new Option(dataItems[1], dataItems[1], true);
                $('.productName').append(option);
              }
            }
          }
          return {
            results: data
          };
        },
        cache: true
      },
      placeholder: 'Keyword/keyphrase search...',
      minimumInputLength: 2,
      tags: true
    }).on("select2:select", function(e) {
      var splitValues = $('.productName').val().toString().split(" USE ");
    
      if (splitValues[1].includes("; ")) {
        var splitKeywords = splitValues[1].toString().split("; ");
    
        $('.productName').val(splitKeywords).trigger("change");
        alert(splitKeywords.toString());
        //                for(var i = 0; i < splitKeywords.length; i++)
        //                {
        //                    alert(splitKeywords[i].toString().trim());
        //                    $('.productName').val(splitKeywords[i].toString().trim()).trigger("change");
        //                }
      } else {
        $('.productName').val(splitValues[1]).trigger("change");
      }
    
    });
    .select2-selection__rendered {
      line-height: 32px !important;
    }
    
    .select2-selection {
      height: 34px !important;
    }
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <script src="https://npmcdn.com/tether@1.2.4/dist/js/tether.min.js"></script>
    <link href="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.3/css/select2.min.css" rel="stylesheet" />
    <script src="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.3/js/select2.min.js"></script>
    <link href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-alpha.6/css/bootstrap.min.css" rel="stylesheet" />
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-alpha.6/js/bootstrap.min.js"></script>
    
    
    <div class="container">
      <div class="row">
        <span class='input-group-btn col-lg-12 col-md-12 col-sm-12'>
            <select style="width:70%;" class='productName ' id='productName' width=>
    
            </select>
            
        </span>
      </div>
    </div>

    处理结果:

    如果关键字包含“USE”,则将一个或多个关键字置于“USE”右侧,并将其动态添加到下拉列表中。

    processResults: function (data) {                      
        for(var d = 0; d < data.length; d++)
        {
            if(data[d].text.includes(" USE "))
            {
                var dataItems = data[d].text.split(" USE ");
                if(dataItems[1].toString().includes(";"))
                {
                    var dataKeywordItems = dataItems[1].toString().split(";");
                    for(var ii = 0; ii < dataKeywordItems.length; ii++)
                    {                                    
                        var option3 = new Option(dataKeywordItems[ii].toString().trim(), dataKeywordItems[ii].toString().trim(), true);
                        $('.productName').append(option3);
                    }
                }
                else
                {
                    var option = new Option(dataItems[1], dataItems[1], true);
                    $('.productName').append(option);
                }                            
            }
        }
        return {
            results: data
        };
    },  
    

    .on("select2:select", function(e) {            
        var splitValues = $('.productName').val().toString().split(" USE ");  
    
        if(splitValues[1].includes("; "))
        {                 
            var splitKeywords = splitValues[1].toString().split("; ");
    
            $('.productName').val(splitKeywords).trigger("change");
            alert(splitKeywords.toString());
    //                for(var i = 0; i < splitKeywords.length; i++)
    //                {
    //                    alert(splitKeywords[i].toString().trim());
    //                    $('.productName').val(splitKeywords[i].toString().trim()).trigger("change");
    //                }
        }
        else
        {
            $('.productName').val(splitValues[1]).trigger("change");
        }
    
    });
    

    第一个选择的屏幕截图: Screenshot of first select

    潜在第二次选择的屏幕截图: enter image description here

    问题是如何保留第一个选择结果并添加新的第二个选择结果?

    2 回复  |  直到 8 年前
        1
  •  1
  •   DavidDomain    9 年前

    你可以使用 formatSelection 方法更改所选选项的显示方式。

    下面是一个示例:

    function format(state) {
      if (state.text.indexOf('USE') !== -1) {
        return state.text.substring(state.text.indexOf('USE') + 4, state.text.length);
      }
      return state.text;
    }
    
    $('#test').select2({
      data:[
        {id:0,text:"enhancement"},
        {id:1,text:"bug"},
        {id:2,text:"duplicate USE copy"},
        {id:3,text:"invalid USE wrong; incorrect"},
        {id:4,text:"wontfix"}
      ],
      multiple: true,
      width: "300px",
      formatSelection: format,
    });
    <link href="https://cdnjs.cloudflare.com/ajax/libs/select2/3.2/select2.css" rel="stylesheet"/>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/select2/3.2/select2.min.js"></script>
    
    <input type="hidden" id="test" />
        2
  •  0
  •   SedJ601    8 年前

        $('.productName').select2({            
            ajax: {
                url: "DBHandler.php",
                dataType: 'json',
                type: "GET",
                delay: 250,
                data: function (params) {   
                    return {
                        key: params.term // search term
                    };
                },
                processResults: function (data) {                       
                    return {
                        results: data
                    };
                },                
                cache: true
            },
            placeholder: 'Keyword/keyphrase search...',
            minimumInputLength: 2,   
            tags: true
        }).on("select2:select", function(e) {  
            var valueToRemove = e.params.data.id; 
            if(valueToRemove.toString().includes(" USE "))
            {
                var splitValues = valueToRemove.toString().split(" USE "); 
                if(!splitValues[1].toString().includes(";"))
                {                  
                    alert("value does not contain ;");
                    new_data = $.grep($('.productName').val(), function(id){return id !== valueToRemove;});
                    alert("new data: " + new_data);
    
                    $('.productName > option').prop("selected", false);
                    $('.productName').val(new_data).trigger('change');  
    
                    $('.productName').append("<option value = '" + splitValues[1].toString().trim() + "' selected>" + splitValues[1].toString().trim() + "</option>");              
                }
                else
                {
                    var splitKeys = splitValues[1].toLocaleString().split(";");
                    new_data = $.grep($('.productName').val(), function(id){return id !== valueToRemove;});
                    $('.productName > option').prop("selected", false);
                    $('.productName').val(new_data).trigger('change');  
    
                    splitKeys.forEach(function(item)
                    {
                        alert(item);
                        $('.productName').append("<option value = '" + item.toString().trim() + "' selected>" + item.toString().trim() + "</option>");
                    });                    
                }
            }           
        });
    

    onSelect代码是解决这个问题的关键。

    on("select2:select", function(e) {...});
    

    " USE " InputField 价值观

    var valueToRemove = e.params.data.id; 
    

    然后,我使用 作为分隔符。如果关键字位于 不包含分号 ; ,我创建了一个数组 new_data 的当前值,正在选择的值除外。然后,使用取消选择所有当前选定值 $('.productName > option').prop("selected", false); 。接下来,我使用 $('.productName').val(new_data).trigger('change'); 最后,我附加了使用从原始选定值中提取的新关键字 $('.productName').append("<option value = '" + splitValues[1].toString().trim() + "' selected>" + splitValues[1].toString().trim() + "</option>"); “使用” 示例关键字: Not smart USE dumb dumb 在中显示为关键字 输入字段

            if(valueToRemove.toString().includes(" USE "))
            {
                var splitValues = valueToRemove.toString().split(" USE "); 
                if(!splitValues[1].toString().includes(";"))
                {                  
                    alert("value does not contain ;");
                    new_data = $.grep($('.productName').val(), function(id){return id !== valueToRemove;});
                    alert("new data: " + new_data);
    
                    $('.productName > option').prop("selected", false);
                    $('.productName').val(new_data).trigger('change');  
    
                    $('.productName').append("<option value = '" + splitValues[1].toString().trim() + "' selected>" + splitValues[1].toString().trim() + "</option>");              
                }
                else{
                    .
                    .
                    .
                }
            }
    

    如果关键字位于 包含分号 “使用” 关于分号 ; var splitKeys = splitValues[1].toLocaleString().split(";"); 输入字段 .接下来,我采取完全相同的步骤重新填充

    1. new_data = $.grep($('.productName').val(), function(id){return id !== valueToRemove;});
    2. $(“.productName>选项”)。道具(“选定”,假);

    3. $(“.productName”).val(新的_数据)。触发器('change');

    splitKeys.forEach(function(item) { alert(item); $('.productName').append("<option value = '" + item.toString().trim() + "' selected>" + item.toString().trim() + "</option>"); });

    这可以处理“USE”之后有多个关键字的情况。示例关键字: Not smart USE dumb; stupid .当选择时 stupid 在输入字段中显示为关键字。

        if(valueToRemove.toString().includes(" USE "))
            {
                var splitValues = valueToRemove.toString().split(" USE "); 
                if(!splitValues[1].toString().includes(";"))
                {                  
                    .
                    .
                    .           
                }
                else{
                    var splitKeys = splitValues[1].toLocaleString().split(";");
                    new_data = $.grep($('.productName').val(), function(id){return id !== valueToRemove;});
                    $('.productName > option').prop("selected", false);
                    $('.productName').val(new_data).trigger('change');  
    
                    splitKeys.forEach(function(item)
                    {
                        alert(item);
                        $('.productName').append("<option value = '" + item.toString().trim() + "' selected>" + item.toString().trim() + "</option>");
                    });                    
                }
            }