EKW: Javascript wird mehrfach ausgeführt

Hallo zusammen, 

weil ich beim letzten Mal so schnell Hilfe bekommen habe, versuche ich es noch einmal. Ich bin bei meinem Plugin quasi fertig nur habe ich leider noch folgendes Problem: Mein Javascript welches in (frontend/js/**.js) liegt, wird mehrfach ausgeführt. Ich habe bereits herausfinden können, dass sich das Script pro Einkaufswelt einmal ausführt (Ich habe mehrere EKWs anhand einer Masterpage zusammengefügt, damit ich unterschiedliche Spalten- und Zeilen-Layouts habe). Das Problem wird wohl daran liegen, dass ich hier:

$.subscribe('plugin/swEmotionLoader/onLoadEmotionFinished', function ()
{
        $('.text-wrapper').on('click', function(e) {
            $(this).next('.content').slideToggle();
            $(this).parent().children().toggleClass("active");
            $(this).parent().siblings().children().next().slideUp();
            $(this).parent().siblings().children().removeClass("active");
            return false;
        });
}

auf das “onLoadEmotionFInished”-Event subscribe und dieses so oft auftritt wie EKWs vorhanden sind. Jetzt meine Frage wie kann ich verhindern, dass sich das Script mehrfach ausführt und somit anstelle eines Klicks, X-Klicks registriert werden, ohne dass ich dabei den Zugriff auf den DOM verliere. Dies wäre ja bei Document ready der Fall.

Über Hilfe wäre ich sehr dankbar.

VG

Hat niemand eine Idee?

  1. Solltest du immer einen Namespace benutzen. Zum Beispiel: eventname.DeinPlugin

SW Docs - jQuery plugins and the StateManager :

Das gilt auch für normale jQuery Events! (Siehe jQuery Docs).

2.1. Möglichkeit A: Du bekommst ja das EKW Plugin als Parameter übergeben (siehe hier). Daher könntest du auch auf dessen Einkaufswelt zugreifen und deine Events nur für diese Einkaufswelt setzen.

2.2. Möglichkeit B: Du entfernst deinen Eventlistener einfach zuvor immer und setzt ihn dann neu. Daher sind hier auch die oben genannten Namespaces so wichtig! Sonst würdest du alle Events entfernen und nicht nur die, die von deinem Plugin kommen: Also:
 

$.subscribe('plugin/swEmotionLoader/onLoadEmotionFinished.deinPluginName', function ()
{
    $('.text-wrapper').off('click.deinPluginName');
    $('.text-wrapper').on('click.deinPluginName', function(e) {
        // [...]
    }
}

Viele Grüße

Danke für deine Antwort! Das mit dem namespace habe ich irgendwie total aus den Augen verloren.  Grin Deine beiden Vorschläge haben super funktioniert, vielen Dank! :slight_smile: