如何设置 jQuery Select2 的选定值?

Posted

技术标签:

【中文标题】如何设置 jQuery Select2 的选定值?【英文标题】:How to set selected value of jQuery Select2? 【发布时间】:2021-08-30 09:43:45 【问题描述】:

这属于 Select2 版本 4 之前的代码

我有一个简单的select2 代码,可以从 AJAX 获取数据。

$("#programid").select2(
  placeholder: "Select a Program",
  allowClear: true,
  minimumInputLength: 3,
  ajax: 
    url: "ajax.php",
    dataType: 'json',
    quietMillis: 200,
    data: function (term, page) 
      return 
        term: term, //search term
        flag: 'selectprogram',
        page: page // page number
      ;
    ,
    results: function (data) 
      return results: data;
    
  ,
  dropdownCssClass: "bigdrop",
  escapeMarkup: function (m)  return m; 
);

此代码正在运行,但是,我需要在其上设置一个值,就像在编辑模式下一样。当用户第一次选择一个值时,它将被保存,当他需要编辑该值时,它必须出现在同一个选择菜单 (select2) 中以选择先前选择的值,但我找不到方法。

更新:

html 代码:

<input type="hidden" name="programid" id="programid" class="width-500 validate[required]">

Select2 programmatic access 不适用于此。

【问题讨论】:

你应该可以只在html中设置选择的值或者使用$("#programid").val() @ExplosionPills Negative,我也试过了,我得到了一个空白值。我应该如何使用 programid.val()?我从服务器获取了值,然后我需要将它设置到 select2 的这个隐藏字段中。 @ClearBoth 不确定我是否明白你的意思。您是否尝试将 Select2 组件的“选定”值设置为 AJAX 检索结果之一? @AnPhan 是的,有没有办法做到这一点? @ClearBoth 有。在下面检查我的答案。 【参考方案1】:

选择2


第 1 步:HTML

<input name="mySelect2" type="hidden" id="mySelect2">

步骤 #2:创建 Select2 的实例

$("#mySelect2").select2(
      placeholder: "My Select 2",
      multiple: false,
      minimumInputLength: 1,
      ajax: 
          url: "/elements/all",
          dataType: 'json',
          quietMillis: 250,
          data: function(term, page) 
              return 
                  q: term,
              ;
          ,
          results: function(data, page) 
              return results: data;
          ,
          cache: true
      ,
      formatResult: function(element)
          return element.text + ' (' + element.id + ')';
      ,
      formatSelection: function(element)
          return element.text + ' (' + element.id + ')';
      ,
      escapeMarkup: function(m) 
          return m;
      
);

第 3 步:设置您想要的值

$("#mySelect2").select2('data',  id:"elementID", text: "Hello!");

如果您使用 select2 而不使用 AJAX,您可以执行以下操作:

<select name="mySelect2" id="mySelect2">
  <option value="0">One</option>
  <option value="1">Two</option>
  <option value="2">Three</option>
</select>
/* "One" will be the selected option */
$('[name=mySelect2]').val("0");

您也可以这样做:

$("#mySelect2").select2("val", "0");

SELECT2 V4


对于 select2 v4,您可以直接附加一个选项,如下所示:

<select id="myMultipleSelect2" multiple="" name="myMultipleSelect2[]">
    <option value="TheID" selected="selected">The text</option>                                                                   
</select>

或者使用 JQuery:

var $newOption = $("<option selected='selected'></option>").val("TheID").text("The text")
 
$("#myMultipleSelect2").append($newOption).trigger('change');

其他例子

$("#myMultipleSelect2").val(5).trigger('change');

【讨论】:

