2012-01-26 6 views
6

Я знаю, что это проблема с тем, как я закодировал плагин для работы с несколькими экземплярами. Я уверен, что хотя бы одна из моих переменных перезаписывается каждым последующим вызовом плагина. Во всяком случае, вот код плагина:Плагин jQuery не работает при вызове дважды

$.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'));, он отлично работает, но если я называю его снова на два других элементах, зависимые переменные $ получает значение этого элемента.

Пункт плагина состоит в том, чтобы блокировать отдельные блоки, пока не будет изменен предыдущий поле выбора. Если у меня есть три строки выбора в строке, и я хочу, чтобы первая была включена, вторая зависела от первой, а третья зависела от второй, я бы вызвал $(second).dependsOn($(first)) и $(third).dependsOn($(second)), поэтому изменение первого затем включало бы второе, но не третье, а второе - включение третьего.

Но с текущим кодом, изменение первого позволяет третий, но не второй (как я уже сказал, я думаю, что это потому, что $ depends перезаписывается и устанавливается на третье место после вызова dependOn дважды).

Если это неясно, дайте мне знать.

+2

100% совершенная модель вопроса. Четкое описание того, что вы хотите, и что происходит не так, и используемый код! Brilliant. Если бы только был jsfiddle .... – mowwwalker

+0

Я считал jsfiddle. Я начну складывать вместе. – Jake

+0

Ничего, Гонсало прибил его. См. Здесь: http://jsfiddle.net/d8jUd/ – mowwwalker

ответ

5

Это потому, что вы не определяете новую переменную в области dependsOf (которая выполняется с использованием var $dependent = blah). Вместо этого вы устанавливаете значение $ (this) для глобальной версии $dependent.

Именно по этой причине его заменяют.

Удачи :)

+0

Удивительно, в этом была проблема. Благодаря! – Jake

+0

Добро пожаловать! –

1

Путь вы объявляя $dependant делает его глобальной переменной, поэтому в следующий раз, когда функция называется она устанавливает ту же глобальную $dependant на новое значение. Попробуйте:

var $dependant = $(this);

Смежные вопросы