ugrás a tartalomhoz

Ajax után bind

eMeLA · 2012. Feb. 25. (Szo), 18.13
Van egy ilyen kódom (Drupal 7.x, JQuery)

(function ($) {
$(document).ready(function() {
  init(); 
});

function init() {
  // kikapcs-bekapcs
  $(".select-field-wrapper").bind("change", function(e){
    $("td:has(#"+this.value+") div.form-wrapper").slideUp("slow");
    $("#"+this.value).slideDown("slow");     
  });
 
  // ajax betöltés után
  $("#more").bind("ajaxComplete ", function(){
    init();
  });

}

})(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.
$("#more").live('bind', function(){
init(); 
};
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:
(function ($) {
  Drupal.behaviors.myModuleSecureLink = {
    attach: function (context, settings) {      
      $('.select-field-wrapper', context).live("change", function(){
        $("td:has(#"+this.value+") div.form-wrapper").slideUp("slow");
        $("#"+this.value).slideDown("slow");                    
      });      
    }
  }

  Drupal.behaviors.myModuleMagic = {
    attach: function (context, settings) { }
  };
}(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.)

    (function ($) {  
      Drupal.behaviors.myModuleSecureLink = {  
        attach: function (context, settings) {        
          $('.select-field-wrapper', context).once('myModuleSecureLink').change(function(){  
            $("td:has(#"+this.value+") div.form-wrapper").slideUp("slow");  
            $("#"+this.value).slideDown("slow");                      
          });        
        }  
      }    
    }(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