trigger('change'); 是重要的部分 $("#mySelect2").select2("val", "0") - 这将触发值更改的 jquery 事件。如何防止这种情况发生。通常当用户提交表单时,完成后,我会重置所有表单数据。重置不会重置 select2。使用 select2("val", "0") 将触发更改,这很疯狂,因为用户没有采取任何行动。 版本 4 select2.org/programmatic-control/add-select-clear-items 为 .trigger('change') 表扬 trigger('change') 部分我怎么强调都不过分。没有它,这个东西甚至不会更新它自己的视觉外观(即显示选定的选项)。【参考方案2】:

动态设置 Select2 组件的“选定”值:

$('#inputID').select2('data', id: 100, a_key: 'Lorem Ipsum');

其中第二个参数是具有预期值的对象。

更新:

这确实有效,只是想注意在新的 select2 中,"a_key" 是标准 select2 对象中的 "text"。所以:id: 100, text: 'Lorem Ipsum'

示例:

$('#all_contacts').select2('data', id: '123', text: 'res_data.primary_email');

感谢@NoobishPro

【讨论】:

我尝试使用 id only select2('val', '1') 但它不起作用.. 谢谢 这确实有效,只是想注意在新的 select2 中,“a_key”是标准 select2 对象中的“文本”。所以:id:100,文本:'Lorem Ipsum' 在 v4 上相同。一直在拉我的头发。我认为不使用 javascript 解决方案是不可能的。现在正在寻找另一个 jQuery/Bootstrap Select2 下拉菜单(2 天摆弄每一种可能的方法 - 不开心!) Select2 v4: $('#inputID').val(100).trigger('change') 见select2.github.io/… @NoobishPro & An Phan - 感谢您的回答和评论【参考方案3】:

HTML:

<select id="lang" >
   <option value="php">php</option>
   <option value="asp">asp</option>
   <option value="java">java</option>
</select>

JavaScript:

$("#lang").select2().select2('val','asp');

jsfiddle

【讨论】:

如何通过文本而不是val来设置 问题是如何在加载 AJAX 调用后执行此操作。这个答案在这种情况下不起作用。 这将触发 select2 值更改,如果您要处理此事件,这将是很奇怪的,并且它在没有用户执行的情况下触发【参考方案4】:

正如我所尝试的,当在 select2 中使用 ajax 时,在 select2 中设置新值的 programmatic control 方法对我不起作用! 现在我写这些代码来解决这个问题:

$('#sel')
    .empty() //empty select
    .append($("<option/>") //add option tag in select
        .val("20") //set value for option to post it
        .text("nabi")) //set a text for show in select
    .val("20") //select option of select2
    .trigger("change"); //apply to select2

您可以在这里链接测试完整的示例代码:https://jsfiddle.net/NabiKAZ/2g1qq26v/32/ 在此示例代码中有一个 ajax select2,您可以使用按钮设置新值。

$("#btn").click(function() 
  $('#sel')
    .empty() //empty select
    .append($("<option/>") //add option tag in select
      .val("20") //set value for option to post it
      .text("nabi")) //set a text for show in select
    .val("20") //select option of select2
    .trigger("change"); //apply to select2
);

$("#sel").select2(
  ajax: 
    url: "https://api.github.com/search/repositories",
    dataType: 'json',
    delay: 250,
    data: function(params) 
      return 
        q: params.term, // search term
        page: params.page
      ;
    ,
    processResults: function(data, params) 
      // parse the results into the format expected by Select2
      // since we are using custom formatting functions we do not need to
      // alter the remote JSON data, except to indicate that infinite
      // scrolling can be used
      params.page = params.page || 1;

      return 
        results: data.items,
        pagination: 
          more: (params.page * 30) < data.total_count
        
      ;
    ,
    cache: true
  ,
  escapeMarkup: function(markup) 
    return markup;
  , // let our custom formatter work
  minimumInputLength: 1,
  templateResult: formatRepo, // omitted for brevity, see the source of this page
  templateSelection: formatRepoSelection // omitted for brevity, see the source of this page
);

