[UNGELÖST]Weiteres Problem mit drupal_get_title()/[UNGELÖST]Neuladen eines Javascripts nach Seitenwechsel mit AJAXFunktionalität
am 13.08.2010 - 21:13 Uhr in
Hallo,
folgendes Problem:
Ich lasse mir per View diverse Sachen anzeigen und habe die Anzeige auf x Beiträge beschränkt.
Möchte nun mit einer Seitennavigation auf die weiteren Ergebnisse des views zugreifen. So weit so gut,
funktioniert auch alles recht gut, jedoch verliert ein Javascript, welches auf die Elemente angewendet wird seine Wirkung
und der Breadcum gibt mir auch nur Schwachsinn zurück.
Im Detail:
Diese Funktion stellt mir die "opacity" von Bildern dynamisch bei Mouse-Over:
$(function(){
$("span.field-content a img").css("opacity",.4) // Sets starting opacity
$("span.field-content a img").hover(function(){
$(this).stop().animate({opacity:1},"fast");
}, function() {
$(this).stop().animate({opacity:.4},"fast");
}
);
});
Dies funktionbiert so lange gut, bis ich per Ajax-Funktionalität die Seite der "views"-Abfrage wechsle.
Sprich das Javascript müßte nue "initialisiert" werden. Gibt es hier irgendwie die Möglichkeit eines Callbacks? Mir ist die AJAX-Funktionalität der Pager-Funktion noch ein wenig spanisches Dorf.
Natürlich müßte man die Funktion noch bennnen oder den ganzen Code neu ausführen lassen, anstatt die Funktion als Argument aufzurufen (aber das ist dann Kosmetik).
Weiters besteht ein Problem bei Verwendung der Ajax-Funktionalität mit der drupal_get_title(); Funktion. Ich lasse mir im Kopfbereich des views den Titel Ausgeben. Das funktioniert natürlich bis zum Aufruf der Ajax-Seitennavigation einwandfrei, danach wird anstatt dem Titel nur mehr das Wort "Ansichten" ausgegeben.
Natürlich könnte ich den Titel hardgecodet hinschreiben, aber es geht da um's Verständnis.
Würde mich freuen, wenn mir hier jemand helfen könnte.
Vielen Dank im Voraus
- Anmelden oder Registrieren um Kommentare zu schreiben
Das Problem mit dem
am 13.08.2010 - 22:06 Uhr
Das Problem mit dem Javascript laden habe ich bereits gelöst:
/sites/all/modules/views/js/ajax.js
Nach ca. Linie 148 folgendes hinzugefügt:
$.getScript('Pfad/zum/Skript', function () { alert('geladen'); });
Natürlich ist die alert-Funktion nur für Testzwecke ;)
Event
am 13.08.2010 - 22:28 Uhr
Hallo.
Du kannst die Funktion als zusätzliches Event-Callback an den "weiter"-Link (bzw. alle Links des Views-Pagers) hängen. Schau mal auf docs.jquery.com, da steht genau, wie das funktioniert.
Und bitte nicht die Dateien von bestehenden Modulen und dem Drupal Kern verändern.
1. baust Du somit eventuelle Sicherheitslücken ein und 2. sind Deine Änderungen nach dem nächsten Update wieder weg.
hth,
Stefan
Tipp: Beachte die Verhaltensregeln des DrupalCenter.
Hallo, danke für deine
am 14.08.2010 - 08:18 Uhr
Hallo,
danke für deine Antwort. Das Problem mit der Funktion habe ich gelöst, Sicherheitsrisiko sehe ich keines und bezüglich Update hast du natürlich vollkommen recht.
Weiters kann ich mit deiner Hilfestellung nichts anfangen.
A callback is a function that is passed as an argument to another function and is executed after its parent function has completed. The special thing about a callback is that functions that appear after the "parent" can execute before the callback executes. Another important thing to know is how to properly pass the callback. This is where I have often forgotten the proper syntax.
Nett, und wie baue ich das dann ein? Natürlich kannst du auf die Anleitung im Sinne von RTFM verweisen, aber die hilft nun mal nicht weiter, denn ich muss das Javascript von Views beeinflussen und wenn du mir sagst, wie ich das ohne Core-Hack mache, wäre ich dir dankbar, ansonsten habe ich die Lösung, wie gesagt, bereits gepostet.
Konkret besteht aber noch das Problem mit drupal_get_title(). Die Funktion liefert mir nach einem AJAX-Seitenwechsel einen falschen Titel.
Also für mich sieht das aus
am 14.08.2010 - 09:21 Uhr
Also für mich sieht das aus wie "works as designed". Drupal liefert den Titel der Seite, aus einem normalen Seitenaufruf und speichert ihn in einer statischen Variablen. Offensichtlich geht Views jetzt hin und verändert den Titel beim Ajax-Aufruf auf "Views" (übersetzt: "Ansichten"). Du kannst Dich allenfalls beklagen, daß Views dieses Verhalten zeigt, aber die Funktion drupal_get_title ist nicht daran schuld. Evtl gibt es ja in Views die Möglichkeit einen passenderen Titel zu setzen (notfalls durch Themen der View).
Beste Grüße
Werner
.
Werner
drupal-training.de
Moderator und Drupal Trainer
* - - - - - - - - - - - - - - - - - - - - - - - - - - - *
Event-Handler
am 14.08.2010 - 09:31 Uhr
Sicherheitsrisiko sehe ich keines
Naja, vielleicht nicht bei dieser Änderung. Und Sicherheitsrisiken haben meistens die Eigenheit, vom Autor nicht entdeckt zu werden.
ansonsten habe ich die Lösung, wie gesagt, bereits gepostet.
Sorry, aber eine Lösung ist das nicht wirklich. Das ist ein Hack.
Versuch doch einfach mal Folgendes in einer eigenen js-Datei:
Drupal.behaviors.customEvent = function(context) {
$('ul.pager > li > a').click(function () {
alert('Test');
});
}
Eventuell muss der Selektor noch ein wenig genauer spezifiziert werden, jedoch sollte das Prinzip klar sein.
Stefan
Tipp: Beachte die Verhaltensregeln des DrupalCenter.
Das was du in der Behavior
am 14.08.2010 - 10:05 Uhr
Das was du in der Behavior hast, habe ich ohne der Behavior bereits versucht (auf Anraten deines Links weiter oben). Konnte jedoch das Ereignis nicht "abfangen" ...
Ich probiere es noch mal.
Mit -> click konnte ich zwar
am 14.08.2010 - 11:01 Uhr
Mit -> click konnte ich zwar das Ereignis abfangen, das bringt aber nichts, es muss ja nach Beendigung der AJAX-Funktion etwas geladen werden.
Gut -> laut deinem Hinweis auf die API -> ajaxSuccess
Das funktioniert zwar in der Theorie:
Drupal.behaviors.customEvent = function(context) {
$('ul.pager > li > a').ajaxSuccess(function () {
$.getScript('pathe/to/js', function () {});
});
}
In der Praxis wird dann Firefox und Safari extrem langsam, das geladene Javascript zum Wechsel der "opacity" arbeitet extrem langsam und Seitenwechsel mit AJAX wird auch buggy und teilweise nicht ausgeführt.
Der Hack scheint bei mir die beste Lösung bis jetzt.
Nachtrag: Diese Konstellation bewirkt, dass sich bei mir Safari aufhängt (und Firefox wie gesagt auch kurz davor ist).