【发布时间】:2012-01-26 03:30:23
【问题描述】:
我知道这是我编写用于处理多个实例的插件的方式的问题。我很确定至少有一个变量被插件的每个后续调用覆盖。无论如何,这是插件代码:
$.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) ),所以更改first 将启用第二个但不启用第三个,更改第二个将启用第三个。
但是对于当前的代码,更改第一个会启用第三个,而不是第二个(就像我说的,我认为这是因为 $dependent 被覆盖并在两次调用 dependsOn 后设置为第三个)。
如果不清楚,请告诉我。
【问题讨论】:
-
100% 完美的问题模型。清楚地描述你想要什么,出了什么问题,以及使用的代码!杰出的。如果只有一个 jsfiddle....
-
我认为是 jsfiddle。我会开始组装一个。
-
没关系,Gonzalo 做到了。见这里:jsfiddle.net/d8jUd
-
是的,他做到了!计划在 SO 允许后接受。
标签: javascript jquery jquery-plugins