ugrás a tartalomhoz

Ajax után bind

eMeLA · 2012. Feb. 25. (Szo), 18.13
Van egy ilyen kódom (Drupal 7.x, JQuery)
  1. (function ($) {  
  2. $(document).ready(function() {  
  3.   init();   
  4. });  
  5.   
  6. function init() {  
  7.   // kikapcs-bekapcs  
  8.   $(".select-field-wrapper").bind("change"function(e){  
  9.     $("td:has(#"+this.value+") div.form-wrapper").slideUp("slow");  
  10.     $("#"+this.value).slideDown("slow");       
  11.   });  
  12.    
  13.   // ajax betöltés után  
  14.   $("#more").bind("ajaxComplete "function(){  
  15.     init();  
  16.   });  
  17.   
  18. }  
  19.   
  20. })(jQuery);  
A "kikapcs-bekapcs" rész jól működik. A gond ott kezdődik, hogy a "#more" egy olyan gomb, melynek hatására egy Ajax lekérdezés után újratöltődik a ".select-field-wrapper".
Ugyan én újrahívom az Ajax lefutás után a init() rész (ami le is fut), de a bind "eltűnik" a .select-field-wrapper-ról.

Nem vagyok programozó, de szeretnék valami útmutatást. Én arra gyanakszom, hogy a "ajaxComplete"-kor még nincs a helyén(?) a .select-field-wrapper, így nem bind-elődik. Vagy rosszul csinálok valamit ?
 
1

AJAX

Poetro · 2012. Feb. 25. (Szo), 18.58
Mivel gondolom hasonló eseményben van a DOM-hoz pakolva a .select-field-wrapper, ezért érdemes lehet elhalasztani az eseményt. Valamint azt is hozzá kell tenni, hogy nem véletlen jött létre egy gyakorlat a Drupal-ban az események hozzárakásánál. Érdemes megnézni a beépített Drupal modulokat, és utána nézni, mi is az a Drupal.behaviors objektum.
2

rosszul

nova76 · 2012. Feb. 25. (Szo), 22.40
A bind helyett a live kellene neked, ahelyett hogy újrahívogatod.
3

Mint ahogyan Poetro is

pp · 2012. Feb. 25. (Szo), 22.49
Mint ahogyan Poetro is említette érdemes lenne a Drupal standardokat követni, ha már egy keretrendszert használsz. A linkelt dokumentumban olvashatod hogyan kell megfelelően megvalósítani amit akarsz. Minden szükséges esetben meg lesz hívva a függvényed (nem kell a névteret teleszemetelned init függvényekkel), és csak azokra az elemekre fog hatni amelyekre szükséges. (lásd context és once)

pp
4

live

cSuwwi · 2012. Feb. 26. (V), 01.56
Ahogy már említették: .live()
Én ezt úgy szoktam "magyarázni", hogy ahol menet közben változik a tartalom (ajax) és ott kell túrkálni, akkor .live() kell.
  1. $("#more").live('bind'function(){  
  2. init();   
  3. };  
5

Köszönöm az iránymutatást,

eMeLA · 2012. Feb. 27. (H), 00.14
Köszönöm az iránymutatást, remélem ez már megfelel a Drupal standard-nak:
  1. (function ($) {  
  2.   Drupal.behaviors.myModuleSecureLink = {  
  3.     attach: function (context, settings) {        
  4.       $('.select-field-wrapper', context).live("change"function(){  
  5.         $("td:has(#"+this.value+") div.form-wrapper").slideUp("slow");  
  6.         $("#"+this.value).slideDown("slow");                      
  7.       });        
  8.     }  
  9.   }  
  10.   
  11.   Drupal.behaviors.myModuleMagic = {  
  12.     attach: function (context, settings) { }  
  13.   };  
  14. }(jQuery));  
Mos tmár az új elemekhez is hozzárendelődik a script és le is fut. Viszont van két újabb furcsaság.

Ugyan mindegyik .select-field-wrapper (ez egy select) megváltoztatásánál lefut a script, viszont csak mindig az utolsó .select-field-wrapper-nél látszik a slideUp és slideDown. Ami még érdekes, hogy ott nem egyszer, hanem többször is lefut a script.
6

Mondjuk könnyebb lenne, ha a

pp · 2012. Feb. 27. (H), 07.51
Mondjuk könnyebb lenne, ha a html részt is látnánk. :) (nekem pl. furcsa, hogy egy wrapper div change eseményére kötsz eseménykezelőt, meg az egész formot felcsukod.)
  1. (function ($) {    
  2.   Drupal.behaviors.myModuleSecureLink = {    
  3.     attach: function (context, settings) {          
  4.       $('.select-field-wrapper', context).once('myModuleSecureLink').change(function(){    
  5.         $("td:has(#"+this.value+") div.form-wrapper").slideUp("slow");    
  6.         $("#"+this.value).slideDown("slow");                        
  7.       });          
  8.     }    
  9.   }      
  10. }(jQuery));  
a myModuleSecureLink azonosítókat is le lehetne cserélni.

pp
8

Köszönöm. Ez kellett még, és

eMeLA · 2012. Feb. 27. (H), 21.12
Köszönöm. Ez kellett még, és még a középső rész némi átvariálása. Most már úgy működik is úgy ahogy én elképzeltem.
(azért nem adtam linket, mert lokális gépen van a forrás)
7

jquery bind egyebek jó kis

szabo.b.gabor · 2012. Feb. 27. (H), 17.25
jquery bind egyebek jó kis cikk