function formatRepo(repo) 
  if (repo.loading) return repo.text;

  var markup = "<div class='select2-result-repository clearfix'>" +
    "<div class='select2-result-repository__avatar'><img src='" + repo.owner.avatar_url + "' /></div>" +
    "<div class='select2-result-repository__meta'>" +
    "<div class='select2-result-repository__title'>" + repo.full_name + "</div>";

  if (repo.description) 
    markup += "<div class='select2-result-repository__description'>" + repo.description + "</div>";
  

  markup += "<div class='select2-result-repository__statistics'>" +
    "<div class='select2-result-repository__forks'><i class='fa fa-flash'></i> " + repo.forks_count + " Forks</div>" +
    "<div class='select2-result-repository__stargazers'><i class='fa fa-star'></i> " + repo.stargazers_count + " Stars</div>" +
    "<div class='select2-result-repository__watchers'><i class='fa fa-eye'></i> " + repo.watchers_count + " Watchers</div>" +
    "</div>" +
    "</div></div>";

  return markup;


function formatRepoSelection(repo) 
  return repo.full_name || repo.text;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.min.js"></script>
<link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.2-rc.1/css/select2.min.css">
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.2-rc.1/js/select2.min.js"></script>
<link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.min.css">
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script>
<link rel="stylesheet" type="text/css" href="https://select2.org/assets/a7be624d756ba99faa354e455aed250d.css">

<select id="sel" multiple="multiple" class="col-xs-5">
</select>

<button id="btn">Set Default</button>

【讨论】:

我正在使用不同的 displayKey 和其他东西(虽然这是个坏主意) - 这有助于我使用 Codeception 进行验收测试完美 乏味,当然,但是,就像每个人都发现 Select2 v4 根本无法做一些像设置默认选择这样简单得可笑的事情 我发现这个答案是使 select2 v4 - ajax 选择的唯一方法。【参考方案5】:
var $option = $("<option selected></option>").val('1').text("Pick me");

$('#select_id').append($option).trigger('change');

试试这个追加然后选择。在 AJAX 调用时不复制选项。

【讨论】:

var $option = $("").val('1').text("Pick me"); $('#select_id').append($option).trigger('change'); 谢谢。确认工作在 4.0.0 版(ajax 调用) 如果您使用带有 ajax 的可搜索框,这是正确的解决方案。这个在 2019 年 6 月为我工作。【参考方案6】:

我确实喜欢这个-

$("#drpServices").select2().val("0").trigger("change");

【讨论】:

请提供一些解释以帮助用户了解您的代码如何工作并回答 OP 的问题。 @Ivan,我正在这样做 $("#drpServices").val("0"); 这不会在 select2 下拉列表中选择税,以影响值和文本都需要触发 select2 的更改功能。这对我来说非常有效。希望用户能理解。【参考方案7】:

select2 - v4.0.1 的当前版本中,您可以像这样设置值:

var $example = $('.js-example-programmatic').select2();
$(".js-programmatic-set-val").on("click", function ()  $example.val("CA").trigger("change"); );

// Option 2 if you can't trigger the change event.
var $exampleDestroy = $('.js-example-programmatic-destroy').select2();
$(".js-programmatic-set-val").on("click", function ()  $exampleDestroy.val("CA").select2('destroy').select2(); );
<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/4.0.1/js/select2.min.js"></script>
<link href="//cdnjs.cloudflare.com/ajax/libs/select2/4.0.1/css/select2.min.css" rel="stylesheet" />

using "trigger(change)"
<select class="js-example-programmatic">
  <optgroup label="Alaskan/Hawaiian Time Zone">
    <option value="AK">Alaska</option>
    <option value="HI">Hawaii</option>
  </optgroup>
  <optgroup label="Pacific Time Zone">
    <option value="CA">California</option>
    <option value="NV">Nevada</option>
    <option value="OR">Oregon</option>
    <option value="WA">Washington</option>
  </optgroup>
  <optgroup label="Mountain Time Zone">
    <option value="AZ">Arizona</option>
    <option value="CO">Colorado</option>
    <option value="ID">Idaho</option>
    <option value="MT">Montana</option>
    <option value="NE">Nebraska</option>
    <option value="NM">New Mexico</option>
    <option value="ND">North Dakota</option>
    <option value="UT">Utah</option>
    <option value="WY">Wyoming</option>
  </optgroup>
  <optgroup label="Central Time Zone">
    <option value="AL">Alabama</option>
    <option value="AR">Arkansas</option>
    <option value="IL">Illinois</option>
    <option value="IA">Iowa</option>
    <option value="KS">Kansas</option>
    <option value="KY">Kentucky</option>
    <option value="LA">Louisiana</option>
    <option value="MN">Minnesota</option>
    <option value="MS">Mississippi</option>
    <option value="MO">Missouri</option>
    <option value="OK">Oklahoma</option>
    <option value="SD">South Dakota</option>
    <option value="TX">Texas</option>
    <option value="TN">Tennessee</option>
    <option value="WI">Wisconsin</option>
  </optgroup>
  <optgroup label="Eastern Time Zone">
    <option value="CT">Connecticut</option>
    <option value="DE">Delaware</option>
    <option value="FL">Florida</option>
    <option value="GA">Georgia</option>
    <option value="IN">Indiana</option>
    <option value="ME">Maine</option>
    <option value="MD">Maryland</option>
    <option value="MA">Massachusetts</option>
    <option value="MI">Michigan</option>
    <option value="NH">New Hampshire</option>
    <option value="NJ">New Jersey</option>
    <option value="NY">New York</option>
    <option value="NC">North Carolina</option>
    <option value="OH">Ohio</option>
    <option value="PA">Pennsylvania</option>
    <option value="RI">Rhode Island</option>
    <option value="SC">South Carolina</option>
    <option value="VT">Vermont</option>
    <option value="VA">Virginia</option>
    <option value="WV">West Virginia</option>
  </optgroup>
</select>

using destroy: 
<select class="js-example-programmatic">
  <optgroup label="Alaskan/Hawaiian Time Zone">
    <option value="AK">Alaska</option>
    <option value="HI">Hawaii</option>
  </optgroup>
  <optgroup label="Pacific Time Zone">
    <option value="CA">California</option>
    <option value="NV">Nevada</option>
    <option value="OR">Oregon</option>
    <option value="WA">Washington</option>
  </optgroup>
  <optgroup label="Mountain Time Zone">
    <option value="AZ">Arizona</option>
    <option value="CO">Colorado</option>
    <option value="ID">Idaho</option>
    <option value="MT">Montana</option>
    <option value="NE">Nebraska</option>
    <option value="NM">New Mexico</option>
    <option value="ND">North Dakota</option>
    <option value="UT">Utah</option>
    <option value="WY">Wyoming</option>
  </optgroup>
  <optgroup label="Central Time Zone">
    <option value="AL">Alabama</option>
    <option value="AR">Arkansas</option>
    <option value="IL">Illinois</option>
    <option value="IA">Iowa</option>
    <option value="KS">Kansas</option>
    <option value="KY">Kentucky</option>
    <option value="LA">Louisiana</option>
    <option value="MN">Minnesota</option>
    <option value="MS">Mississippi</option>
    <option value="MO">Missouri</option>
    <option value="OK">Oklahoma</option>
    <option value="SD">South Dakota</option>
    <option value="TX">Texas</option>
    <option value="TN">Tennessee</option>
    <option value="WI">Wisconsin</option>
  </optgroup>
  <optgroup label="Eastern Time Zone">
    <option value="CT">Connecticut</option>
    <option value="DE">Delaware</option>
    <option value="FL">Florida</option>
    <option value="GA">Georgia</option>
    <option value="IN">Indiana</option>
    <option value="ME">Maine</option>
    <option value="MD">Maryland</option>
    <option value="MA">Massachusetts</option>
    <option value="MI">Michigan</option>
    <option value="NH">New Hampshire</option>
    <option value="NJ">New Jersey</option>
    <option value="NY">New York</option>
    <option value="NC">North Carolina</option>
    <option value="OH">Ohio</option>
    <option value="PA">Pennsylvania</option>
    <option value="RI">Rhode Island</option>
    <option value="SC">South Carolina</option>
    <option value="VT">Vermont</option>
    <option value="VA">Virginia</option>
    <option value="WV">West Virginia</option>
  </optgroup>
