Ausführung eines jquery Scripts nach laden eines Views per Ajax
Eingetragen von t2k (258)
am 26.04.2014 - 21:28 Uhr in
am 26.04.2014 - 21:28 Uhr in
Hallo!
Ich hänge grad an einer wundersamen Sache:
Und zwar habe ich eine View mit einem Exposed-Filter.
Die View gibt DIVs aus, in die ich mit jquery eine Accordeon-Funktion eingebaut habe.
Das läuft auch alles soweit.
Nachdem ich den Filter ausgefürt habe geht allerdings nix mehr.
Hier mein jquery-Code. Vielleicht fällt ja jemanden was auf oder ein!
(function ($) {
Drupal.behaviors.myFunctions = {
attach: function(context, settings) {
$(".ueberdiv .weitere-infos, .ueberdiv .titel ").click(function(){
if ($(this).parents(".ueberdiv").find(".link a").hasClass("schliessen")){
$(this).parents(".ueberdiv").find(".unten").slideUp("fast");
$(this).parents(".ueberdiv").find(".link a").removeClass("schliessen");
$(this).parents(".ueberdiv").find(".link a").text("weitere Informationen");
$(this).removeClass("schliessen");
return false;
}
if (!$(this).parents(".ueberdiv").find(".link a").hasClass("schliessen")){
$(this).parents(".ueberdiv").find(".unten").slideDown("fast");
$(this).parents(".ueberdiv").find(".link a").addClass("schliessen");
$(this).parents(".ueberdiv").find(".link a").text( "schließen");
$(this).addClass("schliessen");
return false;
}
});
}
};
})(jQuery);
- Anmelden oder Registrieren um Kommentare zu schreiben
Ok, es läuft!
am 26.04.2014 - 23:55 Uhr
Ok, ich habe selbst eine Lösung gefunden.
Ich hatte einen jQuery-Fehler drin (die ifs haben sich überschrieben), den ich mit dem "else" gelöst haben.
Außerdem habe ich vor das click ein ".once()" gesetzt.
Fürs Erste läuft es. Aber warum das once nötig ist und aus welchem Grund die click-Funktion da scheinbar mehrfach ausgeführt wird nach dem der View neu geladen hat, versteh ich nicht.
Kann da jemand was zu sagen?
(function ($) {
Drupal.behaviors.myFunctions = {
attach: function(context, settings) {
$(".ueberdiv .weitere-infos, .ueberdiv .titel ").once().click(function(){
if ($(this).parents(".ueberdiv").find(".link a").hasClass("schliessen")){
$(this).parents(".ueberdiv").find(".unten").slideUp("fast");
$(this).parents(".ueberdiv").find(".link a").removeClass("schliessen");
$(this).parents(".ueberdiv").find(".link a").text("weitere Informationen");
$(this).removeClass("schliessen");
return false;
}
else {
$(this).parents(".ueberdiv").find(".unten").slideDown("fast");
$(this).parents(".ueberdiv").find(".link a").addClass("schliessen");
$(this).parents(".ueberdiv").find(".link a").text( "schließen");
$(this).addClass("schliessen");
return false;
}
});
}
};
})(jQuery);
Naja Drupal führt jedes Mal,
am 27.04.2014 - 02:00 Uhr
Naja Drupal führt jedes Mal, wenn neuer Content via Ajax hinein kommt, die Listener von Drupal.behaviors aus. Initial ist context das Document also die ganze Website. Ansonsten das Teilstück was durch Ajax hinein kam. Diesen context kannst du bei deinem Selektor verwenden.
Und .once() fügt eine Klasse hinzu initial und wenn das ganze ein zweites Mal durchlaufen wird, sie ja bereits da und der Rest wird nicht mehr ausgeführt. Aber once sieht irgendwie falsch aus. Siehe https://github.com/RobLoach/jquery-once als Referenz.
den fehler sehe ich jetzt
am 27.04.2014 - 05:21 Uhr
den fehler sehe ich jetzt auch nicht, aber es gibt doch das modul views accordion
Hallo, für sowas gibt es
am 27.04.2014 - 10:10 Uhr
Hallo,
für sowas gibt es eigentlich 'toggle' mit seinen Derivaten (z.B slideToggle), 'write less do more'...
Gruß
Christian
Vielen Dank für eure
am 27.04.2014 - 23:30 Uhr
Vielen Dank für eure Antworten!!!
@Tobias:
Naja Drupal führt jedes Mal, wenn neuer Content via Ajax hinein kommt, die Listener von Drupal.behaviors aus. Initial ist context das Document also die ganze Website. Ansonsten das Teilstück was durch Ajax hinein kam. Diesen context kannst du bei deinem Selektor verwenden.
Kannst du das genauer beschreiben?
Wie müsste der Code dann aussehen, damit das funktioniert?
@caw:
den fehler sehe ich jetzt auch nicht, aber es gibt doch das modul views accordion
Darüber habe ich auch nachgedacht. Allerdings hab ich die Befürchtung, dass es einigen Gefrickel ist, das an das gewünschte Design anzupassen.
@oteno:
für sowas gibt es eigentlich 'toggle' mit seinen Derivaten (z.B slideToggle), 'write less do more'...
Hatte ich drüber nachgedacht, aber ich glaub das ist für ein Accordion nicht wirklich geeignet...