2012-01-26 7 views
6

Conosco il modo in cui ho codificato il plug-in per gestire più istanze. Sono abbastanza sicuro che almeno una delle mie variabili venga sovrascritta da ogni chiamata successiva del plugin. Comunque, ecco il codice del plugin:Il plug-in jQuery non funziona quando viene chiamato due volte

$.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)); 
      }); 
     }); 
    }); 
} 
}); 

Quando chiamo $('.something').dependsOn($('.somethingElse'));, funziona benissimo, ma se io lo chiamo di nuovo su altri due elementi, la variabile dipendente $ viene impostato su tale elemento.

Il punto del plug-in è mantenere le caselle di selezione disabilitate finché non viene modificata una casella di selezione precedente. Se ho tre caselle di selezione in una riga e voglio che la prima sia abilitata, la seconda dipende dalla prima e la terza dipende dalla seconda, chiamerei $(second).dependsOn($(first)) e $(third).dependsOn($(second)), quindi la modifica della prima sarebbe abilitata il secondo, ma non il terzo, e cambiare il secondo permetterebbe il terzo.

Ma con il codice corrente, la modifica del primo abilita il terzo, ma non il secondo (come ho detto, penso che sia perché $ dipendente viene sovrascritto e impostato sulla terza cosa dopo aver chiamato dependsOn due volte).

Se non è chiaro, fammi sapere.

+2

100% perfetto modello di una domanda. Chiara descrizione di ciò che vuoi e cosa non va, e il codice usato! Brillante. Se solo ci fosse un jsfiddle .... – mowwwalker

+0

Ho considerato un jsfiddle. Inizierò a metterne uno insieme. – Jake

+0

Nevermind, Gonzalo l'ha inchiodato. Vedi qui: http://jsfiddle.net/d8jUd/ – mowwwalker

risposta

5

Questo perché non si sta definendo una nuova variabile nell'ambito di dependsOf (che viene eseguita utilizzando var $dependent = blah). Invece, stai impostando il valore di $ (this) su una versione globale di $dependent.

Questo è il motivo per cui viene sostituito.

Buona fortuna :)

+0

Fantastico, questo era il problema. Grazie! – Jake

+0

Prego! –

1

Il modo in cui si sta dichiarando $dependant sta rendendo un globale variabile , così la prossima volta che la funzione viene chiamata imposta lo stesso globale $dependant al nuovo valore. Prova:

var $dependant = $(this);

Problemi correlati