</select>

<button class="js-programmatic-set-val">set value</button>

【讨论】:

如何在不触发更改事件的情况下设置值? change 事件触发我自己的事件处理程序,当用户手动更改值时。 另一种选择是destroy 并再次调用插件.. 查看更新的代码.. 有没有办法获得我最初传递给 select2 的选项,这样我就不必复制它们了?无论如何,这个解决方案似乎更像是一个 hack。 当然是哈希。根据文档的官方方式是触发更改事件。 so that I wouldn't have to duplicate them 为什么要复制它们?当您执行destroy 时,select 仍然存在,还有他的所有options 我的意思是传递给 select2 的选项:$example.select2( ... this ... )【参考方案8】:

我认为你需要initSelection 函数

$("#programid").select2(
  placeholder: "Select a Program",
  allowClear: true,
  minimumInputLength: 3,
  ajax: 
    url: "ajax.php",
    dataType: 'json',
    quietMillis: 200,
    data: function (term, page) 
      return 
        term: term, //search term
        flag: 'selectprogram',
        page: page // page number
      ;
    ,
    results: function (data) 
      return results: data;
    
  ,
  initSelection: function (element, callback) 
    var id = $(element).val();
    if (id !== "") 
      $.ajax("ajax.php/get_where", 
        data: programid: id,
        dataType: "json"
      ).done(function (data) 
        $.each(data, function (i, value) 
          callback("text": value.text, "id": value.id);
        );
        ;
      );
    
  ,
  dropdownCssClass: "bigdrop",
  escapeMarkup: function (m)  return m; 
);

【讨论】:

这是有效的。但自 4.0 版起已弃用【参考方案9】:

HTML

<select id="lang" >
   <option value="php">php</option>
   <option value="asp">asp</option>
   <option value="java">java</option>
</select>

JS

 $("#lang").select2().val('php').trigger('change.select2');

来源:https://select2.github.io/options.html

【讨论】:

【参考方案10】:

设置值并立即触发更改事件。

$('#selectteam').val([183,182]).trigger('change');

【讨论】:

今天也谢谢你 如果您想将多个值设置为选中状态,可以将一组 id 传递给 .val() 这一事实非常有用【参考方案11】:
$('#inputID').val("100").select2();

在选择当前选择之一之后应用select2会更合适。

【讨论】:

【参考方案12】:

Select2 V.4

使用$('selector').select2().val(value_to_select).trigger('change');

我觉得应该可以

【讨论】:

【参考方案13】:

对于 Ajax,请使用 $(".select2").val("").trigger("change")。这应该可以解决问题。

【讨论】:

【参考方案14】:
    $("#select_location_id").val(value);
    $("#select_location_id").select2().trigger('change');

我用这个简单的代码解决了我的问题。其中#select_location_id 是选择框的ID,value 是select2 框中列出的选项的值。

【讨论】:

【参考方案15】:

An Phan 的回答对我有用:

$('#inputID').select2('data', id: 100, a_key: 'Lorem Ipsum');

但添加更改会触发事件

$('#inputID').select2('data', id: 100, a_key: 'Lorem Ipsum').change();

【讨论】:

以这种方式执行此操作时,我收到错误“Uncaught TypeError: $(...).select2(...).change is not a function(...)”。我认为 Select2 的 4.x 版本不可能 - 这里没有任何东西适用于 ajax。【参考方案16】:

