Script mit Callback im Redactor-Plugin ausführen

  • Hallo,
    nach dem Speichern (oder Abbrechen) eines Beitrags möchte ich bestimmten Tex-Code auf der Seite mit Javascript noch parsen. Dazu benutze ich die Callback-Funktion destroy des Redactor-Editors in der init-Funktion meines Plugins:

    JavaScript
    this.core.destroy = (function() {
      // mein Script
    }).bind(this);

    Funktioniert soweit ganz gut, wenn ich Abbrechen wähle. Speichere ich hingegen den Beitrag, ist mein Skript zu schnell und parst nicht, da der Inhalt wahrscheinlich noch nicht vollständig vom Editor ausgeliefert wurde. Gibt es eine Möglichkeit, dass das mein Skript erst ausgeführt wird, wenn der Inhalt vollständig vom Editor übertragen wurde?

  • Es ist ein wenig komplizierter, denn beim Absenden wir der Editor erst verworfen, wenn vom Server die Bestätigung der erfolgreichen Speicherung gemeldet wird, bis dahin bleibt der Editor aktiv. Anstatt jetzt nach Möglichkeiten zu suchen dein aktuelles Vorhaben umzusetzen, wäre es zielführender wenn du kurz beschreibst was du machen möchtest - beim wie kann ich dir dann eher helfen :)

  • Vielen Dank für die schnelle Antwort.
    Ich dachte eigentlich, dass die Callback-Funktion "destroy" auch erst nach der erfolgreichen Bestätigung vom Server aufgerufen wird. Dann liegt da mein Fehler.
    Das Plugin ist ein Formeleditor, der LaTex-Befehle umschlossen von den BBCode-Tags [math][/math] in einen Beitrag einfügt. Per Template-Listener wurde das Skript MathJax geladen und initialisiert, so dass die Formeln beim Laden der Seiten auch gerendert werden. Dafür durchsucht MathJax HTML-Elemente (div bzw. span), die eine bestimmte CSS-Klasse haben und formt dann den darin enthaltenen Code in hübsche Formeln um.
    Bearbeite ich nun einen Beitrag (nicht die "erweiterte Bearbeitung"), speichere die Änderung oder entscheide mich dagegen, wird die Seite nicht neu geladen und folglich die Formel auch nicht erneut geparst. Mit einem weiteren Skript kann aber das erneute Parsen veranlasst werden. Dazu muss aber die dafür vorgesehene CSS-Klasse gefunden werden. Das funktioniert folglich nicht, wenn das Skript schneller als das HTML ist.
    Bisher habe ich das so gemacht, dass die PHP-Klasse, die zum BBCode ausgeführt wird, ein Template zurück gibt, dass das Skript zum Aktualisieren enthält (siehe auch hier). Diese Lösung hat zur Folge, dass das Skript für jeden Beitrag, der auf diese Weise bearbeitet worden ist, erneut dem HTML zugefügt wird. Somit ist es unter Umständen mehrfach vorhanden. Sicherlich kein großes Ding, dennoch hätte ich es gern eleganter gelöst. Ideal wäre es, wenn das Skript zum Aktualisieren gar nicht per Template ausgeliefert wird sondern eben per Callback nur aufgerufen wird.

    Edited once, last by WollZi (January 30, 2016 at 12:08 AM).

  • Im Prinzip geht es dir also nur darum bei neuen Inhalten diese entsprechend mit dem Parser zu verarbeiten, oder? In dem Fall kannst du dir WCF.DOMNodeInsertedHandler.addCallback() anschauen, der Callback wird dann bei jeder relevanten Veränderung des DOM ausgeführt, dies schließt die Bearbeitung von Beiträgen mit ein.

  • Funktioniert wie es soll, danke!
    Ich hätte in diesem Zusammenhang noch ein Frage. Fährt man mit dem Mauszeiger über einen Beitragstitel in der Themenübersicht, wird ein Teasertext angezeigt (siehe Anhang). Hier wird natürlich mein Tex-Code nicht geparst. Gibt es da auch eine Möglichkeit, mein Skript aufzurufen?

  • Fährt man mit dem Mauszeiger über einen Beitragstitel in der Themenübersicht, wird ein Teasertext angezeigt (siehe Anhang). Hier wird natürlich mein Tex-Code nicht geparst. Gibt es da auch eine Möglichkeit, mein Skript aufzurufen?

    Es kommt darauf an, es handelt sich dabei um einen gekürzten Text, ggf. musst du über den BBCode je nach Ausgabemodus (afaik ist das text/simplified-html) dies entsprechend anpassen. Auf Grund der Kürzung empfiehlt es sich dort eine abweichende Anzeige zu wählen, bspw. (Formel) oder vergleichbar. Ansonsten ist auch hier wieder WCF.DOMNodeInsertedHandler beteiligt, aber durch die Kürzung ist der BBCode evtl. nicht mehr vollständig.

Participate now!

Don’t have an account yet? Register yourself now and be a part of our community!