调用两次时jQuery插件不起作用

时间:2012-01-26 03:30:24

标签: javascript jquery jquery-plugins

我知道这个问题与我编写插件以处理多个实例的方式有关。我非常确定至少有一个变量会被插件的每次后续调用覆盖。无论如何,这是插件代码:

$.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两次之后设置为第三个)。

如果不清楚,请告诉我。

2 个答案:

答案 0 :(得分:5)

那是因为您没有在dependsOf范围内定义新变量(使用var $dependent = blah完成)。相反,您将$(this)的值设置为$dependent的全局版本。

这就是它被替换的原因。

祝你好运:)

答案 1 :(得分:1)

您声明$dependant的方式是使其成为全局变量,因此下次调用该函数时,它会将相同的全局$dependant设置为新值。尝试:

var $dependant = $(this);