有时,select2() 将首先加载,这使得控件无法正确显示先前选择的值。延迟几秒钟可以解决这个问题。

setTimeout(function()                  
    $('#costcentreid').select2();               
,3000);

【讨论】:

【参考方案17】:

您可以使用此代码:

$("#programid").val(["number:2", "number:3"]).trigger("change");

其中 "number:2" 中的 2 和 "number:3" 中的 3 是对象数组中的 id 字段

【讨论】:

【参考方案18】:

这对我来说很好:

        initSelection: function (element, callback) 
    var id = $(element).val();
    $.ajax("url/" + id, 
        dataType: "json"
    ).done(function (data) 
        var newOption = new Option(data.title, data.id, true, true);
        $('#select2_id').append(newOption).trigger('change');
        callback("text": data.title, "id": data.id);
    );
,

【讨论】:

【参考方案19】:

我在 select2 ajax 下拉菜单中做了类似的事情来预设元素

      //preset element values
        $(id).val(topics);
       //topics is an array of format ["id":"","text":"", .....]
          setTimeout(function()
           ajaxTopicDropdown(id,
                2,location.origin+"/api for gettings topics/",
                "Pick a topic", true, 5);                      
            ,1);
        // ajaxtopicDropdown is dry fucntion to get topics for diffrent element and url

【讨论】:

【参考方案20】:

你应该使用:

var autocompleteIds= $("#EventId");
autocompleteIds.empty().append('<option value="Id">Text</option>').val("Id").trigger('change');

// For set multi selected values
var data =  [];//Array Ids
var option =  [];//Array options of Ids above
autocompleteIds.empty().append(option).val(data).trigger('change');

// Callback handler that will be called on success
request.done(function (response, textStatus, jqXHR) 
    // append the new option
    $("#EventId").append('<option value="' + response.id + '">' + response.text + '</option>');

    // get a list of selected values if any - or create an empty array
    var selectedValues = $("#EventId").val();
    if (selectedValues == null) 
        selectedValues = new Array();
    
    selectedValues.push(response.id);   // add the newly created option to the list of selected items
    $("#EventId").val(selectedValues).trigger('change');   // have select2 do it's thing
);

【讨论】:

【参考方案21】:

如果您使用的是输入框,则必须将“multiple”属性设置为“true”。例如,

<script>
    $(document).ready(function () 

        var arr = [ id: 100, text: 'Lorem Ipsum 1' ,
             id: 200, text: 'Lorem Ipsum 2'];

        $('#inputID').select2(
            data: arr,
            width: 200,
            multiple: true
        );
    );
</script>

【讨论】:

【参考方案22】:

select2 &lt; version4 中有一个选项initSelection() 用于远程数据加载,通过它可以像在编辑模式下一样设置输入的初始值。

$("#e6").select2(
    placeholder: "Search for a repository",
    minimumInputLength: 1,
    ajax:  
        // instead of writing the function to execute the request we use Select2's convenient helper
        url: "https://api.github.com/search/repositories",
        dataType: 'json',
        quietMillis: 250,
        data: function (term, page) 
            return 
                q: term, // search term
            ;
        ,
        results: function (data, page) 
            // parse the results into the format expected by Select2.
            // since we are using custom formatting functions we do not need to alter the remote JSON data
            return  results: data.items ;
        ,
        cache: true
    ,
    initSelection: function(element, callback) 
        // the input tag has a value attribute preloaded that points to a preselected repository's id
        // this function resolves that id attribute to an object that select2 can render
        // using its formatResult renderer - that way the repository name is shown preselected
        var id = $(element).val();
        if (id !== "") 
            $.ajax("https://api.github.com/repositories/" + id, 
                dataType: "json"
            ).done(function(data)  callback(data); );
        
    ,
    formatResult: repoFormatResult, // omitted for brevity, see the source of this page
    formatSelection: repoFormatSelection,  // omitted for brevity, see the source of this page
    dropdownCssClass: "bigdrop", // apply css that makes the dropdown taller
    escapeMarkup: function (m)  return m;  // we do not want to escape markup since we are displaying html in results
);

