left arrowBack to Seo Hub
Seo Hub
- December 02, 2024

Hvordan sikrer man, at JavaScript-indhold er crawlable?

Indholdsfortegnelse

  1. Googlebots trefasede rejse
  2. Server-side rendering (SSR) eller pre-rendering
  3. Implementering af dynamisk rendering
  4. Optimering af rendering-vejen
  5. Brug af polyfills og differentiel levering
  6. Meningsfulde HTTP-statuskoder
  7. Undgåelse af bløde 404-fejl
  8. Korrekt brug af kanoniske tags
  9. Effektiv brug af robots meta-tags
  10. Forbedring af titler og meta-beskrivelser

Introduktion

Forestil dig at investere utallige timer i at udvikle en fantastisk og interaktiv hjemmeside ved hjælp af JavaScript-teknologier, kun for at opdage, at søgemaskiner ikke kan indeksere dit indhold effektivt. Så dynamisk som JavaScript gør weboplevelsen, introducerer det udfordringer for søgemaskineoptimering (SEO), som kan hindre opdagelsen og rangeringen af dit indhold. At forstå, hvordan man sikrer, at dit JavaScript-indhold er crawlbart, er essentielt, hvis du vil have dit website til at nå sit fulde potentiale.

JavaScript har forvandlet måden, hvorpå hjemmesider bygges, ved at tilbyde kraftfulde funktioner, der gør weben mere interaktiv og engagerende. Denne fleksibilitet kommer dog med en pris. Søgemaskiner har brug for at behandle JavaScript for at forstå indholdet, hvilket kan være ressourcekrævende og nogle gange problematisk. Derfor er det en afgørende skridt at sikre, at JavaScript-indhold er crawlbart for at opretholde synligheden af dit site og sikre, at et større publikum kan få adgang til dine tilbud.

Denne blog vil guide dig gennem labyrinten af at sikre, at dit JavaScript-indhold forbliver tilgængeligt for søgemaskiner. Vi vil afdække de involverede processer, udforske levedygtige strategier og fremhæve bedste praksis for at optimere din applikation til søgemaskinesynlighed. Ved slutningen af dette indlæg vil du være udstyret med praktiske indsigter og handlingsrettede skridt til at forbedre SEO for dit JavaScript-drevne website. Lad os dykke ned!

Forstå basis om JavaScript SEO

JavaScript tilbyder uendelige muligheder for at skabe dynamiske, engagerende weboplevelser. Det præsenterer dog unikke udfordringer, når det kommer til SEO. At gøre dine webapplikationer, der er afhængige af JavaScript, opdagelige er essentielt for at tiltrække og fastholde brugere gennem søgemaskiner som Google. At forstå Googlebots interaktion med JavaScript er det første skridt mod at gøre JavaScript-indhold crawlbart.

Googlebots trefasede rejse

  1. Crawling: Googlebot henter siden. Den læser først robots.txt-filen for at bekræfte, om den kan crawle siderne. Hvis det er tilladt, går den videre. At blokere kritiske JavaScript-filer via robots.txt kan forhindre Google i at gengive og indeksere dit indhold.

  2. Kø til rendering: Efter den første crawling placeres siden i en kø til rendering. Denne fase kan tage alt fra et par sekunder til længere tid, alt efter Googles ressourcer.

  3. Rendering og indeksering: Når den er gengivet af en evergreen-version af Chromium, udfører Googlebot JavaScript, parser HTML og sætter til sidst URLs fra det gengivne indhold i kø til videre crawling, hvilket sikrer, at alt dynamisk indhold er synligt og korrekt indekseret.

Denne forståelse danner grundlaget for at optimere JavaScript til synlighed i søgemaskiner.

Tips og bedste praksis for at sikre crawlbart indhold

Server-side rendering (SSR) eller pre-rendering

Disse muligheder giver søgemaskiner mulighed for at crawle dit indhold mere effektivt, da indholdet gengives på serveren, før det når klienten. Server-side rendering sikrer, at søgemaskiner modtager en fuldt gengivet HTML-fil, hvilket gør det lettere at crawle og indeksere. Populære rammer som Next.js udnytter server-side rendering for at forbedre SEO.

