以编程方式更改值时,Dojo选择onChange事件触发

标签 dojo dijit.form

我有一个dojo(dijit)select下拉列表,它调用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); 
    }

最佳答案

我认为在这种情况下,正确的解决方法是http://bugs.dojotoolkit.org/ticket/10594,因为它直接处理dijit.form.Select。当然,有几种方法可以解决此问题。

  • 升级dojo :)。
  • 继承dijit.form.Select并“修补” _updateSelection函数。
  • 扩展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);
            }
       }
    });
    

    请注意,我没有编写此函数,我很高兴从源代码中抄袭它,最后一行删除了this._handleOnChange(this.value)。
    myWidget.attr('value', newValue, false) // should now work without firing onChange.
    

    关于以编程方式更改值时,Dojo选择onChange事件触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3229747/

    相关文章:

    javascript - Dojo:获取对 dijit.form.Select 中单击项的访问权限?

    javascript - 如何将 onClick 监听器注册到 GridX 中的 dijit 按钮?

    javascript - 如何使用dojo上传图片?

    javascript - Dojo 无法通过 ID 获取元素

    dojo - 在没有 dojo.declare() 的情况下使用 dojo.require()

    javascript - 如何使用 Dojo 循环遍历表单元素/字段

    dojo - 自定义小部件内的 Dijit Tabcontainer-Tablist 宽度运行太长

    javascript - Dojo:在 OnChange 上获取 inlineEditBox 的 ID

    dojo - 带有复杂下拉菜单的 dijit.form.ComboBox

    javascript - 以编程方式声明 dijit.form.select 的值