源文档:Select2 - 3.5.3

【讨论】:

【参考方案23】:

只是想补充一下可能与我有同样问题的其他人。

我试图设置我动态加载的选项(来自 AJAX)的选定选项,并试图根据某些逻辑将其中一个选项设置为选定。

我的问题来了,因为我没有尝试根据需要匹配值的 ID 设置所选选项,而不是匹配名称的值!

【讨论】:

【参考方案24】:

对于像这样的多个值:

$("#HouseIds").select2("val", @Newtonsoft.Json.JsonConvert.SerializeObject(Model.HouseIds));

这将转化为类似的东西

$("#HouseIds").select2("val", [35293,49525]);

【讨论】:

【参考方案25】:

这可能有助于在加载数据进行编辑时从 AJAX 加载 select2 数据(适用于单选或多选):

在我的表单/模型加载期间:

  $.ajax(
        type: "POST",
        ...        
        success: function (data) 
          selectCountries(fixedEncodeURI(data.countries));
         

调用 Select2 选择数据:

var countrySelect = $('.select_country');
function selectCountries(countries)
    
        if (countries) 
            $.ajax(
                type: 'GET',
                url: "/regions/getCountries/",
                data: $.param( 'idsSelected': countries , true),

            ).then(function (data) 
                // create the option and append to Select2                     
                $.each(data, function (index, value) 
                    var option = new Option(value.text, value.id, true, true);
                    countrySelect.append(option).trigger('change');
                    console.log(option);
                );
                // manually trigger the `select2:select` event
                countrySelect.trigger(
                    type: 'select2:select',
                    params: 
                        data: data
                    
                );
            );
        
    

如果您可能遇到编码问题,您可以根据需要进行更改:

function fixedEncodeURI(str) 
        return encodeURI(str).replace(/%5B/g, '[').replace(/%5D/g, ']').replace(/%22/g,"");

    

【讨论】:

【参考方案26】:

建立在@tomloprod 的答案之上。您使用x-editable,并且有一个select2(v4)字段并且有多个项目需要预先选择,这是一个奇怪的机会。您可以使用以下代码:

$("#select2field").on("shown", function(e, editable)
    $(["test1", "test2", "test3", "test4"]).each(function(k, v)
        // Create a DOM Option and pre-select by default~
        var newOption = new Option(v.text, v.id, true, true);
        // Append it to the select
        $(editable.input.$input).append(newOption).trigger('change');
     );
);

它正在发挥作用:

var data = [

    id: 0,
    text: 'enhancement'
,

    id: 1,
    text: 'bug'
,

    id: 2,
    text: 'duplicate'
,

    id: 3,
    text: 'invalid'
,

    id: 4,
    text: 'wontfix'

];

$("#select2field").editable(
        type: "select2",
        url: './',
        name: 'select2field',
        savenochange: true,
        send: 'always',
        mode: 'inline',
        source: data,
        value: "bug, wontfix",
        tpl: '<select style="width: 201px;">',
        select2: 
            width: '201px',
            tags: true,
            tokenSeparators: [',', ' '],
            multiple: true,
            data:data
        ,
        success: function(response, newValue) 
            console.log("success")
        ,
        error: function(response, newValue) 
            if (response.status === 500) 
                return 'Service unavailable. Please try later.';
             else 
                return response.responseJSON;
            
        
    );

var preselect= [
    
        id: 1,
        text: 'bug'
    ,
    
    id: 4,
    text: 'wontfix'

];

 $("#select2field").on("shown", function(e, editable)
    $(preselect).each(function(k, v)
        // Create a DOM Option and pre-select by default~
        var newOption = new Option(v.text, v.id, true, true);
        // Append it to the select
        $(editable.input.$input).append(newOption).trigger('change');
     );
);
<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/4.0.1/js/select2.min.js"></script>
<link href="//cdnjs.cloudflare.com/ajax/libs/select2/4.0.1/css/select2.min.css" rel="stylesheet" />

<link href="//cdnjs.cloudflare.com/ajax/libs/x-editable/1.5.0/bootstrap3-editable/css/bootstrap-editable.css" rel="stylesheet"/>
<script src="//cdnjs.cloudflare.com/ajax/libs/x-editable/1.5.0/bootstrap3-editable/js/bootstrap-editable.min.js"></script>

<a id="select2field">bug, wontfix</a>

我想即使您不使用 x-editable 也可以。我希望 htis 可以帮助某人。

【讨论】:

【参考方案27】:

您可以使用此代码:

    $('#country').select2("val", "Your_value").trigger('change');

输入你想要的值而不是 Your_value

希望它会起作用:)