Implementering af dynamisk rendering

For websider, der skal forblive client-side, er dynamisk rendering et alternativ. Dette involverer at servere statiske HTML-versioner til crawlers, mens den dynamiske oplevelse gives til brugerne. Selvom Google understøtter client-side rendering, kan en tung afhængighed af JavaScript forsinke rendering, hvilket påvirker crawlbartheden. FlyRank's AI-Drevne Indholdsmotor kan hjælpe med at generere optimeret indhold, der effektivt kan supplere din renderingsstrategi. Læs mere om vores indholds muligheder her.

Optimering af rendering-vejen

Forsikre dig om, at dit websites indledende HTML muliggør hurtig genkendelse af synligt og tilgængeligt indhold. Dette opnås ved at anvende en strømlinet renderingsstrategi og holde kritiske ressourcer let tilgængelige for søgemaskiner. Opgaver som at minimere client-side JavaScript for kritiske komponenter kan fremskynde renderingstider, hvilket gør indholdet mere tilgængeligt for bots.

Brug af polyfills og differentiel levering

JS-rammer udvikler sig hurtigt, men ikke alle funktionaliteter gengives omfattende af Google. At integrere polyfills sikrer, at funktioner fungerer på tværs af forskellige browser-miljøer. Differentiel levering tilpasser funktionaliteter til specifikke browsere, hvilket sikrer optimal præsentation og funktionalitet uden at påvirke crawlbartheden.

Meningsfulde HTTP-statuskoder

Giv klare HTTP-statuskoder for at guide Googlebots indekseringshandlinger, som f.eks. at bruge 404-fejl for ikke-eksisterende sider eller 301-omdirigeringer for flyttede indhold, hvilket sikrer glidende navigation og indeksering på tværs af dit site.

Undgåelse af bløde 404-fejl

I Single Page Applications (SPAs) skal du bruge History API i stedet for fragmenter til at navigere mellem visninger for at undgå faldgruber som bløde 404'er, hvilket sikrer, at URLs forbliver tilgængelige og klare for søgemaskiner at indeksere.

Korrekt brug af kanoniske tags

Forsikre dig om, at kanoniske tags er korrekt konfigureret, så søgemaskiner kan identificere den rette URL til indeksering. Selvom JavaScript kan injicere disse tags, er det ideelt at bruge server-side metoder, hvor det er muligt, for at undgå konfigurationsproblemer på klientniveau.

Effektiv brug af robots meta-tags

Brug robots meta-tags fornuftigt for at kontrollere indekseringsadfærd uden utilsigtet at blokere vigtige sider. Korrekte JavaScript-injektions teknikker sikrer, at dynamisk indhold forbliver tilgængeligt, mens det stadig er håndterbart i forhold til synlighed for søgemaskiner.

Forbedring af titler og meta-beskrivelser

JavaScript kan dynamisk generere meta-beskrivelser og titler, der er meningsfulde i forhold til din sides kontekst. Unikke, beskrivende

