假设页面上有两个select2元素,都使用' onChange'。 要以编程方式在一个select2元素中设置值,请使用
$('#id1').val('xyz').trigger('change');
如果在这两个元素之一中进行选择时要将另一个元素重置为初始值,则 onChange 事件将由值设置触发,系统将进入无限循环。 如果您使用
,也会发生同样的情况$('#id1').val('xyz').trigger('change.select2')
答案 0 :(得分:2)
要避免无限循环,请使用触发方法参数 区分事件调用,在触发器方法用法中添加参数和事件回调检查是否存在参数,当参数存在时表示事件是从代码触发的,如果不是,则表示它是来自ui的事件。
检查此代码示例的工作原理。
$(function(){
$('#id1').on("change",function(e, state){
//we check state if exists and is true then event was triggered
if (typeof state!='undefined' && state){
console.log('change #1 is triggered from code');
return false;
}
console.log('change #1 is from ui');
});
$('#id2').on("change",function(e, state){
//we check state if exists and is true then event was triggered
if (typeof state!='undefined' && state){
console.log('change #2 is triggered from code');
return false;
}
console.log('change #2 is from ui');
});
});
/**TEST CODE TO TRIGGER CHECK **/
setTimeout(function(){
$('#id1').val('1').trigger('change',[true]); //here is paramater - [true]
$('#id2').val('2').trigger('change',[true]);//here is paramater - [true]
$('#id1').val('3').trigger('change',[true]); //here is paramater - [true]
$('#id2').val('3').trigger('change',[true]);//here is paramater - [true]
},1000);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<span>Select 1</span>
<select id="id1">
<option val="1" >1</option>
<option val="2" >2</option>
<option val="3" >3</option>
</select>
<span>Select 2</span>
<select id="id2">
<option val="1" >1</option>
<option val="2" >2</option>
<option val="3" >3</option>
</select>
答案 1 :(得分:0)
我创建了一个保护函数。我使用了事件对象并检查了未定义对象。当未定义时,我知道它的代码,所以我退出了该函数。这样一来,您可以在初次单击时运行代码,然后忽略人工操作的代码。
$("#id1").on('change',function(e){
if(e.originalEvent === undefined)return;//bail out if code caused it
//do stuff here
});
答案 2 :(得分:-1)
在this answer中,我们发现这不是设置select2
值的方法,但是:
$('#id1').select2("val", "xyz");