2

我有两个选择,当第一个更改时,我正在重新创建第二个,如下所示:

    _selectSubcategory : function (parent_id) {
        this.id('cat_select').find('option').remove().end();
        var option_list = [];
        option_list.push('<option selected value="0"></option>');
        $.each(this._data.categories, function (k, cat) {
            if (cat.parent_id == parent_id) {
                option_list.push('<option value="' + cat.cat_id + '">' + cat.cat_name + '</option>');
            }

        }.bind(this));

        this.id('cat_select').append(option_list.join('\n'));
}

我在这个选择的“改变”事件上有一个事件监听器。

问题是每次我调用时都会触发此事件_selectSubcategory。我如何解决它?

4

1 回答 1

0

如评论中所述,除非您删除当前选择的元素,否则它应该可以正常工作

您可以option[selected]在重新填充列表时添加要豁免的条件,或者在您操作整个<select>.

您可以使用.one耦合.stopPropagation来忽略通过重新加载列表触发的更改。就像是:

var $select = $('#options');
$('#add').click(function(e){
    var val = Math.floor(Math.random() * 1000),
        opt = 'option ' + val;
    $('<option>',{'value':'val','html':opt}).appendTo($select);
});
$('#reset').click(function(e){
    $select.one(function(e){
        e.stopPropagation();
    });
    var newopts = {
        '0': 'Please select one...',
        '1': 'Option 1',
        '2': 'Option 2',
        '3': 'Option 3'
    };
    var $lastOpt = $select.find('option').last(),
        newValue;
    // add the new options first
    $.each(newopts, function(v,k){
        if (!newValue) newValue = v;
        $('<option>',{'value':v,'html':k}).appendTo($select);
    });
    // change index once (.one will catch and suppress the change event)
    $select.val(newValue);
    // remove previous elements
    $lastOpt.add($lastOpt.prevAll()).remove();
});
$('#options').change(function(e){
    $('#debug').append('Change detected.\n');
});

更新示例:http: //jsfiddle.net/pUyZ7/1/

于 2013-08-27T12:30:17.953 回答