我知道这个问题与我编写插件以处理多个实例的方式有关。我非常确定至少有一个变量会被插件的每次后续调用覆盖。无论如何,这是插件代码:
$.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变量将设置为THAT元素。
插件的目的是保持选择框被禁用,直到更改前一个选择框。如果我连续有三个选择框,并且我希望第一个启用,第二个依赖于第一个,第三个依赖于第二个,我会调用$(second).dependsOn( $(first) )
和{{1因此,更改第一个将启用第二个而不是第三个,然后更改第二个将启用第三个。
但是使用当前代码,更改第一个启用第三个,但不是第二个(就像我说的,我认为它是因为$ dependent被覆盖并在调用dependsOn两次之后设置为第三个)。
如果不清楚,请告诉我。
答案 0 :(得分:5)
那是因为您没有在dependsOf
范围内定义新变量(使用var $dependent = blah
完成)。相反,您将$(this)的值设置为$dependent
的全局版本。
这就是它被替换的原因。
祝你好运:)答案 1 :(得分:1)
您声明$dependant
的方式是使其成为全局变量,因此下次调用该函数时,它会将相同的全局$dependant
设置为新值。尝试:
var $dependant = $(this);