og meta-beskrivelser hjælper både brugere og søgemaskiner med at fortolke dit indhold bedre.</p> <h2>Virkelige eksempler og case-studier</h2> <p>At illustrere den succesfulde anvendelse af disse principper, har FlyRanks samarbejde med forskellige virksomheder givet bemærkelsesværdige forbedringer i SEO-resultaterne.</p> <ul> <li><p>I <a href="https://flyrank.com/blogs/case-studies/hulkapps">HulkApps Case Study</a> hjalp FlyRank med at opnå en 10x stigning i organisk trafik gennem strategier, der inkluderede rendering-optimiseringer og strukturerede indholdsimplementeringer.</p> </li> <li><p>Tilsvarende, for <a href="https://flyrank.com/blogs/case-studies/releasit">Releasit</a>, finjusterede FlyRank deres webpræsentation, hvilket markant forbedrede engagementet og synligheden.</p> </li> </ul> <p>Disse eksempler understreger effektiviteten af at anvende moderne taktikker til at styre synligheden af JavaScript-indhold, hvilket efterfølgende forbedrer indeksering og ydeevne.</p> <h2>Rollen for tilgængelighed</h2> <p>Et website skal være navigerbart og brugbart for alle brugere, selv dem der bruger browsere, der ikke udfører JavaScript. Sørg for, at væsentligt indhold bliver tilgængeligt uden stor afhængighed af JavaScript. Testning med værktøjer eller ved at gengive i teksttilstand er praktiske strategier for at sikre, at indholdet vises som forventet.</p> <h2>Konklusion</h2> <p>Crawlbartheden af JavaScript-indhold er en afgørende faktor i at bestemme et websites succes i søgerangeringer. Selvom renderingsteknikker og strategisk brug af SEO-principper spiller vigtige roller, er det lige så vigtigt kontinuerligt at tilpasse sig den udviklende karakter af SEO.</p> <p>Ved at forstå grundlæggende JavaScript-interaktioner med søgemaskiner og anvende prøvede og testede SEO-praksisser som server-side rendering eller meningsfulde meta-implementeringer, kan dit site forblive synligt, relevant og konkurrencedygtigt. At udnytte FlyRanks data-drevne strategier <a href="https://flyrank.com/pages/our-approach">Vores tilgang</a> kan effektivt forbedre dit sites digitale fodaftryk, så dit dynamiske indhold når en bredere, engageret målgruppe. </p> <p>For yderligere at raffinere SEO for dine webapplikationer, kan du udnytte FlyRanks lokaliserede indholdstilbud <a href="https://flyrank.com/pages/localization">Lokaliseringsservices</a> for naturligt at skalere og opretholde indtræden på internationale markeder.</p> <h2>Ofte stillede spørgsmål</h2> <p><strong>Q1: Kan jeg bruge JavaScript til at indstille meta-tags som beskrivelser eller kanoniske URLs?</strong><br>Ja, JavaScript kan dynamisk indstille meta-tags, herunder kanoniske URLs og beskrivelser. For robust SEO skal du dog overveje at placere disse på serversiden, hvor det er muligt, da nogle søgemaskiner muligvis ikke udfører JavaScript grundigt.</p> <p><strong>Q2: Hvordan forbedrer server-side rendering SEO for JavaScript-tunge websites?</strong><br>Server-side rendering (SSR) leverer for-renderede HTML-sider til søgemaskinebots, hvilket forenkler deres crawling- og indekseringsproces ved at give dem direkte adgang til indholdet uden at skulle udføre yderligere JavaScript.</p> <p><strong>Q3: Er det nødvendigt at teste JavaScript-funktioner for ældre browserkompatibilitet?</strong><br>Ja, brug polyfills for at sikre, at JavaScript-funktioner fungerer korrekt på ældre browsere, der mangler native understøttelse, hvilket forbedrer både brugeroplevelsen og SEO-crawlbartheden.</p> <p><strong>Q4: Hvordan kan FlyRank forbedre global indholdsopnåelse?</strong><br>FlyRanks <a href="https://flyrank.com/pages/localization">Lokaliseringsservices</a> tilpasser dit site til forskellige sprog og kulturer, hvilket sikrer optimeret levering og kontekstuel relevans for internationale målgrupper, hvilket dermed udvider din rækkevidde og engagement.</p> <p>At udvikle sig i takt med de førende SEO-strategier, som de tilbudte af FlyRank, sikrer både nuværende overholdelse og parathed til fremtidige fremskridt inden for søgemaskineteknologier.</p>' </div> <div class="lg:w-1/3 text-gray mt-16 sticky top-[112px] lg:h-screen"> <div class="bg-white text-center p-5 rounded-lg mb-8"> <img src="https://cdn.shopify.com/s/files/1/0609/8023/2259/files/envelope-icon.svg?v=1732181353" alt="Envelope Icon" class="mx-auto" > <div class="text-dark font-extrabold mb-5 uppercase text-xl">Enjoy content like this?</div> <div class="text-dark text-xl mb-3">Join our newsletter and 20,000 enthusiasts</div> <div class="sidebar-newsletter opacity-0 transition-opacity duration-500 h-[129px]"> <div id="shopify-block-AOFJqZjlUdWtqOXZib__forms_inline_9wMQFJ" class="shopify-block shopify-app-block"><div id='AOFJqZjlUdWtqOXZib__forms_inline_9wMQFJ' data-form-root='true' data-forms-id='forms-root-254557' data-forms-text-color='#0f1217' data-forms-button-background-color='#0f1217' data-forms-button-label-color='#ffffff' data-forms-links-color='#1878b9' data-forms-errors-color='#e02229' data-forms-text-alignment='center' data-forms-alignment='center' data-forms-padding-top='5' data-forms-padding-right='0' data-forms-padding-bottom='0' data-forms-padding-left='0' ></div> <script> window['ShopifyForms'] = { ...window['ShopifyForms'], currentPageType: "article" }; </script> </div> </div> </div> <div class="bg-dark-800 text-center p-5 rounded-lg"> <img src="https://cdn.shopify.com/s/files/1/0609/8023/2259/files/download-icon.svg?v=1732109891" alt="Download Icon" class="mx-auto mb-3" > <div class="text-xl mb-8"> <span class="font-bold">DOWNLOAD FREE</span><br> BACKLINK DIRECTORY </div> <a href="/cart/41940050214979:1?checkout&attributes[first_visit]=%2Fda%2Fblogs%2Fseo-hub%2Fhow-to-ensure-javascript-content-is-crawlable" class="btn btn-green w-full" > Download </a> </div> </div> </div> </div> </div> <style> table tr:first-child { background-color: #86628d; } table th:first-child, table td:first-child { font-weight: bold; } th, td { border: 1px solid #ccc; padding: 10px; text-align: left; } </style> </section><div id="shopify-section-template--16867507732547__demo_promo_K9myJY" class="shopify-section demo"><div class=" px-6 md:px-8 py-12 lg:py-32 bg-green"> <div class="container text-dark text-center"> <div class="w-full md:w-8/12 mx-auto"> <h2 class="mb-8 text-4xl sm:text-5xl">LAD OS FREMME DIN BRAND TIL NYE HØJDER</h2> <div class="mb-5"><p>Hvis du er klar til at bryde igennem støjen og gøre en varig indvirkning online, er det tid til at samarbejde med FlyRank. Kontakt os i dag, og lad os sætte dit brand på vej mod digital dominans.</p></div> <div class="flex flex-col"> <div> <a class="btn btn-dark text-gray mt-8" href="/da/pages/kontakt"> Anmod om en demo </a> </div> </div> </div> </div> </div> </div> </main> <footer id="shopify-section-footer" class="shopify-section footer"><div class="footer-container px-6 md:px-8 py-16 md:py-24 overflow-hidden relative"> <img src="https://cdn.shopify.com/s/files/1/0609/8023/2259/files/footer-background.png?v=1730813000" alt="Image Background" class="object-contain absolute w-full z-0 bottom-0 2xl:bottom-auto 2xl:top-1/3" > <div class="container flex flex-col-reverse md:flex-row z-10 relative flex-wrap"> <div class="w-full md:w-1/2 text-gray mt-16 md:mt-0"> <div> <img src="https://cdn.shopify.com/s/files/1/0609/8023/2259/files/flyrank-logo-large.svg?v=1730983842" alt="logo" > </div> <div class="w-full md:w-2/3 my-12"><p>Hvis du er klar til at bryde igennem støjen og gøre en varig indflydelse online, er det tid til at gå sammen med FlyRank.</p></div> <div class="flex"> <a href="https://x.com/flyrank_ai" target="_blank" class="bg-green w-[50px] h-[50px] inline-block flex justify-center items-center mr-3 rounded-full hover:opacity-[0.8] transition-all" ><img src="https://cdn.shopify.com/s/files/1/0609/8023/2259/files/icon-twitter.svg?v=1729166778" alt="twitter" ></a> <a href="https://www.facebook.com/people/FlyRank/61566930002846/" target="_blank" class="bg-green w-[50px] h-[50px] inline-block flex justify-center items-center mr-3 rounded-full hover:opacity-[0.8] transition-all" ><img src="https://cdn.shopify.com/s/files/1/0609/8023/2259/files/icon-facebook.svg?v=1729166777" alt="facebook" ></a> <a href="https://www.instagram.com/flyrank.ai/" target="_blank" class="bg-green w-[50px] h-[50px] inline-block flex justify-center items-center mr-3 rounded-full hover:opacity-[0.8] transition-all" ><img src="https://cdn.shopify.com/s/files/1/0609/8023/2259/files/icon-instagram.svg?v=1729166777" alt="instagram" ></a> </div> </div> <div class="w-full md:w-1/2 grid gap-4 grid-cols-2 sm:grid-cols-3"> <div class=""> <div class="text-dark-100 mb-5 sm:mb-12 uppercase font-medium">Virksomhed</div> <ul> <li class="mb-3"> <a href="/da/pages/om" class="text-gray-50 capitalize"> Om os </a> </li> <li class="mb-3"> <a href="/da/pages/vores-tilgang" class="text-gray-50 capitalize"> Vores tilgang </a> </li> <li class="mb-3"> <a href="/da/pages/henvisninger" class="text-gray-50 capitalize"> Referencer </a> </li> <li class="mb-3"> <a href="https://www.flyrank.com/pages/contact?utm_source=website&utm_medium=footer" class="text-gray-50 capitalize"> Kontakt Os </a> </li> </ul> </div> <div class=""> <div class="text-dark-100 mb-5 sm:mb-12 uppercase font-medium">Udforsk</div> <ul> <li class="mb-3"> <a href="/da/pages/indhold" class="text-gray-50 capitalize"> Artikler </a> </li> <li class="mb-3"> <a href="/da/blogs/case-studier" class="text-gray-50 capitalize"> Case Studies </a> </li> <li class="mb-3"> <a href="/da/pages/prissaetning" class="text-gray-50 capitalize"> Prissætning </a> </li> <li class="mb-3"> <a href="/da/pages/ofte-stillede-sporgsmal" class="text-gray-50 capitalize"> FAQs </a> </li> </ul> </div> <div class="mt-5 sm:mt-0"> <div class="text-dark-100 mb-5 sm:mb-12 uppercase font-medium">Juridisk</div> <ul> <li class="mb-3"> <a href="/da/policies/terms-of-service" class="text-gray-50 capitalize"> Vilkår for service </a> </li> <li class="mb-3"> <a href="/da/policies/privacy-policy" class="text-gray-50 capitalize"> Fortrolighedspolitik </a> </li> <li class="mb-3"> <a href="/da/policies/refund-policy" class="text-gray-50 capitalize"> Pengene-tilbage-garanti </a> </li> <li class="mb-3"> <a href="https://calendly.com/flyrank/30min?utm_source=website&utm_medium=footer" class="text-gray-50 capitalize"> Anmod om en demo </a> </li> </ul> </div> </div> </div> <div class="container"> <div class="text-gray w-full mt-24 text-sm">© 2025 FlyRank - All Rights Reserved</div> </div> </div> </footer> <div class="minicart-wrapper" x-data x-show="$store.global.isMinicartVisible" x-on:click.outside="$store.global.isMinicartVisible = false" x-transition:enter="transition ease-out duration-300" x-transition:enter-start="off-screen-right" x-transition:enter-end="right-50" x-transition:leave="transition ease-in duration-300" x-transition:leave-start="right-50" x-transition:leave-end="off-screen-right" x-cloak :aria-hidden="$store.global.isMinicartVisible ? 'false' : 'true'" aria-modal="true" role="dialog" > <div id="shopify-section-minicart" class="shopify-section"><div class="minicart" data-ajax-cart-section x-cloak> <div class="title-row"> <h2 id="minicart-label" class="text-cloud-burst-500"> Cart </h2> <button @click="$store.global.isMinicartVisible = false"> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="currentColor"> <path d="M24 20.188l-8.315-8.209 8.2-8.282-3.697-3.697-8.212 8.318-8.31-8.203-3.666 3.666 8.321 8.24-8.206 8.313 3.666 3.666 8.237-8.318 8.285 8.203z"/> </svg> </button> </div> <div class="item-count-message"> You have <span class="count" style="font-weight: 600" x-data>0 </span> <span x-data></span> in your cart! </div> <hr/> <ul class="items-list" data-ajax-cart-section-scroll> </ul> <hr/> <div class="subtotal"> <p class="title">Subtotal </p> <p class="amount">$0.00 </p> </div> <a class="view-cart-details-link" href="/da/cart"> View Cart Details </a> </div> <style> /* Animation classes */ .transition { transition-property: all; } .duration-300 { transition-duration: 300ms; } .ease-out { transition-timing-function: ease-out; } .ease-in { transition-timing-function: ease-in; } .off-screen-right { right: -100px; transform: translateX(120%); } .right-50 { right: 50px; transform: translateX(0%); } @media(max-width: 576px) { .right-50 { right: 20px; transform: translateX(0%); } } /* Main styles */ .minicart-wrapper { position: fixed; top: 50px; right: 50px; z-index: 100; } @media(max-width: 576px) { .minicart-wrapper { right: 20px; } } .minicart { width: 288px; height: auto; padding: 20px; background: #fff; border-radius: 6px; box-shadow: 0 30px 130px -8px rgba(0, 0, 0, 0.25); } .minicart .view-cart-details-link { display: flex; justify-content: center; align-items: center; margin-top: 20px; width: 100%; height: 43px; font-weight: 600; background: white; border: 2px solid black; outline: none; text-decoration: none; } .minicart .view-cart-details-link:hover { cursor: pointer; color: white; background: black; } .minicart hr { margin-bottom: 20px; } .minicart .title-row { display: flex; align-items: center; justify-content: space-between; margin-bottom: 10px; } .minicart .title-row h2 { margin: 0; } .minicart .title-row button { border: none; background: transparent; cursor: pointer; } .minicart .title-row button svg { display: block; height: 16px; } .minicart .items-list { list-style: none; padding-left: 0; max-height: 300px; overflow: auto; } .minicart .item-count-message { margin-bottom: 10px; font-size: 0.8em; } .minicart .item-count-message .minicart--item-count { font-weight: 600; } .minicart .item { display: flex; margin-bottom: 10px; width: 100%; } .minicart .item .product-thumb-wrapper { width: 100px; height: 120px; position: relative; flex: 0 0 100px; } .minicart .item .product-thumb-wrapper img { position: absolute; top: 0; right: 0; left: 0; bottom: 0; height: 100%; width: 100%; object-fit: cover; object-position: center; } .minicart .item .item-details { margin-left: 10px; display: flex; flex-direction: column; justify-content: flex-start; } .minicart .item .item-details p { margin: 0; } .minicart .item .item-details .option-label { font-weight: 600; } .minicart .item .item-details .title { font-size: 0.9em; font-weight: 600; margin-top: 0; margin-bottom: 6px; } .minicart .item .item-details .options { margin-bottom: 2px 0; } .minicart .item .item-details .option { margin: 0 0 2px; font-size: 0.8rem; } .minicart .item .item-details .quantity-row { margin: 2px 0; } .minicart .item .item-details .quantity-row span { margin: 0 0 2px; font-size: 0.8rem; } .minicart .item .item-details .option:last-of-type { margin-bottom: 0; } .minicart .item .item-details .price { margin-top: auto; } .minicart .item .item-details .remove { font-size: 0.6em; margin-top: auto; } .minicart .subtotal { margin: 20px 0; display: flex; align-items: center; justify-content: space-between; } .minicart .subtotal .title { height: 16px; margin: 0; } .minicart .subtotal .amount { font-weight: 600; font-size: 1.2em; margin: 0; } .minicart a { color: black; text-decoration: none; } .minicart a:hover { text-decoration: underline; } </style></div> </div> <div id="shopify-section-predictive-search-main" class="shopify-section site-header w-full shadow-md p-shell fixed top-0 z-30 bg-white"> <script src="//www.flyrank.com/cdn/shop/t/34/assets/predictive-search.js?v=82854867885586265471741865223" defer="defer"></script> <predictive-search x-data x-cloak id="predictive-search" x-show="$store.global.isPredictiveSearchVisible" x-trap.inert="$store.global.isPredictiveSearchVisible" x-transition.opacity aria-modal="true" @keyup.escape="$store.global.isPredictiveSearchVisible = false" > <div id="predictive-search-form-wrapper" class="w-full bg-white fixed inset-x-0 top-0 z-40 pt-8 pb-14 shadow-md" > <h2 class="text-base !font-normal max-w-max mx-auto font-palatino mb-3"> Hvad kan vi hjælpe dig med at finde? </h2> <form action="/da/search" method="get" role="search" class="w-full max-w-[422px] mx-auto" @click.outside="$store.global.isPredictiveSearchVisible = false" > <div class="flex gap-x-3 w-full relative"> <input id="predictive-search-input" class="slayed-input w-full" type="search" name="q" value="" role="combobox" aria-expanded="false" aria-owns="predictive-search-results" aria-controls="predictive-search-results" aria-haspopup="listbox" aria-autocomplete="list" > <label for="predictive-search-input" class="sr-only"> Search </label> <button for="predictive-search-input" class="pill-button" > Search </button> <button type="button" class="absolute -right-[15px] top-1/2 -translate-y-1/2 translate-x-full" @click="$store.global.isPredictiveSearchVisible = false" > <span class="sr-only">Close</span> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="currentColor"> <path d="M24 20.188l-8.315-8.209 8.2-8.282-3.697-3.697-8.212 8.318-8.31-8.203-3.666 3.666 8.321 8.24-8.206 8.313 3.666 3.666 8.237-8.318 8.285 8.203z"/> </svg> </button> </div> <input name="options[prefix]" type="hidden" value="last"> <div id="predictive-search-target" tabindex="-1"></div> </form> </div> </predictive-search> </div> <div id="shopify-section-modal" class="shopify-section section-modal"> <dialog id="dialog-modal-example" x-data="modal" x-init="init($el)" class="max-w-md rounded-md" @click="close($event)" > <form action="" class="p-12"> <div class="prose"> <h1>Modal Title</h1> <p><p>Modalbeskrivelse. Lorem ipsum dolor sit amet consectetur adipisicing elit. Itaque totam cum cupiditate officia et quaerat blanditiis culpa? Hic, nesciunt id.</p></p> <button type="button" @click="open = false" class="btn rounded-none"> Close </button> </div> </form> </dialog> <script> document.addEventListener('alpine:init', () => { Alpine.data('modal', () => ({ componentElement: document.querySelector('#dialog-modal-example'), open: false, init(dialog) { if (!dialog) { return } Alpine.effect(() => { if (this.open) { dialog.showModal() document.querySelectorAll('body > *:not(#shopify-section-modal)').forEach((element) => { element.setAttribute('aria-hidden', 'true') element.setAttribute('inert', '') }) document.querySelector('body').classList.add('overflow-hidden') } else { dialog.close() document.querySelectorAll('body > *:not(#shopify-section-modal)').forEach((element) => { element.removeAttribute('aria-hidden') element.removeAttribute('inert') }) document.querySelector('body').classList.remove('overflow-hidden') } }) document.addEventListener('show-modal', () => { this.open = true }) document.addEventListener('close-modal', () => { this.open = false }) }, toggle() { this.open = !this.open }, close(event) { if (event.target === this.componentElement) { if (this.open) { this.open = false } } } })) }) </script> <style> #dialog-modal-example::backdrop { background-color: rgba(0, 0, 0, 0.5); } </style></div> <script type="application/json" data-ajax-cart-initial-state> {"note":null,"attributes":{},"original_total_price":0,"total_price":0,"total_discount":0,"total_weight":0.0,"item_count":0,"items":[],"requires_shipping":false,"currency":"USD","items_subtotal_price":0,"cart_level_discount_applications":[],"checkout_charge_amount":0} </script> <div id="shopify-block-AZFd6aGFnS21FS1hVa__13768625480086291342" class="shopify-block shopify-app-block"><script> window['ShopifyForms'] = { ...window['ShopifyForms'], currentPageType: "article" }; </script> </div><div id="shopify-block-Aajk0TllTV2lJZTdoT__15683396631634586217" class="shopify-block shopify-app-block"><script id="chat-button-container" data-horizontal-position=bottom_right data-vertical-position=lowest data-icon=chat_bubble data-text=no_text data-color=#89608e data-secondary-color=#ffffff data-ternary-color=#6a6a6a data-domain=www.flyrank.com data-shop-domain=www.flyrank.com data-external-identifier=5QqDPyGbw2L4LPYPH2LFgD67SjacIZkJCvvcz866Sws > </script> </div></body> </html>