ugrás a tartalomhoz

jQuery click eventre this átadása

gtoma · 2014. Szep. 8. (H), 14.07
Van egy gyakorlati, és elvi kérdésem. Izzaszt a dolog már rég óta.
A jelenlegi problémámon keresztül tenném fel a kérdést.

Van egy javascript funkcióm:
  1. var mcChoser = function(args) {  
  2.     for (arg in args) { this[arg] = args[arg]; }  
  3.   
  4.     this.Start = function() {  
  5.         console.log('start'this.ID);  
  6.         self = this;  
  7.         $jq('#'this.ID +' a').click(function(e){ self.Chosed(e); });  
  8.     }  
  9.   
  10.     this.Chosed = function(e) {  
  11.         console.log( this );  
  12.         ifthis.multiple == true ) { $jq(e.currentTarget).toggleClass('active'); }  
  13.         else {  
  14.             var vane = $jq(e.currentTarget).hasClass('active');  
  15.             $jq('#'+this.ID+' a.active').removeClass('active');  
  16.             if( vane == false ) { $jq(e.currentTarget).addClass('active'); }  
  17.         }  
  18.         this.setValues();  
  19.     }  
  20.   
  21.     this.setValues = function() {  
  22.         var List = $jq('#'this.ID +' a.active');  
  23.         var HTML = '';  
  24.         $jq('#'+this.ID + ' [name="'this.inputname +'"]').remove();  
  25.         if( List.length > 0 ) { for(i=0; i<List.length; i++) { HTML += '<input type="hidden" name="'this.inputname +'" value="'+ $jq(List[i]).data('data') +'">'; } }  
  26.         $jq('#'this.ID).append(HTML);  
  27.     }  
  28.   
  29.     this.Start();  
  30. }  
Elméletileg működik a dolog. HTML:
  1. <div data-input="type" id="filetype" class="iconlist">  
  2.         <a class="btn-icon" title="Képek" data-data="kep" href="javascript:void(0);" ><i class="fa fa-file-image-o"></i></a>  
  3.         <a class="btn-icon" title="Média" data-data="media" href="javascript:void(0);"><i class="fa fa-file-movie-o"></i></a>  
  4.         <a class="btn-icon" title="Dokumentum" data-data="documentum" href="javascript:void(0);"><i class="fa fa-file-text-o"></i></a>  
  5.         <a class="btn-icon" title="Egyéb" data-data="egyeb" href="javascript:void(0);"><i class="fa fa-file-word-o"></i></a>  
  6.         </div>  
És az indítás:
  1. filetype = new mcChoser({ID:"filetype"});  
Ami a gond, hogy ha 2 id-re akarom indítani a funkciót, akkor bizony az utolsó indítás adatait használja meg.

http://jsfiddle.net/4xgf2vsh/5/
Itt látszik is, hogy az alsó sor működik, a felső be van zavarodva, de ha az alsó sor indítását kiszedjük, akkor működik a felső sor.

azaz a this változó felülíródik az előtte lévők esetében is, hogyan hivatkozhatnék a példányosított verzióra?! Vagy hogyan adhatnám át a this változót, hogy azt használja?
 
1

bind / $.proxy

Poetro · 2014. Szep. 8. (H), 14.17
Inkább Function#bind-ot vagy $.proxy-t használnék:
  1. $('#'this.ID +' a').click($.proxy(this.Chosed, this));  
Ez megoldja a this értékét.
Igazából az igazi probléma hogy a self egy globális változó, és az utolsó értéke nem az, mint amire számítasz.
2

var

Endyl · 2014. Szep. 8. (H), 14.20
A problémádat konkrétan az okozza, hogy a globális névtérben használod a self változót ahelyett, hogy deklarálnád var használatával a függvényen belül.
3

Szégyenlem

gtoma · 2014. Szep. 9. (K), 10.25
Igen, a var hiányzott. Szégyenlem, hogy fel sem tűnt...

Köszönöm nektek! :(
4

Szerintem a hiba nem a var

spapp · 2014. Szep. 10. (Sze), 11.40
Szerintem a hiba nem a var hiánya volt!
A hiba az, hogy akartál self változót használni!

Így kellett volna (minimum):
  1. $jq('#'this.ID +' a').click(this.Chosed.bind(this));   
De még pontosabban:
  1. this._element = $(this.ID);  
  2. this._elenet.delegate('a''click'this.Chosed.bind(this));  
És mindezt a construktorban, mert a Start függvénynek sok hasznát és értelmét nem látom. Főleg nem a construktorban létrehozva (ez igaz a többire is).

Remélem azért ezzel a kóddal nem vagy elégedett?!
Mert ez nagyon-nagyon-nagyon nincs rendben!
Ez egy "állatorvosi ló"!