我知道这是我编写的插件处理多个实例的方式存在问题。我相信至少有一个变量被每个后续调用插件覆盖了。无论如何,这是插件代码:
$.fn.extend({
dependsOn: function( $claimer ){
$dependent = $(this);
$claimer.change(function(){
alert( $dependent.attr('id') );
var $selected = $('option:selected', this);
var pk = $selected.attr('class');
$dependent.removeAttr('disabled');
$dependent.find('option').each(function(){
$hiddenOpts = $dependent.parent().find('.hiddenOptions');
$hiddenOpts.append( $(this) );
$hiddenOpts.find('option').each(function(){
if( $(this).attr('ref') == pk || $(this).hasClass('empty') )
$dependent.append( $(this) );
});
});
});
}
});
当我调用
$('.something').dependsOn( $('.somethingElse') );
时,它可以正常工作,但如果我在另外两个元素上再次调用它,$dependent变量就会被设置为那个元素。该插件的目的是保持选择框禁用状态,直到先前的选择框更改。如果我有三个连续的选择框,我想让第一个启用,第二个依赖于第一个,第三个依赖于第二个,我会调用
$(second).dependsOn( $(first) )
和$(third).dependsOn( $(second) )
,这样更改第一个选择框将启用第二个选择框但不启用第三个,更改第二个选择框将启用第三个选择框。但是,由于$dependent被重写并设置为第三个元素,因此当前代码会使更改第一个选择框启用第三个选择框,但不启用第二个选择框(我认为是因为调用了两次dependsOn)。
如果不清楚,请告诉我。