<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="https://kniebes.com/assets/xsl/rss.xsl" type="text/xsl" media="screen"?>
<rss version="2.0"
    xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xmlns:wfw="http://wellformedweb.org/CommentAPI/"
    xmlns:dc="http://purl.org/dc/elements/1.1/"
    xmlns:atom="http://www.w3.org/2005/Atom"
    xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
    xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
    xmlns:media="http://search.yahoo.com/mrss/"
>

    <channel>
        <title>M. Kniebes. · Javascript</title>
        <atom:link href="https://kniebes.com/tag/javascript.xml" rel="self" type="application/rss+xml" />
        <link>https://kniebes.com</link>
        <description>Beiträge zum Tag Javascript</description>
        <lastBuildDate>Mon, 23 Dec 2024 16:19:41 +0100</lastBuildDate>
        <language>de-DE</language>
        <sy:updatePeriod>hourly</sy:updatePeriod>
        <sy:updateFrequency>1</sy:updateFrequency>
        <generator>IO</generator>
        <atom:link rel="hub" href="https://pubsubhubbub.appspot.com"/>
        <atom:link rel="hub" href="https://pubsubhubbub.superfeedr.com"/>
        <atom:link rel="hub" href="https://websubhub.com/hub"/>

                
            
            <item>
                <title><![CDATA[Infinite Scrolling]]></title>                
                <link>https://kniebes.com/2024/12/23/infinite-scrolling.html</link>
                <dc:creator><![CDATA[Markus Kniebes]]></dc:creator>
                <pubDate>Mon, 23 Dec 2024 16:19:41 +0100</pubDate>
                <guid isPermaLink="true">https://knieb.es/3d16</guid>
                <description><![CDATA[<p>Nach dieser <a href="https://ruhr.social/@kniebes/113696915549231900">äußerst repräsentativen Umfrage auf Mastodon</a>, wie Infinite Scrolling bevorzugt genutzt wird, haben es drei von fünf Nutzern lieber interaktiv. Das heißt erst per Click wird neues Zeugs geladen.</p>

<p>Naja, dann kann ich ja meinen Infinite Scrolling Branch im <a href="https://kniebes.photo/">Photoblog</a> löschen…</p>

<p>Allerdings nicht ohne mal kurz aufzuschreiben wie ich das eigentlich umsetzen wollte.</p>

<p>Neue Fotos sollten immer eingeblendet werden, wenn die Unterkante der Seite erreicht ist, bzw. wenn der „Mehr Laden“-Button in den ViewPort scrollt.</p>

<p>Anstelle einer ulkigen <code>scrollTopLengthHeightWasAuchImmer()</code>-Konstruktion, habe ich es mit der <a href="https://developer.mozilla.org/en-US/docs/Web/API/Intersection_Observer_API">Intersection Observer API</a> versucht. Und das war ziemlich einfach:</p>

<pre><code class="language-js">// Das ist der Link mit dem Click Event zum Laden weiterer Fotos.
const loadMoreButton = document.querySelector('#load-more')

const loadMoreButtonObserver = new IntersectionObserver(
    (entries, options) =&gt; {
        for (let entry of entries) {
            if (entry.isIntersecting) {
                entry.target.click()
            }
        }
    }
)

if (loadMoreButton) {
    loadMoreButtonObserver.observe(loadMoreButton)
}
</code></pre>
<hr>
<p><a href="mailto:m@kniebes.io?subject=Infinite Scrolling (knieb.es/3d16)">Per E-Mail antworten</a><br>
<a href="https://kniebes.com/frag-mich.html">Du hast Fragen an mich oder ein Thema für die FAQ?</a></p>]]></description>

                            
                    <category><![CDATA[Javascript]]></category>
                
                    <category><![CDATA[Photoblog]]></category>
                                
            </item>

                            
                
            
            <item>
                                
                <link>https://kniebes.com/2024/01/07/12688464c072.html</link>
                <dc:creator><![CDATA[Markus Kniebes]]></dc:creator>
                <pubDate>Sun, 07 Jan 2024 09:41:30 +0100</pubDate>
                <guid isPermaLink="true">https://knieb.es/26da</guid>
                <description><![CDATA[<p>Ja, <a href="https://gomakethings.com/a-lot-of-what-people-use-react-for-would-be-better-handled-with-vanilla-javascript/">genau</a>. Vieles geht mit plain Javascript sehr einfach. Ansonsten hat man ruckzuck wieder einen node_modules Ordner von etlichen Gigabytes, mit Packages zum Addieren zweier Integers oder so einen Krampf. Das muss nicht sein.</p>
<hr>
<p><a href="mailto:m@kniebes.io?subject=Ja, genau. Vieles geht mit plain Javascript sehr ... (knieb.es/26da)">Per E-Mail antworten</a><br>
<a href="https://kniebes.com/frag-mich.html">Du hast Fragen an mich oder ein Thema für die FAQ?</a></p>]]></description>

                            
                    <category><![CDATA[Javascript]]></category>
                                
            </item>

                            
                
            
            <item>
                <title><![CDATA[Überschreiben existierender Shopware Storefront Javascript Plugins]]></title>                
                <link>https://kniebes.com/2023/10/28/uberschreiben-existierender-shopware-storefront-javascript-plugins.html</link>
                <dc:creator><![CDATA[Markus Kniebes]]></dc:creator>
                <pubDate>Sat, 28 Oct 2023 12:17:47 +0200</pubDate>
                <guid isPermaLink="true">https://knieb.es/2472</guid>
                <description><![CDATA[<p>Trotz der Info <q>Each JavaScript plugin can only be overridden once. If two Shopware plugins try to override the same plugin, only the last one of them will actually work.</q> (<a href="https://developer.shopware.com/docs/guides/plugins/plugins/storefront/override-existing-javascript.html">Override Existing Javascript</a>) hat mich irgendein Gedanke geritten, das könnte mehrfach gemacht werden.</p>

<p>Und so wollte ich einfach das OffCanvasCartPlugin aus der Storefront ein klein wenig erweitern und die Eingabe einer Postleitzahl im Offcanvas Cart ermöglichen - manchmal zur Lieferkostenberechnung unabdingbar – und dabei die Infrastruktur zum Updaten von Feldern nutzen, die das Plugin schon mitbringt. Also einfach kurz das <code>src/plugin/offcanvas-cart/offcanvas-cart.plugin</code> extended, meine paar Methoden hinzugefügt und fertig. Dachte ich.</p>

<pre><code class="language-js">PluginManager.override('OffCanvasCart', 
    ZipExtensionOffcanvasCartPlugin, '[data-offcanvas-cart]'
);
</code></pre>

<p>Ich war wohl nicht der Einzige, der das dachte. Beispielsweise im SwagAmazonPay Plugin wird das Offcanvas Dingelchen auch schon überschrieben. Und gemäß dem Motto "Die Letzten werden die Ersten sein" gewinnt natürlich das Plugin, das die letzte Überschreibung durchführt. Das war nicht meins.</p>

<p>Letztlich bleibt einem nichts anderes übrig, die eigene Erweiterung als neues Plugin zu registrieren. Allerdings muss man dann auch darauf achten, indem selbst registrierte Plugins nicht noch einmal alle Events erstellt werden, sodass der Offcanvas zweimal geöffnet wird etc. In diesem speziellen Fall mit dem Offcanvas Plugin war das einfach, indem ich die <code>init()</code> überschrieben habe, ohne einen Aufruf von <code>super.init()</code></p>

<pre><code class="language-js">export default class ZipExtensionOffcanvasCartPlugin
        extends OffCanvasCartPlugin {
    init() {
        this.client = new HttpClient()
        this._registerZipTriggerEvents()
    }

    _registerZipTriggerEvents() {
        this.$emitter.subscribe('offCanvasOpened', () =&gt; {
            const forms = DomAccess.querySelectorAll(
                document, '.js-offcanvas-cart-add-zip', false
            )
            if (forms) {
                Iterator.iterate(forms, 
                    form =&gt; form.addEventListener(
                        'submit', this._onAddZip.bind(this))
                    )
            }
        });
    }

    _onAddZip(event) {
        event.preventDefault()
        const form = event.target
        const selector = '.js-offcanvas-cart-zip'

        this.$emitter.publish('onAddZip')

        super._fireRequest(form, selector)
    }
}
</code></pre>

<p>Die Zip in die ShippingLocation über einen SalesChannelContextFactoryDecorator in den SalesChannelContexts zu bekommen und der vernünftige Umgang damit im Checkout war dann im Vergleich zu dem Javascript-Theater der wesentlich entspanntere Teil des Ganzen. Und ist vielleicht später mal einen Post wert.</p>
<hr>
<p><a href="mailto:m@kniebes.io?subject=Überschreiben existierender Shopware Storefront Javascript Plugins (knieb.es/2472)">Per E-Mail antworten</a><br>
<a href="https://kniebes.com/frag-mich.html">Du hast Fragen an mich oder ein Thema für die FAQ?</a></p>]]></description>

                            
                    <category><![CDATA[Javascript]]></category>
                
                    <category><![CDATA[Shopware]]></category>
                                
            </item>

                            
                
            
            <item>
                <title><![CDATA[Sharing Web Component]]></title>                
                <link>https://kniebes.com/2023/07/01/sharing-web-component.html</link>
                <dc:creator><![CDATA[Markus Kniebes]]></dc:creator>
                <pubDate>Sat, 01 Jul 2023 17:50:29 +0200</pubDate>
                <guid isPermaLink="true">https://knieb.es/1fcf</guid>
                <description><![CDATA[<p>Nachdem ich Martin Schneiders Artikel <a href="https://martinschneider.me/articles/tinkering-with-web-components/">Tinkering with Web Components</a> gelesen habe, dachte ich, das wäre ein töfter Ersatz für die „Per E-Mail antworten“ Funktion. Leicht abgewandelt wird auch der „Per E-Mail antworten“-Link über einen Share Button über eine Web Component angezeigt.</p>

<p>Und da ich gerade dabei war, gibt es noch drei weitere Web Components:</p>

<ul>
<li>Der Now Playing Schnipsel rechts oben, der meinen gerade <a href="https://www.last.fm/de/about/trackmymusic">gecsrobbelten</a> Titel anzeigt.</li>
<li>Die Vor-/Zurücknavigation unter den Posts</li>
<li>Die am häufigsten gespielten Alben auf der <a href="https://kniebes.com/now#lastfm-topalbums">now-Seite</a></li>
</ul>
<hr>
<p><a href="mailto:m@kniebes.io?subject=Sharing Web Component (knieb.es/1fcf)">Per E-Mail antworten</a><br>
<a href="https://kniebes.com/frag-mich.html">Du hast Fragen an mich oder ein Thema für die FAQ?</a></p>]]></description>

                            
                    <category><![CDATA[Weblog]]></category>
                
                    <category><![CDATA[Web Components]]></category>
                
                    <category><![CDATA[Javascript]]></category>
                                
            </item>

                            
        
    </channel>
</rss>
