5.3 Asynchrones Laden von Javascript in der Lage window.onload zu stören?

Hallo Community, 

ich habe ein Script in einem eigenen kleinen jQuery Plugin, welches gefeuert werden soll, wenn die Seite und deren Bilder und Objekte geladen sind. Darin gibt es eine registerEvents Funktion:

 

;(function ($, window) {
    "use strict";

    $.plugin('prefixPluginname', {

        defaults: {
        },

        init: function(value) {
            var me = this;
            me.$window = $(window);

            me.applyDataAttributes();
            me.registerEvents();

        },

        registerEvents: function () {
            var me = this;

            me.$window.on('load', me.functionname);

            $.publish('plugin/prefixPluginname/onRegisterEvents', [me]);
        },

        functionname: function(event) {
            var me = this;

            // some action

            $.publish('plugin/prefixPluginname/someaction', [me]);
        },

        destroy: function() {
            var me = this;

            me._destroy();
        },
    });

    window.StateManager.addPlugin('html', 'prefixPluginname');

})(jQuery, window);

 

Nun ist es vorgekommen, dass ausschließlich beim ersten Laden eines Shops die Funktion “someAction” nicht ausgeführt wurde. Beim erneuten Laden der Seite jedoch schon. 

Besonderheiten

  • Shop läuft auf 5.3 - vorher keine Probleme
  • Asynchrones Laden von Javascript ist mit Update auf SW 5.3 ist eingeschaltet
  • Der Shop wird derzeit über www.shopname.de/shopware.php aufgerufen --> shopware.php erzeugt einen 404 Fehler in der Netzwerkanalyse EDIT: irrelevant
  • Das Problem kann schlecht reproduziert werden. Leeren des Browserchaches, Cookies und Co führen nicht zur Wiederholung des Fehlers - erst einen Tag später konnte dies wieder einmalig reproduziert werden EDIT: Browser Caches, Cookies und Sessions müssen komplett geleert werden
  • In der Console erscheint kein Javascript Fehler

 

Fragen :

  1. Ist das Asynchrone Laden von Javascript ein Problem für window.onload? Edit: Ja
  2. sollte asyncReady abgefragt werden und dann das Script ausgeführt werden? Siehe Doku: Shopware 5 upgrade guide
  3. Wenn 2., kann man das dann auch noch SW 5.2 kompatibel gestalten? z.B.: abfragen ob die Funktion asyncReady exisitert und wenn nicht auf document.ready überspringen oder würde die Abfrage immer bei document.ready landen?

 

Vielen Dank schon mal für Eure Hilfe!

Hallo Community,

ich fasse obiges nochmal konkret zusammen.

Durch das asynchrone Laden von Javascripten in Shopware 5.3 grefit das event window.onload beim aller ersten Page Load nicht mehr. Der Rest des oben abgebildeten Jquery Plugins hingegen schon. Beim erneuten Laden der Seite ist das kein Problem mehr. Nach Löschen der im Browser gespeicherten Daten (Cookies, Caches, Sessions) kann man das problem erneut provozieren.

 

Wie kann nun das jQuery Plugin dahingehend erweitert werden, dass window.onload auch beim allerersten Laden greift?

Hallo zenit,

möglicherweise könntest Du dein Script außerhalb des ansychronen Ladens einbinden und mit

document.asyncReady(function() {
    // do your magic here  
});

abwarten, bis jQuery geladen ist.

Wie man das aber in die Plugin-Struktur von Shopware einbindet, weiß ich auch nicht, hier hätte ich das einfach über einen Block selbst in den DOM eingebaut.

Okay, mein Weg wäre nun folgender:

{literal}

    if (typeof asyncReady !== "undefined") {
        document.asyncReady(function () {
            console.log('asyncReady');

            // do your magic here
        });
    }

{/literal}
  • baue ich in den Block {block name=“frontend_index_header_javascript”} ein. Warum heißt dieser Block eigentlich noch(?) frontend_index_ header _javascript wenn er doch im Footer liegt
  • mit if (typeof asyncReady !== “undefined”) prüfe ich, ob es die Funktion gibt, um auch noch SW 5.0 - 5.2 zu unterstützen. 

 

Gibt es einen geschickteren Weg? 

Hi,

wer sein JS in einer TPL Datei einbindet, kann auch mit

{if $theme.asyncJavascriptLoading}true{/if} arbeiten.