如何使用JqGrid更改select2下拉列表的选定值?


178

我正在使用Oleg的select2演示程序,但是我想知道是否有可能在下拉菜单中更改当前选择的值。

例如,如果加载的四个值是:"Any", "Fruit", "Vegetable", "Meat"并且下拉列表默认为"Any",则如何"Fruit"在JqGrid事件中将其更改为loadComplete

这可能吗?

Answers:


407

对于select2版本> = 4.0.0

其他解决方案可能不起作用,但是以下示例应该起作用。

解决方案1:触发所有附加的更改事件,包括select2

$('select').val('1').trigger('change');

解决方案2:导致仅select2更改事件触发

$('select').val('1').trigger('change.select2');

有关这些示例,请参见此jsfiddle。感谢@minlare提供解决方案2。

说明:

假设我有一个最好的朋友,请选择人名。因此,Bob,Bill和John(在此示例中,我假定Value与名称相同)。首先,我在select上初始化select2:

$('#my-best-friend').select2();

现在,我在浏览器中手动选择Bob。接下来鲍勃做了一些调皮的事,我不再喜欢他了。因此系统为我取消选择了Bob:

$('#my-best-friend').val('').trigger('change');

或者说我让系统选择列表中的下一个而不是Bob:

// I have assume you can write code to select the next guy in the list
$('#my-best-friend').val('Bill').trigger('change');  

关于Select 2网站的注释(请参阅不建议使用和删除的方法),可能对其他人有用:

.select2('val') “ val”方法已被弃用,并将在Select2 4.1中删除。不建议使用的方法不再包含triggerChange参数。

您应该直接在基础元素上调用.val。如果需要第二个参数(triggerChange),则还应该在元素上调用.trigger(“ change”)。

$('select').val('1').trigger('change'); // instead of $('select').select2('val', '1');

8
这是正确的答案:它适用于单选和多选
Giovanni Di Milia

4
仅当没有将任何自定义操作绑定到change事件(例如重新加载表单)时,这才是可接受的解决方案。否则,这些动作将在触发时被冗余调用change()
van_folmert

如果无法正常工作,请添加setTimeout:setTimeout(function(){$(“ select”)。val(“ 1”)。trigger(“ change”);},1000);
亚伯

@van_folmert我有同样的问题。理想情况下,我想更改显示为选定状态的内容,而不触发事件(因为我绑定了一个自定义事件onChange
onebree '16

1
请参阅以下我的答案,以获取有关如何解决@van_folmert问题的示例
minlare

135

查看select2文档,您可以使用下面的方法获取/设置值。

$("#select").select2("val"); //get the value
$("#select").select2("val", "CA"); //set the value

@PanPipes指出,这对于4.x而言已更改(请在下面向他投赞成票)。val现在直接称为

$("#select").val("CA");

因此loadComplete,在jqGrid 内,您可以获取要查找的任何值,然后设置selectbox值。

来自文档的通知

注意,要使用此方法,必须在选项中定义initSelection函数,以便Select2知道如何将val()中传递的对象的id转换为需要呈现选择的完整对象。如果要附加到选择元素,则已经为您提供了此功能。


似乎不适用于我正在查看的演示。不知道为什么,这可能与它插入JqGrid的方式有关。
亚当·K·迪安

1
更新了答案。看来您必须手动将该函数添加到select2初始化中,以便它知道如何处理该val调用。
杰克

1
@AdamKDean:一个可以额外测试是否<select>在那里转换成select2由测试的类的存在性控制select2-offscreen<select>。搜索工具栏的所有元素都具有以gs_前缀开头且名称类似于in的id colModel。您可以使用getGridParam获取colModel
奥莱格

谢谢,我已经设法获取了过滤器信息,在使用select2select 重新创建过滤器栏之后,我只需要一种设置它的方法。我今天再看一下,也许我可以换个新眼睛修复它。再次感谢。更新:将代码包装在布尔检查中解决了我遇到的问题,尽管它停止刷新搜索栏,而不是再次选择上一个元素。
亚当·K·迪安


32
this.$("#yourSelector").select2("data", { id: 1, text: "Some Text" });

这应该有所帮助。


3
多个值示例:this。$(“#yourSelector”)。select2(“ data”,[{id:1,文本:“ Some Text”},{id:2,文本:“ Some Other Text”}]));
RodneyRd 2014年

18

这应该更容易。

$("#e1").select2("val", ["View" ,"Modify"]);

但是请确保您传递的值已经在HTMl中存在


17

如果要添加new value='newValue'text='newLabel',则应添加以下代码:

  1. 将新选项添加​​到<select>

    var opt = "<option value='newValue' selected ='selected'>" + newLabel+ " </option>";
    $(selLocationID).html(opt);
  2. 触发<select>更改为所选值:

    $(selLocationID).val('newValue').trigger("change");

我发现这比弄乱select2'data'更干净:)更改dom,让select2弄清楚其余部分。
Paulj

我正在Safari上进行测试,这是唯一可行的解​​决方案。其他人则更有说服力,我更喜欢它们,但最重要的是,我更喜欢工作代码。就是这样 :)
大卫

谢谢你一百万!我正在选择2个框,其中两个框都填充有Ajax,并且我为第一个框使用了额外的数据属性来使用此框设置第二个框的值。再次谢谢你!!!!
山姆

16

只是想添加第二个答案。如果已经将select呈现为select2,则需要将其反映在选择器中,如下所示:

$("#s2id_originalSelectId").select2("val", "value to select");

12

您有两个选择-@PanPipes回答指出您可以执行以下操作。

$(element).val(val).trigger('change');

仅当没有将任何自定义操作绑定到change事件时,这才是可接受的解决方案。在这种情况下,我使用的解决方案是触发一个select2特定事件,该事件将更新select2显示的选择。

$(element).val(val).trigger('change.select2');

是的,这是最好的全方位解决方案。确实,我认为Select2应该在更改值时自动触发内部“ change.select2”事件以更新显示。但是,这至少提供了一种简单的方法来更新显示以匹配新值,而无需触发自定义更改事件处理程序。
DaveInMaine'2

这个'$(element).val(val).trigger('change.select2');' 为我工作。谢谢@minlare。

9

设置select2中选择的String选项时遇到一些麻烦:

与选项:“选项字符串1 /选项”一起使用:

$('#select').val("string1").change(); 

但是带有一个带有值的选项:选项值“ E” string1 / option:

$('#select').val("E").change(); // you must enter the Value instead of the string

希望这对遇到同样问题的人有所帮助。


5

如果要选择一个值,请使用 $('#select').val(1).change()

如果要选择多个值,请在数组中设置值,以便可以使用此代码 $('#select').val([1,2,3]).change()


如果在方括号下输入字符串,则此功能将无效。
Utkarsh Pandey 2015年

5

对于V4 Select2,如果要同时更改select2的值和下拉菜单的文本表示形式。

var intValueOfFruit = 1;
var selectOption = new Option("Fruit", intValueOfFruit, true, true);
$('#select').append(selectOption).trigger('change');

这不仅会设置幕后的值,还会设置select2的文本显示。

https://select2.github.io/announcements-4.0.html#removed-methods中提取


尝试触发('change.select2')。trigger('select2:select'); 如果仅仅改变是不够的
Tebe



2

如果您有ajax数据源,请参考此以获取免费的bug

https://select2.org/programmatic-control/add-select-clear-items

//设置Select2控件

$('#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
        }
    });
});

1

如果您想在知道下拉列表中的文本但不知道其值时设置一个选定的项目,请参见以下示例:

假设您确定了一个时区并想进行设置,但其中包含值time_zone_id

        var timeZone = Intl.DateTimeFormat().resolvedOptions().timeZone;
        var $select2 = $('#time-zone');
        var selected = $select2.find("option:contains('"+timeZone+"')").val();
        $select2.val(selected).trigger('change.select2'); 

0
// Set up the Select2 control
$('#mySelect2').select2({
    ajax: {
        url: '/api/students'
    }
});

// Fetch the preselected item, and add to the control
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
        }
    });
});

字体:选择2个文档


0

您可以简单地使用get / set方法来设置值

$("#select").select2("val"); //get the value
$("#select").select2("val", "CA"); //set the value

或者您可以这样做:

$('#select').val("E").change(); // you must enter the Value instead of the string
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.