【讨论】:

【参考方案28】:

我在 Laravel 中使用 select2 和 ajax 源。在我的情况下,我从页面收到简单的工作循环选项并将选项添加到 select2..

$filtri->stato = [1,2,...];

$('#stato') 是我的带有服务器端负载的 select2

<script>
    @foreach ($filtri->stato as $item)
       $('#stato').append(new Option("\App\Models\stato::find($item)->nome",$item, false, true));
    @endforeach
</script>

在我的情况下,我可以使用 find 方法调用选项文本,但可以使用 ajax 调用来实现

【讨论】:

【参考方案29】:

官方Select2 documentation说:

对于从AJAX 源接收数据的 Select2 控件,使用 .val() 将不起作用。选项将不存在,因为在打开控件和/或用户开始搜索之前不会触发 AJAX 请求。

在页面渲染期间设置select2字段中的值将&lt;option&gt;标签放在&lt;select&gt;标签内:

<select id="input-degree">
    <option value="1">Art</option>
</select>

加载页面后,您会在select2 字段中看到Art。如果我们点击该字段,数据将通过 ajax 从服务器获取并显示其他选项。

【讨论】:

【参考方案30】:

在远程来源 (AJAX) Select2 中预选选项 对于从 AJAX 源接收数据的 Select2 控件,使用 .val() 将不起作用。选项将不存在,因为在打开控件和/或用户开始搜索之前不会触发 AJAX 请求。服务器端过滤和分页使这更加复杂 - 无法保证特定项目何时实际加载到 Select2 控件中!

因此,处理此问题的最佳方法是简单地将预选项目添加为新选项。对于远程来源的数据,这可能涉及在您的服务器端应用程序中创建一个新的 API 端点,该端点可以检索单个项目:

$('#mySelect2').select2(
ajax: 
    url: '/api/students'

);
var studentSelect = $('#mySelect2');
$.ajax(
    type: 'GET',
    url: '/api/students/s/' + studentId
).then(function (data) 
// create the option and append to Select2
var option = new Option(data.full_name, data.id, true, true);
studentSelect.append(option).trigger('change');

// manually trigger the `select2:select` event
studentSelect.trigger(
    type: 'select2:select',
    params: 
        data: data
    
);
);

【讨论】:

以上是关于如何设置 jQuery Select2 的选定值?的主要内容,如果未能解决你的问题,请参考以下文章

获取select2中选定选项的值,然后使用jquery将值设置为输入文本?

如何在javascript变量中获取jquery select2选定值[重复]

在 PHP 中,如何使用 select2(Jquery 插件)显示选定的值

如何在 laravel 中使用 AJAX 数据时设置 Select2 的选定值?

使用 asp.net 从后面的代码中获取 Jquery 的 Select2 的多个选定值

如何从 select2() 下拉 Jquery 中禁用选定属性?