我有一个dojo(dijit)选择下拉列表调用js函数onChange.我希望这只在用户更改下拉列表中的值时调用onChange函数,但是,当我以编程方式更改js代码下拉列表的值时,它甚至会调用onChange函数.如何在用户更改下拉值时仅调用该函数?当我以编程方式更改值时,它不应该调用该函数.
<select jsId="ddlBoundaryType" id="ddlBoundaryType" name="ddlBoundaryType"
dojoType="dijit.form.Select">
<option value="0">Circle</option>
<option value="1">Polygon</option>
</select>
dojo.addOnLoad(InitBoundaries);
function InitBoundaries() {
dojo.connect(dijit.byId("ddlBoundaryType"), 'onChange', Boundaries_ChangeBoundaryType);
}
Run Code Online (Sandbox Code Playgroud)
谢谢,贾斯汀
Bil*_*ese 11
通常人们通过使用priorityChange标志来解决这个问题:
myWidget.set("value", 1234, false);
Run Code Online (Sandbox Code Playgroud)
这将解决您的问题,除了价值最初为123的细微问题,您以编程方式将其设置为456,然后用户将其设置回123,在这种情况下,用户操作不会有onChange()事件无论是.
因此,您还可以:
myWidget._lastValueReported=null;
Run Code Online (Sandbox Code Playgroud)
我认为在这种情况下,对您来说正确的修复方法是http://bugs.dojotoolkit.org/ticket/10594,因为它直接处理 dijit.form.Select 。当然,有几种方法可以解决这个问题。
我会放弃第一个。第二种和第三种方法类似,所以我将使用第三种方法发布一个简单的修复,
dijit.form.Select.extend({
_updateSelection: function() {
this.value = this._getValueFromOpts();
var val = this.value;
if(!dojo.isArray(val)){
val = [val];
}
if(val && val[0]){
dojo.forEach(this._getChildren(), function(child){
var isSelected = dojo.some(val, function(v){
return child.option && (v === child.option.value);
});
dojo.toggleClass(child.domNode, this.baseClass + "SelectedOption", isSelected);
dijit.setWaiState(child.domNode, "selected", isSelected);
}, this);
}
}
});
Run Code Online (Sandbox Code Playgroud)
请注意,我没有编写这个函数,我很高兴地从源代码中抄袭了它,并删除了最后一行 this._handleOnChange(this.value) 。
myWidget.attr('value', newValue, false) // should now work without firing onChange.
Run Code Online (Sandbox Code Playgroud)