JavaScript SEO and How to Fix JS Rendering Issues That Kill Rankings

Home / SEO News / JavaScript SEO and How to Fix JS Rendering Issues That Kill Rankings
David Galvin
24 March 2023
Read Time: 21 Minutes
Article Summary

JavaScript powers most modern websites. It creates smooth interactions, dynamic content loading, and the kind of polished user experience that visitors expect.

Key Takeaways

JavaScript SEO and How to Fix JS Rendering Issues That Kill Rankings

JavaScript powers most of the modern web. It also creates most of the modern web’s indexing problems. Google can render JavaScript, but the process is slower, more resource-intensive, and less reliable than crawling plain HTML. When your site depends on client-side JS to populate content, links, and metadata, you’re asking Google to do extra work with no guarantee it’ll do that work correctly or on time.

At Gorilla Marketing, we work with engineering teams running React, Angular, Vue, and Next.js stacks to diagnose exactly where the rendering pipeline breaks down and what to fix first. This guide covers how Google handles JavaScript, why JS-heavy sites underperform, the rendering strategies that solve the problem, and how to audit your own site without guessing.

What Is JavaScript SEO?

JavaScript SEO is the practice of making sure content generated or controlled by JavaScript is visible and indexable by search engines. It covers everything from how Google discovers and renders JS-powered pages to how internal links, structured data, and metadata behave when they depend on client-side execution.

On a traditional HTML site, Googlebot fetches a URL and gets back a complete document. The content is right there in the initial HTML response. On a JavaScript-heavy site, Googlebot fetches the URL and gets back a mostly empty shell. The actual content, navigation links, and sometimes even the title tag only appear after JavaScript executes in a browser-like environment. That gap between what the server sends and what the user sees is where JavaScript SEO problems live.

This isn’t a niche concern. If your site runs on React, Vue, Angular, or any SPA framework, JavaScript SEO directly affects whether your pages get indexed, how quickly they enter Google’s index, and whether they rank at all. Two concepts matter here: crawlability (can Google discover your pages and follow your links?) and renderability (can Google execute the JavaScript needed to see your content?). Traditional SEO focuses almost entirely on crawlability. JavaScript SEO adds the renderability layer on top.

How Does Google’s Rendering Pipeline Work?

Google doesn’t process JavaScript the way your browser does. Understanding the pipeline is essential because it explains why JS sites behave differently in search than they behave for users.

The process works in three stages:

Stage 1: Crawling

Googlebot sends an HTTP request and receives the initial HTML response. At this point, it processes whatever is in that raw HTML: title tags, meta descriptions, canonical tags, and any content or links present in the source. If your page returns meaningful content at this stage, you’re in good shape. If it returns a near-empty

, Google has to do more work.

Stage 2: Rendering queue

Pages that need JavaScript execution get placed in a rendering queue. Google uses a headless Chromium instance (the same engine behind Chrome, running without a visible browser window) to execute JavaScript and produce the fully rendered DOM. This rendering step is separate from crawling and happens later, sometimes minutes later, sometimes days later.

That delay matters. A pure HTML page gets indexed at crawl time. A JS-dependent page gets indexed only after rendering completes. During high-crawl periods like a product launch or site migration, that delay can mean your new pages sit invisible in search for days while the rendering queue clears.

Stage 3: Indexing

After rendering, Google processes the final DOM the same way it would process static HTML. It extracts content, follows internal links, evaluates structured data, and decides whether to index the page and how to rank it.

The key insight: Google sees two versions of your page. The initial HTML (what the server sends) and the rendered HTML (what appears after JavaScript runs). If those two versions differ significantly, you have a gap that creates SEO risk.

Why Does Client-Side Rendering Cause Problems?

Why Does Client-Side Rendering Cause Problems?

Client-side rendering (CSR) means the browser downloads a minimal HTML document and then JavaScript builds the entire page in the user’s browser. React apps bootstrapped with Create React App, for example, ship an almost empty HTML file and construct everything client-side.

For users with modern browsers and decent connections, CSR works fine. For search engines, it creates several problems:

Rendering costs crawl budget. Every page Google needs to render consumes resources. Google has a finite render budget, separate from its crawl budget. Large sites with thousands of JS-dependent pages may find that Google simply doesn’t render all of them. Pages stuck in the rendering queue don’t get indexed. Pages that don’t get indexed don’t rank.

Content in the initial HTML is what Google sees first. If Googlebot crawls your page and the initial HTML contains no meaningful content, it may make indexing decisions based on that empty shell before rendering ever happens. Google has stated that it will eventually render and re-process, but “eventually” can mean significant delays.

Internal links may be invisible. If your site’s navigation, footer links, or in-content links are injected by JavaScript, Googlebot may not discover them during the initial crawl. That breaks the site’s internal link graph and can leave entire sections of your site orphaned from Google’s perspective.

Metadata can be missing or wrong. Title tags, meta descriptions, canonical tags, and hreflang attributes generated client-side may not be present in the initial HTML. If Google processes metadata before rendering, it’ll use whatever’s in the raw HTML, which might be a default template value or nothing at all.

Structured data disappears. Schema markup injected by JavaScript faces the same rendering dependency. Google’s Rich Results Test can render JavaScript, but if the structured data isn’t in the initial HTML, there’s a window where Google might process the page without it.

What’s the Difference Between CSR, SSR, and SSG?

Three rendering strategies dominate the JavaScript ecosystem, and each has different SEO implications.

Client-side rendering (CSR)

The server sends a minimal HTML document. JavaScript running in the browser builds the page content. Google must render the page to see anything useful.

SEO risk: High. Content, links, and metadata are invisible until rendering completes.

Server-side rendering (SSR)

The server executes JavaScript and sends a fully rendered HTML document to the browser. The content is immediately visible in the initial HTML response. The browser then “hydrates” the page, attaching JavaScript event handlers to make it interactive.

SEO risk: Low. Google gets complete content at crawl time. Hydration happens client-side but doesn’t affect what search engines see.

SSR is the most SEO-friendly approach for dynamic content. Frameworks like Next.js (React) and Nuxt.js (Vue) make SSR relatively straightforward to implement. Angular Universal provides SSR for Angular applications.

Static site generation (SSG)

Pages are pre-rendered at build time rather than on each request. The server sends static HTML files that contain all the content. No server-side rendering happens per request because the pages already exist as complete HTML.

SEO risk: Very low. Same benefits as SSR, with better performance because there’s no server-side processing per request.

SSG works well for content that doesn’t change per user or per request: blog posts, documentation, product pages with infrequent updates. Next.js and Nuxt.js both support SSG alongside SSR, letting you choose the right strategy per page.

The practical tradeoff

Strategy Initial HTML SEO risk Performance Best for
CSR Empty shell High Fast after load Authenticated apps, dashboards
SSR Full content Low Slightly slower TTFB Dynamic pages, e-commerce
SSG Full content Very low Fastest Static content, blogs, docs

Most production sites don’t need to pick one strategy for every page. The smart approach is using SSR or SSG for pages that need to rank in search, and CSR for authenticated or personalized sections that don’t need indexing.

What About Dynamic Rendering?

Dynamic rendering is a middle-ground approach where the server detects whether the request comes from a search engine bot or a regular user and serves different content accordingly. Bots get a pre-rendered HTML version. Users get the standard JavaScript-powered version.

Google has explicitly stated that dynamic rendering is not cloaking, provided the content is equivalent. It’s a legitimate workaround for sites where implementing SSR across the entire stack would be prohibitively expensive or complex.

That said, Google has also called dynamic rendering a “workaround” rather than a long-term fix. The preferred approach is SSR or SSG. Dynamic rendering adds maintenance overhead because you’re effectively running two rendering paths, and any divergence between what bots see and what users see creates risk.

When dynamic rendering makes sense:

Large legacy CSR applications where retrofitting SSR would require a major rebuild

Sites with heavy personalization that can’t easily be server-rendered

Transition periods while engineering teams migrate toward SSR

When it doesn’t:

New builds (just use SSR or SSG from the start)

Sites with a small page count (the overhead isn’t worth it)

Any situation where the bot version and user version might drift apart

Services like Prerender.io and Rendertron handle dynamic rendering by maintaining a cache of pre-rendered pages served to bots. They work, but they add another layer of infrastructure to maintain and monitor.

How Do JavaScript Frameworks Affect SEO?

Not all JavaScript frameworks handle SEO equally. The framework itself isn’t the problem; it’s how the framework renders content by default and what tools it provides for server-side rendering.

React

React is client-side rendered by default. A vanilla React app (Create React App) sends an empty HTML shell and builds everything in the browser. For SEO, you need to pair React with a framework that provides SSR or SSG.

Next.js is the standard solution. It supports SSR, SSG, and incremental static regeneration (ISR) out of the box. ISR lets you statically generate pages but update them on a schedule without rebuilding the entire site. Next.js has become the default choice for React applications that need to rank in search.

Vue

Similar to React, Vue renders client-side by default. Single-page applications built with Vue CLI face the same indexing challenges as CSR React apps.

Nuxt.js provides SSR and SSG for Vue applications. It handles routing, meta tags, and server-side rendering automatically. If your site runs Vue and needs organic search visibility, Nuxt is the standard path.

Angular

Angular applications are client-side rendered by default and historically have been the hardest to make SEO-friendly. Angular Universal provides server-side rendering, but the implementation is more complex than Next.js or Nuxt.js equivalents.

Angular’s change detection system and dependency injection add overhead to server-side rendering, making Angular Universal slower than React or Vue SSR in many cases. Sites on Angular that need strong organic performance should evaluate whether Angular Universal meets their rendering speed requirements or whether a more fundamental architecture decision is needed.

Framework comparison for SEO

Framework Default rendering SSR solution SSG support SEO complexity
React CSR Next.js Yes (Next.js) Low with Next.js
Vue CSR Nuxt.js Yes (Nuxt.js) Low with Nuxt.js
Angular CSR Angular Universal Limited Moderate to high

The framework choice doesn’t determine your SEO outcome. The rendering strategy does. A React SPA with no SSR will underperform in search. An Angular app with properly implemented Angular Universal will index fine. The difference is how much engineering effort each path requires.

One more consideration: framework version matters. Older versions of React (pre-18), Vue 2, and Angular pre-Ivy all have different SSR capabilities and limitations compared to their current releases. If your site runs an older framework version, check whether the SSR tooling you’re evaluating is compatible before planning a rendering migration.

What Are the Most Common JavaScript SEO Issues?

What Are the Most Common JavaScript SEO Issues?

These are the problems that show up repeatedly when auditing JS-heavy sites. Most are preventable, and all are fixable without rebuilding from scratch.

Content not in the initial HTML

The single most common issue. Googlebot fetches the page and gets empty or placeholder content. The real content only appears after JavaScript executes. Check any page by viewing its source (not “Inspect Element,” which shows the rendered DOM, but “View Page Source,” which shows the initial HTML). If your main content isn’t there, Google may not see it reliably.

Internal links rendered by JavaScript

Navigation menus, footer links, sidebar links, and in-content links that only exist after JavaScript runs. If Googlebot can’t see these links in the initial HTML, it can’t follow them during the crawl phase. That means pages linked only through JavaScript navigation may never get discovered.

This is particularly damaging for e-commerce SEO where category and product pages depend on JavaScript-powered faceted navigation. If those filter links aren’t in the HTML, thousands of product pages can become invisible to search engines.

Lazy loading below-the-fold content

Lazy loading images and content that loads only when the user scrolls to it can create problems. Googlebot does scroll pages to trigger lazy loading, but its scrolling behavior isn’t identical to a human user. Content that depends on scroll events, intersection observers, or infinite scroll patterns may not fully load during Google’s rendering pass.

Use native lazy loading (loading="lazy" attribute) for images rather than custom JavaScript implementations. For text content, don’t lazy-load anything that needs to be indexed.

JavaScript errors blocking rendering

A single unhandled JavaScript error can prevent the entire page from rendering. If your analytics script throws an error, your tracking breaks. If your rendering framework throws an error, your content disappears. Google’s headless Chromium instance will encounter these errors just like a browser would, and it won’t retry.

Monitor your JavaScript error rates in production. What works in your development environment may fail in Google’s rendering environment, which runs a specific version of Chromium and may not support every browser API your code depends on.

Canonicals, meta tags, and hreflang in JavaScript

If your canonical tags, meta robots directives, or hreflang attributes are set by client-side JavaScript, there’s a risk Google will process the page before those tags are rendered. This can result in wrong canonical signals, accidental noindex directives being missed (or the opposite, default noindex being applied), and hreflang not being recognized.

Always place critical SEO directives in the initial HTML, even if the rest of the page is client-side rendered. Most frameworks allow you to set head elements server-side.

Blocked JavaScript resources

If your robots.txt file blocks Google from accessing the JavaScript files needed to render your page, Google can’t execute them. The result is a page that looks complete to users but appears empty to Googlebot. This was more common years ago when developers routinely blocked JS and CSS in robots.txt, but it still happens, especially after server migrations or CDN changes.

How Does JavaScript Affect Crawl and Render Budget?

Crawl budget and render budget are related but distinct concepts. Crawl budget determines how many pages Google will request from your site in a given period. Render budget, while not an official Google term, describes the practical limit on how many JavaScript-heavy pages Google will render.

For small sites (a few hundred pages), neither budget is typically a concern. Google can crawl and render the entire site without breaking a sweat. For large sites with tens of thousands of pages, render budget becomes a real constraint.

Every page that requires JavaScript rendering consumes more of Google’s resources than a static HTML page. If your site has 50,000 product pages and all of them need rendering, Google may only render a fraction of them in any given crawl cycle. The rest sit in the rendering queue, unindexed, until Google gets around to them.

Reducing render budget pressure:

Move to SSR or SSG for pages that need indexing

Ensure your XML sitemap only includes pages you want indexed

Fix crawl errors and redirect chains that waste crawl budget on non-existent pages

Improve server response times so Googlebot can fetch more pages per session

Use code splitting to reduce the JavaScript payload Google needs to execute per page

Code splitting breaks your JavaScript bundle into smaller chunks loaded on demand. Instead of downloading and executing your entire application to render one page, the browser (and Googlebot) only needs the JavaScript relevant to that specific page. Frameworks like Next.js and Nuxt.js handle code splitting automatically through their routing systems.

What About SPAs and Hash-Based Routing?

Single-page applications (SPAs) load one HTML document and then dynamically update the content using JavaScript as the user interacts. The URL may change via the History API (pushState) or via hash fragments (#).

Hash-based routing (URLs like example.com/#/products) is an SEO problem. Googlebot treats everything after the # sign like a fragment identifier and typically ignores it. That means example.com/#/products and example.com/#/about look like the same URL to Google. Your entire site becomes one page.

History API routing (URLs like example.com/products) is the standard approach for SEO-friendly SPAs. The URL changes appear to be real page navigations, and each URL can be individually crawled and indexed. But the content at each URL still needs to be available to Googlebot, which brings us back to the rendering problem.

The combination of SPA architecture with SSR (what frameworks like Next.js provide) solves both problems. Each URL gets a unique, server-rendered HTML response for search engines, and client-side navigation keeps the app fast and smooth for users.

How Do You Audit a JavaScript Site for SEO Issues?

A systematic audit catches the problems before they cost you rankings. Here’s the workflow we use.

Step 1: Compare source vs rendered HTML

For your most important pages, compare the raw HTML source with the rendered DOM. You can do this in Google Search Console’s URL Inspection tool, which shows both the raw HTML Google received and the rendered HTML after JavaScript execution. If the two versions differ significantly, your content depends on JavaScript rendering and is at risk.

You can also use Chrome DevTools: right-click “View Page Source” for the initial HTML, and “Inspect” for the rendered DOM. Compare the two. If your </code>, <code></p> <h1></code>, body content, or internal links are absent from the source, they’re JavaScript-dependent.</p> <h3>Step 2: Check Google Search Console’s URL Inspection</h3> <p>URL Inspection is your single most valuable tool for JavaScript SEO diagnosis. For any URL, it shows:</p> <p>Whether the page was successfully crawled</p> <p>Whether JavaScript rendering completed</p> <p>A screenshot of how Google sees the rendered page</p> <p>The rendered HTML source</p> <p>Any resource loading errors</p> <p>Whether the page is indexed</p> <p>If the screenshot shows a blank page or missing content, you have a rendering problem. If it shows the page correctly but the page isn’t indexed, the issue is elsewhere.</p> <h3>Step 3: Test with Google’s Rich Results Test</h3> <p>The Rich Results Test renders JavaScript and shows the rendered HTML output. While it’s designed for testing structured data, it’s useful for checking whether any JavaScript-generated content is visible to Google. It also flags JavaScript errors that occurred during rendering.</p> <h3>Step 4: Crawl with a JavaScript-capable crawler</h3> <p>Tools like Screaming Frog (with JavaScript rendering enabled), Sitebulb, and Lumar can crawl your site while executing JavaScript. They’ll show you which pages have content differences between the initial HTML and rendered output, which internal links only appear after rendering, and which pages have JavaScript errors.</p> <p>Set your crawler’s rendering engine to match Googlebot’s Chromium version for the most accurate results. Screaming Frog lets you configure this in its rendering settings.</p> <h3>Step 5: Check for blocked resources</h3> <p>Review your robots.txt to confirm it doesn’t block any JavaScript or CSS files needed for rendering. Use Google’s URL Inspection tool or the robots.txt tester in Search Console to verify. Pay particular attention to third-party scripts hosted on CDN domains that might have their own robots.txt restrictions.</p> <h3>Step 6: Monitor JavaScript errors</h3> <p>Check your browser console for errors on key pages. Google’s headless Chromium will encounter these same errors. Use the URL Inspection tool’s “More info” section to see if Google logged any rendering errors. Prioritize fixing errors on pages that generate the most organic traffic or target the highest-value keywords.</p> <h3>Step 7: Validate structured data rendering</h3> <p>If your site uses <a href="https://uae.gorilla.marketing/insights/schema-markup/">schema markup</a> injected by JavaScript, verify it appears in the rendered HTML. Google’s Rich Results Test and Schema Markup Validator both execute JavaScript, so they’ll show you what Google sees. But remember: JavaScript-dependent structured data is subject to the same rendering delays as your content.</p> <h2>Do AI Crawlers Handle JavaScript?</h2> <p>This is a growing concern and one most JavaScript SEO guides don’t address. Search engines aren’t the only systems crawling your site anymore. AI systems like ChatGPT, Claude, Perplexity, and Google’s AI Overviews also pull information from web pages, and their rendering capabilities vary significantly.</p> <p>Most AI crawlers do not render JavaScript. They fetch the initial HTML response and work with that. If your content depends on client-side rendering, AI systems may not see it at all. That means your site could be invisible not just in traditional search but in AI-generated answers, citations, and recommendations.</p> <p>This makes SSR and SSG even more important. Server-rendered content is accessible to every crawler, regardless of whether it supports JavaScript execution. If AI visibility matters to your organic strategy (and it increasingly should), JavaScript rendering is a barrier you need to remove.</p> <p>Social media crawlers face the same limitation. When someone shares your URL on LinkedIn, Twitter, or Facebook, those platforms’ crawlers fetch the page to generate a preview card. They don’t execute JavaScript. If your Open Graph tags, title, description, and preview image are set by client-side JS, your social shares will show blank or default content.</p> <p>The practical implication: if your content strategy includes AI visibility, social distribution, or any channel beyond traditional search, server-rendered HTML is no longer optional. It’s the only rendering approach that works everywhere.</p> <h2>How Does JavaScript Affect Internal Linking and Site Architecture?</h2> <p>Internal linking is one of the most underrated aspects of JavaScript SEO. Your <a href="https://uae.gorilla.marketing/services/technical-seo/">technical SEO</a> foundation depends on Google being able to discover and follow links between your pages. When those links exist only in JavaScript-rendered navigation, the entire link graph becomes fragile.</p> <p>Here’s what happens: Googlebot crawls your homepage and finds the initial HTML. If your main navigation is rendered by JavaScript, Googlebot may not see links to your category pages. Without those links, it doesn’t know to crawl the category pages. Without crawling the category pages, it doesn’t find product pages linked from them. A single JavaScript dependency in your navigation can cascade into thousands of undiscovered pages.</p> <p><strong>What to check:</strong></p> <p><strong>Main navigation</strong>: Links should be standard <code><a href></code> elements present in the initial HTML, not JavaScript click handlers or dynamically injected elements</p> <p><strong>Breadcrumbs</strong>: Same rule. Breadcrumbs are a strong internal linking signal and should be in the HTML source</p> <p><strong>Pagination</strong>: If you use pagination, the next/previous links need to be in the initial HTML</p> <p><strong>In-content links</strong>: Editorial links within your <a href="https://uae.gorilla.marketing/services/seo-content/">SEO content</a> should be static <code><a></code> tags, not JavaScript-powered</p> <p><strong>Footer links</strong>: Often generated by JavaScript in SPA frameworks. Check your source.</p> <p>A well-architected JavaScript site renders all navigation and linking elements server-side, even if the rest of the page content relies on client-side rendering. This preserves the crawl path while allowing the content flexibility that JavaScript frameworks provide.</p> <h2>What Performance Considerations Matter for JS SEO?</h2> <p>JavaScript weight directly affects how quickly your pages load and how much work Google’s renderer has to do. Heavy JavaScript bundles slow down both user experience and search engine processing.</p> <p><strong>Performance budgets for JavaScript:</strong></p> <p>A reasonable JavaScript budget for a page that needs to rank is under 300KB of compressed, transferred JavaScript. Many React and Angular applications ship 1MB or more. That excess JavaScript slows down Time to Interactive, increases the work Google’s renderer needs to do, and hurts <a href="https://uae.gorilla.marketing/insights/core-web-vitals/">Core Web Vitals</a> scores.</p> <p><strong>Practical steps:</strong></p> <p><strong>Code splitting</strong>: Only load the JavaScript needed for the current page. Next.js and Nuxt.js do this automatically through route-based splitting.</p> <p><strong>Tree shaking</strong>: Remove unused code from your JavaScript bundles during the build process. Modern bundlers (Webpack, Vite, esbuild) support this, but it needs to be configured correctly.</p> <p><strong>Defer non-critical scripts</strong>: Use <code>defer</code> or <code>async</code> attributes on script tags that aren’t needed for initial rendering. Analytics, chat widgets, and tracking scripts don’t need to block rendering.</p> <p><strong>Monitor bundle sizes</strong>: Track your JavaScript bundle sizes as part of your CI/CD pipeline. Set alerts when bundles exceed your budget. What you don’t measure, you can’t manage.</p> <p>The connection between JavaScript weight and <a href="https://uae.gorilla.marketing/insights/site-speed/">site speed</a> is direct. Every kilobyte of JavaScript the browser parses and executes adds time before your page becomes interactive. Google measures this through Core Web Vitals, and users measure it by leaving.</p> <h2>What Does a JavaScript SEO Migration Look Like?</h2> <p>Moving from CSR to SSR (or adopting a framework like Next.js on an existing React codebase) is the most common JavaScript SEO fix for sites with serious rendering problems. It’s also where things go wrong if the migration isn’t planned carefully.</p> <p><strong>Key migration steps:</strong></p> <p><strong>Benchmark current state</strong>: Document which pages are indexed, their current rankings, organic traffic, and any existing rendering issues. This is your baseline for measuring whether the migration helped or hurt.</p> <p><strong>Prioritize by value</strong>: You don’t have to migrate every page at once. Start with your highest-traffic, highest-revenue pages. Get those rendering server-side first, monitor the impact, and then expand.</p> <p><strong>Maintain URL parity</strong>: If you’re changing frameworks, keep the same URL structure. URL changes during a JS migration compound the risk. Handle one variable at a time.</p> <p><strong>Test rendering before launch</strong>: Use Google’s URL Inspection tool on a staging environment (or Google’s Mobile-Friendly Test for quick checks) to confirm your new rendering approach serves complete HTML to Googlebot.</p> <p><strong>Monitor post-migration</strong>: Watch Google Search Console for <a href="https://uae.gorilla.marketing/insights/crawl-errors/">crawl errors</a>, indexing drops, and rendering warnings for at least four weeks after launch. JavaScript migrations often surface edge cases that testing didn’t catch.</p> <p><strong>Validate internal links</strong>: Confirm that your site’s internal link graph survived the migration. Crawl the new site with a JavaScript-capable crawler and compare the link structure to the pre-migration crawl.</p> <h2>How Should You Approach JavaScript SEO Going Forward?</h2> <p>The direction is clear. Google’s rendering capabilities will keep improving, but the fundamental asymmetry won’t change: server-rendered content is always faster, cheaper, and more reliable for search engines to process than client-rendered content.</p> <p>If you’re starting a new project, choose a framework that supports SSR or SSG out of the box. Next.js and Nuxt.js are the obvious choices for React and Vue respectively. The SEO cost of not having server-side rendering is almost always higher than the engineering cost of implementing it.</p> <p>If you’re working with an existing CSR application, the most practical path is incremental adoption of SSR for high-value pages. You don’t need to rebuild everything at once. Identify the pages that drive revenue and organic traffic, migrate those to server-side rendering, and expand from there.</p> <p>For any JavaScript site, the non-negotiables are:</p> <p><strong>Critical SEO elements in the initial HTML</strong>: title tags, meta descriptions, canonicals, hreflang, and structured data should never depend on client-side rendering</p> <p><strong>Internal links as standard <code></strong><strong><</strong><strong>a href</strong><strong>></strong><strong></code> elements in the source HTML</strong></p> <p><strong>Regular auditing</strong>: check rendering with URL Inspection, crawl with JS-capable tools, monitor for JavaScript errors</p> <p><strong>Performance discipline</strong>: keep JavaScript bundles lean, split code by route, defer non-critical scripts</p> <p>JavaScript and SEO aren’t incompatible. But making them work together requires intentional architecture decisions, not afterthoughts. The sites that rank well on JavaScript frameworks are the ones that treated search engine renderability and crawlability as engineering requirements from day one, not problems to solve after launch. That means including SEO rendering tests in your QA process, monitoring JavaScript errors in production, and treating the initial HTML response with the same care you’d give any other critical infrastructure.</p> <p>If your team needs help diagnosing rendering issues or planning a migration from CSR to SSR, <a href="https://uae.gorilla.marketing/contact-us/">get in touch</a>. We work directly with engineering teams to fix the technical problems that hold JavaScript sites back in search.</p> </div> <section data-particle_enable="false" data-particle-mobile-disabled="false" class="elementor-section elementor-inner-section elementor-element elementor-element-7196402f elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="7196402f" data-element_type="section" data-e-type="section" data-settings="{"background_background":"classic","jet_parallax_layout_list":[],"ekit_has_onepagescroll_dot":"yes"}"> <div class="elementor-container elementor-column-gap-default"> <div class="elementor-column elementor-col-15 elementor-top-column elementor-element elementor-element-70a8351e" data-id="70a8351e" data-element_type="column" data-e-type="column"> <div class="elementor-widget-wrap elementor-element-populated"> <div class="elementor-element elementor-element-cd6547c elementor-widget elementor-widget-image" data-id="cd6547c" data-element_type="widget" data-e-type="widget" data-settings="{"ekit_we_effect_on":"none"}" data-widget_type="image.default"> <a href="https://uae.gorilla.marketing/insights/?_sf_s=&_sfm_author_link=david" target="_blank"> <img loading="lazy" width="150" height="150" src="https://uae.gorilla.marketing/wp-content/uploads/2026/03/Dave-150x150.png" class="attachment-thumbnail size-thumbnail wp-image-91731" alt="" decoding="async" srcset="https://uae.gorilla.marketing/wp-content/uploads/2026/03/Dave-150x150.png 150w, https://uae.gorilla.marketing/wp-content/uploads/2026/03/Dave-300x300.png 300w, https://uae.gorilla.marketing/wp-content/uploads/2026/03/Dave.png 500w" sizes="(max-width: 150px) 100vw, 150px" /> </a> </div> </div> </div> <div class="elementor-column elementor-col-85 elementor-top-column elementor-element elementor-element-4e948c7" data-id="4e948c7" data-element_type="column" data-e-type="column"> <div class="elementor-widget-wrap elementor-element-populated"> <div class="elementor-element elementor-element-4564be2b elementor-widget elementor-widget-text-editor" data-id="4564be2b" data-element_type="widget" data-e-type="widget" data-settings="{"ekit_we_effect_on":"none"}" data-widget_type="text-editor.default"> David Galvin </div> <div class="elementor-element elementor-element-478a708 elementor-widget elementor-widget-eael-divider" data-id="478a708" data-element_type="widget" data-e-type="widget" data-settings="{"ekit_we_effect_on":"none"}" data-widget_type="eael-divider.default"> <div class="eael-divider-wrap divider-direction-horizontal"> <div class="eael-divider horizontal solid"></div> </div> </div> <div class="elementor-element elementor-element-1043641 elementor-widget elementor-widget-text-editor" data-id="1043641" data-element_type="widget" data-e-type="widget" data-settings="{"ekit_we_effect_on":"none"}" data-widget_type="text-editor.default"> David has been in search marketing for over 8 years, specialising in technical SEO. He focuses on the technical foundations that impact visibility, including site structure, performance, and tracking. With a solid technical grounding and hands-on experience across Linux, PHP, JavaScript, and CSS, he works to identify and resolve the issues that genuinely hold websites back. If he’s not in front of a laptop, you’ll usually find him hiking up a mountain or visiting his son in Dublin. </div> </div> </div> </div> </section> <div class="elementor-element elementor-element-28ba2cdd elementor-widget elementor-widget-heading" data-id="28ba2cdd" data-element_type="widget" data-e-type="widget" data-settings="{"ekit_we_effect_on":"none"}" data-widget_type="heading.default"> <h3 class="elementor-heading-title elementor-size-default">Related <span style="color:#F5C614">Articles</span></h3> </div> <div class="elementor-element elementor-element-6230381 elementor-widget elementor-widget-eael-divider" data-id="6230381" data-element_type="widget" data-e-type="widget" data-settings="{"ekit_we_effect_on":"none"}" data-widget_type="eael-divider.default"> <div class="eael-divider-wrap divider-direction-horizontal"> <div class="eael-divider horizontal solid"></div> </div> </div> <div class="elementor-element elementor-element-7bbc13b7 elementor-posts--align-center elementor-grid-3 elementor-grid-tablet-2 elementor-grid-mobile-1 elementor-posts--thumbnail-top elementor-card-shadow-yes elementor-posts__hover-gradient elementor-widget elementor-widget-posts" data-id="7bbc13b7" data-element_type="widget" data-e-type="widget" data-settings="{"cards_columns":"3","cards_columns_tablet":"2","cards_columns_mobile":"1","cards_row_gap":{"unit":"px","size":35,"sizes":[]},"cards_row_gap_widescreen":{"unit":"px","size":"","sizes":[]},"cards_row_gap_laptop":{"unit":"px","size":"","sizes":[]},"cards_row_gap_tablet_extra":{"unit":"px","size":"","sizes":[]},"cards_row_gap_tablet":{"unit":"px","size":"","sizes":[]},"cards_row_gap_mobile_extra":{"unit":"px","size":"","sizes":[]},"cards_row_gap_mobile":{"unit":"px","size":"","sizes":[]},"ekit_we_effect_on":"none"}" data-widget_type="posts.cards"> <div class="elementor-widget-container"> <div class="elementor-posts-container elementor-posts elementor-posts--skin-cards elementor-grid" role="list"> <article class="elementor-post elementor-grid-item post-91076 post type-post status-publish format-standard has-post-thumbnail hentry category-gorilla-news category-ai-llms-news" role="listitem"> <div class="elementor-post__card"> <a class="elementor-post__thumbnail__link" href="https://uae.gorilla.marketing/insights/introducing-gorilla-ai-log/" tabindex="-1" ><div class="elementor-post__thumbnail"><img loading="lazy" width="1904" height="917" src="https://uae.gorilla.marketing/wp-content/uploads/2026/03/Gorilla-AI.png" class="attachment-full size-full wp-image-91080" alt="" decoding="async" srcset="https://uae.gorilla.marketing/wp-content/uploads/2026/03/Gorilla-AI.png 1904w, https://uae.gorilla.marketing/wp-content/uploads/2026/03/Gorilla-AI-300x144.png 300w, https://uae.gorilla.marketing/wp-content/uploads/2026/03/Gorilla-AI-1024x493.png 1024w, https://uae.gorilla.marketing/wp-content/uploads/2026/03/Gorilla-AI-768x370.png 768w, https://uae.gorilla.marketing/wp-content/uploads/2026/03/Gorilla-AI-1536x740.png 1536w" sizes="(max-width: 1904px) 100vw, 1904px" /></div></a> <div class="elementor-post__badge">Gorilla News</div> <div class="elementor-post__text"> <p class="elementor-post__title"> <a href="https://uae.gorilla.marketing/insights/introducing-gorilla-ai-log/" > Introducing Gorilla AI Log </a> </p> <a class="elementor-post__read-more" href="https://uae.gorilla.marketing/insights/introducing-gorilla-ai-log/" aria-label="Read more about Introducing Gorilla AI Log" tabindex="-1" > Read More » </a> </div> </div> </article> <article class="elementor-post elementor-grid-item post-91075 post type-post status-publish format-standard has-post-thumbnail hentry category-gorilla-news category-ppc" role="listitem"> <div class="elementor-post__card"> <a class="elementor-post__thumbnail__link" href="https://uae.gorilla.marketing/insights/introducing-canopy/" tabindex="-1" ><div class="elementor-post__thumbnail"><img loading="lazy" width="1920" height="1080" src="https://uae.gorilla.marketing/wp-content/uploads/2026/03/Canopy-Screenshot.png" class="attachment-full size-full wp-image-91110" alt="" decoding="async" srcset="https://uae.gorilla.marketing/wp-content/uploads/2026/03/Canopy-Screenshot.png 1920w, https://uae.gorilla.marketing/wp-content/uploads/2026/03/Canopy-Screenshot-300x169.png 300w, https://uae.gorilla.marketing/wp-content/uploads/2026/03/Canopy-Screenshot-1024x576.png 1024w, https://uae.gorilla.marketing/wp-content/uploads/2026/03/Canopy-Screenshot-768x432.png 768w, https://uae.gorilla.marketing/wp-content/uploads/2026/03/Canopy-Screenshot-1536x864.png 1536w" sizes="(max-width: 1920px) 100vw, 1920px" /></div></a> <div class="elementor-post__badge">Gorilla News</div> <div class="elementor-post__text"> <p class="elementor-post__title"> <a href="https://uae.gorilla.marketing/insights/introducing-canopy/" > Introducing Canopy </a> </p> <a class="elementor-post__read-more" href="https://uae.gorilla.marketing/insights/introducing-canopy/" aria-label="Read more about Introducing Canopy" tabindex="-1" > Read More » </a> </div> </div> </article> <article class="elementor-post elementor-grid-item post-90857 post type-post status-publish format-standard has-post-thumbnail hentry category-gorilla-news category-ai-llms-news category-local-news category-ppc category-seo" role="listitem"> <div class="elementor-post__card"> <a class="elementor-post__thumbnail__link" href="https://uae.gorilla.marketing/insights/introducing-gorilla-reports/" tabindex="-1" ><div class="elementor-post__thumbnail"><img loading="lazy" width="1920" height="1080" src="https://uae.gorilla.marketing/wp-content/uploads/2026/03/SEO-Dashboards-1-1.png" class="attachment-full size-full wp-image-91038" alt="" decoding="async" srcset="https://uae.gorilla.marketing/wp-content/uploads/2026/03/SEO-Dashboards-1-1.png 1920w, https://uae.gorilla.marketing/wp-content/uploads/2026/03/SEO-Dashboards-1-1-300x169.png 300w, https://uae.gorilla.marketing/wp-content/uploads/2026/03/SEO-Dashboards-1-1-1024x576.png 1024w, https://uae.gorilla.marketing/wp-content/uploads/2026/03/SEO-Dashboards-1-1-768x432.png 768w, https://uae.gorilla.marketing/wp-content/uploads/2026/03/SEO-Dashboards-1-1-1536x864.png 1536w" sizes="(max-width: 1920px) 100vw, 1920px" /></div></a> <div class="elementor-post__badge">Gorilla News</div> <div class="elementor-post__text"> <p class="elementor-post__title"> <a href="https://uae.gorilla.marketing/insights/introducing-gorilla-reports/" > Introducing Gorilla Reports </a> </p> <a class="elementor-post__read-more" href="https://uae.gorilla.marketing/insights/introducing-gorilla-reports/" aria-label="Read more about Introducing Gorilla Reports" tabindex="-1" > Read More » </a> </div> </div> </article> </div> </div> </div> </div> </div> <div class="elementor-column elementor-col-30 elementor-top-column elementor-element elementor-element-2e94824d" data-id="2e94824d" data-element_type="column" data-e-type="column" id="sidebar-sticky"> <div class="elementor-widget-wrap elementor-element-populated"> <section data-particle_enable="false" data-particle-mobile-disabled="false" class="elementor-section elementor-inner-section elementor-element elementor-element-140a666b elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="140a666b" data-element_type="section" data-e-type="section" data-settings="{"background_background":"classic","jet_parallax_layout_list":[],"ekit_has_onepagescroll_dot":"yes"}"> <div class="elementor-container elementor-column-gap-default"> <div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-760375f6" data-id="760375f6" data-element_type="column" data-e-type="column"> <div class="elementor-widget-wrap elementor-element-populated"> <div class="elementor-element elementor-element-29979c36 elementor-toc--minimized-on-mobile elementor-toc--content-ellipsis elementor-widget elementor-widget-table-of-contents" data-id="29979c36" data-element_type="widget" data-e-type="widget" data-settings="{"headings_by_tags":["h2","h3","h4","h5"],"no_headings_message":"No headings were found on this page.","minimized_on":"mobile","container":"#post-content-gorilla","exclude_headings_by_selector":[],"marker_view":"numbers","minimize_box":"yes","hierarchical_view":"yes","min_height":{"unit":"px","size":"","sizes":[]},"min_height_widescreen":{"unit":"px","size":"","sizes":[]},"min_height_laptop":{"unit":"px","size":"","sizes":[]},"min_height_tablet_extra":{"unit":"px","size":"","sizes":[]},"min_height_tablet":{"unit":"px","size":"","sizes":[]},"min_height_mobile_extra":{"unit":"px","size":"","sizes":[]},"min_height_mobile":{"unit":"px","size":"","sizes":[]},"ekit_we_effect_on":"none"}" data-widget_type="table-of-contents.default"> <div class="elementor-toc__header"> <div class="elementor-toc__header-title"> Contents </div> <div class="elementor-toc__toggle-button elementor-toc__toggle-button--expand" role="button" tabindex="0" aria-controls="elementor-toc__29979c36" aria-expanded="true" aria-label="Open table of contents"><i aria-hidden="true" class="fas fa-chevron-down"></i></div> <div class="elementor-toc__toggle-button elementor-toc__toggle-button--collapse" role="button" tabindex="0" aria-controls="elementor-toc__29979c36" aria-expanded="true" aria-label="Close table of contents"><i aria-hidden="true" class="fas fa-chevron-up"></i></div> </div> <div id="elementor-toc__29979c36" class="elementor-toc__body"> <div class="elementor-toc__spinner-container"> <i class="elementor-toc__spinner eicon-animation-spin eicon-loading" aria-hidden="true"></i> </div> </div> </div> </div> </div> </div> </section> <section data-particle_enable="false" data-particle-mobile-disabled="false" class="elementor-section elementor-inner-section elementor-element elementor-element-34c358a7 elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="34c358a7" data-element_type="section" data-e-type="section" data-settings="{"background_background":"classic","jet_parallax_layout_list":[],"ekit_has_onepagescroll_dot":"yes"}"> <div class="elementor-container elementor-column-gap-default"> <div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-3e22a944" data-id="3e22a944" data-element_type="column" data-e-type="column"> <div class="elementor-widget-wrap elementor-element-populated"> <div class="elementor-element elementor-element-392272ee elementor-widget elementor-widget-heading" data-id="392272ee" data-element_type="widget" data-e-type="widget" data-settings="{"ekit_we_effect_on":"none"}" data-widget_type="heading.default"> <h4 class="elementor-heading-title elementor-size-default">Free <span style="color:#F5C614">Audit</span></h4> </div> <div class="elementor-element elementor-element-2f1c4010 elementor-widget elementor-widget-text-editor" data-id="2f1c4010" data-element_type="widget" data-e-type="widget" data-settings="{"ekit_we_effect_on":"none"}" data-widget_type="text-editor.default"> <p style="text-align:center;">Find out where the biggest opportunities are for your business with a no-obligation audit from our team.</p> </div> <div class="elementor-element elementor-element-7276915a elementor-align-justify elementor-widget elementor-widget-button" data-id="7276915a" data-element_type="widget" data-e-type="widget" data-settings="{"ekit_we_effect_on":"none"}" data-widget_type="button.default"> <a class="elementor-button elementor-button-link elementor-size-sm" href="https://gorilla.marketing/services/free-audit/"> <span class="elementor-button-content-wrapper"> <span class="elementor-button-text">Get Started</span> </span> </a> </div> </div> </div> </div> </section> <section data-particle_enable="false" data-particle-mobile-disabled="false" class="elementor-section elementor-inner-section elementor-element elementor-element-1084db3d elementor-section-boxed elementor-section-height-default elementor-section-height-default" data-id="1084db3d" data-element_type="section" data-e-type="section" data-settings="{"background_background":"classic","jet_parallax_layout_list":[],"ekit_has_onepagescroll_dot":"yes"}"> <div class="elementor-container elementor-column-gap-default"> <div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-16ef6e7b" data-id="16ef6e7b" data-element_type="column" data-e-type="column"> <div class="elementor-widget-wrap elementor-element-populated"> <div class="elementor-element elementor-element-16345482 elementor-widget elementor-widget-heading" data-id="16345482" data-element_type="widget" data-e-type="widget" data-settings="{"ekit_we_effect_on":"none"}" data-widget_type="heading.default"> <div class="elementor-heading-title elementor-size-default">Share This Article</div> </div> <div class="elementor-element elementor-element-3cd1f8ee elementor-widget elementor-widget-html" data-id="3cd1f8ee" data-element_type="widget" data-e-type="widget" data-settings="{"ekit_we_effect_on":"none"}" data-widget_type="html.default"> <link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css" rel="stylesheet"> <div style="display:flex;gap:10px;justify-content:center;"> <a href="#" onclick="window.open('https://www.linkedin.com/sharing/share-offsite/?url='+encodeURIComponent(window.location.href),'_blank','width=600,height=400');return false;" style="width:40px;height:40px;border-radius:50%;border:1px solid #2a2a2a;display:flex;align-items:center;justify-content:center;color:#666;font-size:16px;text-decoration:none;"><i class="fa-brands fa-linkedin-in"></i></a> <a href="#" onclick="window.open('https://twitter.com/intent/tweet?url='+encodeURIComponent(window.location.href),'_blank','width=600,height=400');return false;" style="width:40px;height:40px;border-radius:50%;border:1px solid #2a2a2a;display:flex;align-items:center;justify-content:center;color:#666;font-size:16px;text-decoration:none;"><i class="fa-brands fa-x-twitter"></i></a> <a href="#" onclick="window.open('https://www.facebook.com/sharer/sharer.php?u='+encodeURIComponent(window.location.href),'_blank','width=600,height=400');return false;" style="width:40px;height:40px;border-radius:50%;border:1px solid #2a2a2a;display:flex;align-items:center;justify-content:center;color:#666;font-size:16px;text-decoration:none;"><i class="fa-brands fa-facebook-f"></i></a> <a href="#" onclick="navigator.clipboard.writeText(window.location.href);this.style.borderColor='#136800';this.style.color='#136800';return false;" style="width:40px;height:40px;border-radius:50%;border:1px solid #2a2a2a;display:flex;align-items:center;justify-content:center;color:#666;font-size:16px;text-decoration:none;"><i class="fa-solid fa-link"></i></a> </div> </div> </div> </div> </div> </section> </div> </div> </div> </section> </div> <script nitro-exclude> var heartbeatData = new FormData(); heartbeatData.append('nitroHeartbeat', '1'); fetch(location.href, {method: 'POST', body: heartbeatData, credentials: 'omit'}); </script> <script nitro-exclude> document.cookie = 'nitroCachedPage=' + (!window.NITROPACK_STATE ? '0' : '1') + '; path=/; SameSite=Lax'; </script> <script nitro-exclude> if (!window.NITROPACK_STATE || window.NITROPACK_STATE != 'FRESH') { var proxyPurgeOnly = 0; if (typeof navigator.sendBeacon !== 'undefined') { var nitroData = new FormData(); nitroData.append('nitroBeaconUrl', 'aHR0cHM6Ly91YWUuZ29yaWxsYS5tYXJrZXRpbmcvaW5zaWdodHMvamF2YXNjcmlwdC1zZW8v'); nitroData.append('nitroBeaconCookies', 'W10='); nitroData.append('nitroBeaconHash', 'a2e18d597e6d57919b6553770c3131360ef5eeb580bd6ae3c450c376015fadcb18c44a556c9f70e3049a2925e292c3fab26f1dc76af6fdebc53a25c03ffb29e6'); nitroData.append('proxyPurgeOnly', ''); nitroData.append('layout', 'post'); navigator.sendBeacon(location.href, nitroData); } else { var xhr = new XMLHttpRequest(); xhr.open('POST', location.href, true); xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); xhr.send('nitroBeaconUrl=aHR0cHM6Ly91YWUuZ29yaWxsYS5tYXJrZXRpbmcvaW5zaWdodHMvamF2YXNjcmlwdC1zZW8v&nitroBeaconCookies=W10=&nitroBeaconHash=a2e18d597e6d57919b6553770c3131360ef5eeb580bd6ae3c450c376015fadcb18c44a556c9f70e3049a2925e292c3fab26f1dc76af6fdebc53a25c03ffb29e6&proxyPurgeOnly=&layout=post'); } } </script> <footer data-elementor-type="footer" data-elementor-id="37301" class="elementor elementor-37301 elementor-location-footer" data-elementor-post-type="elementor_library"> <section data-particle_enable="false" data-particle-mobile-disabled="false" class="elementor-section elementor-top-section elementor-element elementor-element-f6a9d55 elementor-section-full_width elementor-section-stretched elementor-section-height-default elementor-section-height-default" data-id="f6a9d55" data-element_type="section" data-e-type="section" data-settings="{"stretch_section":"section-stretched","background_background":"classic","jet_parallax_layout_list":[],"ekit_has_onepagescroll_dot":"yes"}"> <div class="elementor-background-overlay"></div> <div class="elementor-container elementor-column-gap-default"> <div class="elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-6a9decb" data-id="6a9decb" data-element_type="column" data-e-type="column" data-settings="{"background_background":"classic"}"> <div class="elementor-widget-wrap elementor-element-populated"> <section data-particle_enable="false" data-particle-mobile-disabled="false" class="elementor-section elementor-inner-section elementor-element elementor-element-7a4687a elementor-section-full_width elementor-section-height-default elementor-section-height-default" data-id="7a4687a" data-element_type="section" data-e-type="section" data-settings="{"jet_parallax_layout_list":[],"ekit_has_onepagescroll_dot":"yes"}"> <div class="elementor-container elementor-column-gap-wider"> <div class="elementor-column elementor-col-25 elementor-inner-column elementor-element elementor-element-ada0a88" data-id="ada0a88" data-element_type="column" data-e-type="column"> <div class="elementor-widget-wrap elementor-element-populated"> <div class="elementor-element elementor-element-70ed673 elementor-widget elementor-widget-image" data-id="70ed673" data-element_type="widget" data-e-type="widget" data-settings="{"ekit_we_effect_on":"none"}" data-widget_type="image.default"> <img loading="lazy" width="800" height="800" src="https://uae.gorilla.marketing/wp-content/uploads/2024/07/Gorilla-Marketing-Logo-1024x1024.jpg" class="attachment-large size-large wp-image-21779" alt="" decoding="async" srcset="https://uae.gorilla.marketing/wp-content/uploads/2024/07/Gorilla-Marketing-Logo-1024x1024.jpg 1024w, https://uae.gorilla.marketing/wp-content/uploads/2024/07/Gorilla-Marketing-Logo-300x300.jpg 300w, https://uae.gorilla.marketing/wp-content/uploads/2024/07/Gorilla-Marketing-Logo-150x150.jpg 150w, https://uae.gorilla.marketing/wp-content/uploads/2024/07/Gorilla-Marketing-Logo-768x768.jpg 768w, https://uae.gorilla.marketing/wp-content/uploads/2024/07/Gorilla-Marketing-Logo-1536x1536.jpg 1536w, https://uae.gorilla.marketing/wp-content/uploads/2024/07/Gorilla-Marketing-Logo-2048x2048.jpg 2048w" sizes="(max-width: 800px) 100vw, 800px" /> </div> <div class="elementor-element elementor-element-0655c71 elementor-widget__width-initial elementor-grid-5 elementor-shape-rounded e-grid-align-center elementor-widget elementor-widget-social-icons" data-id="0655c71" data-element_type="widget" data-e-type="widget" data-settings="{"ekit_we_effect_on":"none"}" data-widget_type="social-icons.default"> <div class="elementor-social-icons-wrapper elementor-grid" role="list"> <span class="elementor-grid-item" role="listitem"> <a class="elementor-icon elementor-social-icon elementor-social-icon-linkedin elementor-repeater-item-dc06ca5" href="https://www.linkedin.com/company/gorilla-marketing-seo-manchester/" target="_blank"> <span class="elementor-screen-only">Linkedin</span> <i aria-hidden="true" class="fab fa-linkedin"></i> </a> </span> <span class="elementor-grid-item" role="listitem"> <a class="elementor-icon elementor-social-icon elementor-social-icon-instagram elementor-repeater-item-4df2b54" href="https://www.instagram.com/wearegorilla.marketing/" target="_blank"> <span class="elementor-screen-only">Instagram</span> <i aria-hidden="true" class="fab fa-instagram"></i> </a> </span> <span class="elementor-grid-item" role="listitem"> <a class="elementor-icon elementor-social-icon elementor-social-icon- elementor-repeater-item-6d5dc65" href="https://gorilla.marketing" target="_blank"> <span class="elementor-screen-only"></span> <svg xmlns="http://www.w3.org/2000/svg" id="flag-icons-gb" viewBox="0 0 640 480"><path fill="#012169" d="M0 0h640v480H0z"></path><path fill="#FFF" d="m75 0 244 181L562 0h78v62L400 241l240 178v61h-80L320 301 81 480H0v-60l239-178L0 64V0z"></path><path fill="#C8102E" d="m424 281 216 159v40L369 281zm-184 20 6 35L54 480H0zM640 0v3L391 191l2-44L590 0zM0 0l239 176h-60L0 42z"></path><path fill="#FFF" d="M241 0v480h160V0zM0 160v160h640V160z"></path><path fill="#C8102E" d="M0 193v96h640v-96zM273 0v480h96V0z"></path></svg> </a> </span> <span class="elementor-grid-item" role="listitem"> <a class="elementor-icon elementor-social-icon elementor-social-icon- elementor-repeater-item-a01083f" href="https://usa.gorilla.marketing" target="_blank"> <span class="elementor-screen-only"></span> <svg xmlns="http://www.w3.org/2000/svg" id="flag-icons-us" viewBox="0 0 640 480"><path fill="#bd3d44" d="M0 0h640v480H0"></path><path stroke="#fff" stroke-width="37" d="M0 55.3h640M0 129h640M0 203h640M0 277h640M0 351h640M0 425h640"></path><path fill="#192f5d" d="M0 0h364.8v258.5H0"></path><marker id="us-a" markerHeight="30" markerWidth="30"><path fill="#fff" d="m14 0 9 27L0 10h28L5 27z"></path></marker><path fill="none" marker-mid="url(#us-a)" d="m0 0 16 11h61 61 61 61 60L47 37h61 61 60 61L16 63h61 61 61 61 60L47 89h61 61 60 61L16 115h61 61 61 61 60L47 141h61 61 60 61L16 166h61 61 61 61 60L47 192h61 61 60 61L16 218h61 61 61 61 60z"></path></svg> </a> </span> <span class="elementor-grid-item" role="listitem"> <a class="elementor-icon elementor-social-icon elementor-social-icon- elementor-repeater-item-2d6fcd6" href="https://uae.gorilla.marketing" target="_blank"> <span class="elementor-screen-only"></span> <svg xmlns="http://www.w3.org/2000/svg" id="flag-icons-ae" viewBox="0 0 640 480"><path fill="#00732f" d="M0 0h640v160H0z"></path><path fill="#fff" d="M0 160h640v160H0z"></path><path fill="#000001" d="M0 320h640v160H0z"></path><path fill="red" d="M0 0h220v480H0z"></path></svg> </a> </span> </div> </div> </div> </div> <div class="elementor-column elementor-col-25 elementor-inner-column elementor-element elementor-element-0cf9df9" data-id="0cf9df9" data-element_type="column" data-e-type="column"> <div class="elementor-widget-wrap elementor-element-populated"> <div class="elementor-element elementor-element-22f6950 elementor-widget elementor-widget-heading" data-id="22f6950" data-element_type="widget" data-e-type="widget" data-settings="{"ekit_we_effect_on":"none"}" data-widget_type="heading.default"> <p class="elementor-heading-title elementor-size-default">About</p> </div> <div class="elementor-element elementor-element-264bbdb elementor-widget-divider--view-line elementor-widget elementor-widget-divider" data-id="264bbdb" data-element_type="widget" data-e-type="widget" data-settings="{"ekit_we_effect_on":"none"}" data-widget_type="divider.default"> <div class="elementor-divider"> <span class="elementor-divider-separator"> </span> </div> </div> <div class="elementor-element elementor-element-1a90521 elementor-icon-list--layout-traditional elementor-list-item-link-full_width elementor-widget elementor-widget-icon-list" data-id="1a90521" data-element_type="widget" data-e-type="widget" data-settings="{"ekit_we_effect_on":"none"}" data-widget_type="icon-list.default"> <ul class="elementor-icon-list-items"> <li class="elementor-icon-list-item"> <a href="/about-us/"> <span class="elementor-icon-list-icon"> <i aria-hidden="true" class="icon icon-right-arrow1"></i> </span> <span class="elementor-icon-list-text">About Gorilla Marketing</span> </a> </li> <li class="elementor-icon-list-item"> <a href="/insights/"> <span class="elementor-icon-list-icon"> <i aria-hidden="true" class="icon icon-right-arrow1"></i> </span> <span class="elementor-icon-list-text">Industry News</span> </a> </li> <li class="elementor-icon-list-item"> <a href="/meet-the-team/"> <span class="elementor-icon-list-icon"> <i aria-hidden="true" class="icon icon-right-arrow1"></i> </span> <span class="elementor-icon-list-text">Meet the Team</span> </a> </li> <li class="elementor-icon-list-item"> <a href="/contact-us/"> <span class="elementor-icon-list-icon"> <i aria-hidden="true" class="icon icon-right-arrow1"></i> </span> <span class="elementor-icon-list-text">Contact</span> </a> </li> <li class="elementor-icon-list-item"> <a href="/privacy-policy/"> <span class="elementor-icon-list-icon"> <i aria-hidden="true" class="icon icon-right-arrow1"></i> </span> <span class="elementor-icon-list-text">Privacy Policy</span> </a> </li> <li class="elementor-icon-list-item"> <a href="/terms-of-service/"> <span class="elementor-icon-list-icon"> <i aria-hidden="true" class="icon icon-right-arrow1"></i> </span> <span class="elementor-icon-list-text">Terms of Service</span> </a> </li> <li class="elementor-icon-list-item"> <a href="/sitemap/"> <span class="elementor-icon-list-icon"> <i aria-hidden="true" class="icon icon-right-arrow1"></i> </span> <span class="elementor-icon-list-text">Sitemap</span> </a> </li> </ul> </div> </div> </div> <div class="elementor-column elementor-col-25 elementor-inner-column elementor-element elementor-element-2db9004" data-id="2db9004" data-element_type="column" data-e-type="column"> <div class="elementor-widget-wrap elementor-element-populated"> <div class="elementor-element elementor-element-41aaaf0 elementor-widget elementor-widget-heading" data-id="41aaaf0" data-element_type="widget" data-e-type="widget" data-settings="{"ekit_we_effect_on":"none"}" data-widget_type="heading.default"> <p class="elementor-heading-title elementor-size-default">PPC</p> </div> <div class="elementor-element elementor-element-6fa9585 elementor-widget-divider--view-line elementor-widget elementor-widget-divider" data-id="6fa9585" data-element_type="widget" data-e-type="widget" data-settings="{"ekit_we_effect_on":"none"}" data-widget_type="divider.default"> <div class="elementor-divider"> <span class="elementor-divider-separator"> </span> </div> </div> <div class="elementor-element elementor-element-d45b9d1 elementor-icon-list--layout-traditional elementor-list-item-link-full_width elementor-widget elementor-widget-icon-list" data-id="d45b9d1" data-element_type="widget" data-e-type="widget" data-settings="{"ekit_we_effect_on":"none"}" data-widget_type="icon-list.default"> <ul class="elementor-icon-list-items"> <li class="elementor-icon-list-item"> <a href="/ppc-glossary/"> <span class="elementor-icon-list-icon"> <i aria-hidden="true" class="icon icon-right-arrow1"></i> </span> <span class="elementor-icon-list-text">PPC Glossary</span> </a> </li> <li class="elementor-icon-list-item"> <a href="https://uae.gorilla.marketing/ppc-abu-dhabi/"> <span class="elementor-icon-list-icon"> <i aria-hidden="true" class="icon icon-right-arrow1"></i> </span> <span class="elementor-icon-list-text">PPC Agency Abu Dhabi</span> </a> </li> <li class="elementor-icon-list-item"> <a href="https://uae.gorilla.marketing/ppc-dubai/"> <span class="elementor-icon-list-icon"> <i aria-hidden="true" class="icon icon-right-arrow1"></i> </span> <span class="elementor-icon-list-text">PPC Agency Dubai</span> </a> </li> <li class="elementor-icon-list-item"> <a href="https://uae.gorilla.marketing/ppc-ras-al-khaimah/"> <span class="elementor-icon-list-icon"> <i aria-hidden="true" class="icon icon-right-arrow1"></i> </span> <span class="elementor-icon-list-text">PPC Ras Al Khaimah</span> </a> </li> <li class="elementor-icon-list-item"> <a href="https://uae.gorilla.marketing/ppc-fujairah/"> <span class="elementor-icon-list-icon"> <i aria-hidden="true" class="icon icon-right-arrow1"></i> </span> <span class="elementor-icon-list-text">PPC Agency Fujairah</span> </a> </li> <li class="elementor-icon-list-item"> <a href="https://uae.gorilla.marketing/ppc-sharjah/"> <span class="elementor-icon-list-icon"> <i aria-hidden="true" class="icon icon-right-arrow1"></i> </span> <span class="elementor-icon-list-text">PPC Agency Sharjah</span> </a> </li> </ul> </div> </div> </div> <div class="elementor-column elementor-col-25 elementor-inner-column elementor-element elementor-element-b635d49" data-id="b635d49" data-element_type="column" data-e-type="column"> <div class="elementor-widget-wrap elementor-element-populated"> <div class="elementor-element elementor-element-7c15a8c elementor-widget elementor-widget-heading" data-id="7c15a8c" data-element_type="widget" data-e-type="widget" data-settings="{"ekit_we_effect_on":"none"}" data-widget_type="heading.default"> <p class="elementor-heading-title elementor-size-default">SEO</p> </div> <div class="elementor-element elementor-element-0bf8dea elementor-widget-divider--view-line elementor-widget elementor-widget-divider" data-id="0bf8dea" data-element_type="widget" data-e-type="widget" data-settings="{"ekit_we_effect_on":"none"}" data-widget_type="divider.default"> <div class="elementor-divider"> <span class="elementor-divider-separator"> </span> </div> </div> <div class="elementor-element elementor-element-2c281ee elementor-icon-list--layout-traditional elementor-list-item-link-full_width elementor-widget elementor-widget-icon-list" data-id="2c281ee" data-element_type="widget" data-e-type="widget" data-settings="{"ekit_we_effect_on":"none"}" data-widget_type="icon-list.default"> <ul class="elementor-icon-list-items"> <li class="elementor-icon-list-item"> <a href="/seo-glossary/"> <span class="elementor-icon-list-icon"> <i aria-hidden="true" class="icon icon-right-arrow1"></i> </span> <span class="elementor-icon-list-text">SEO Glossary</span> </a> </li> <li class="elementor-icon-list-item"> <a href="https://uae.gorilla.marketing/seo-abu-dhabi/"> <span class="elementor-icon-list-icon"> <i aria-hidden="true" class="icon icon-right-arrow1"></i> </span> <span class="elementor-icon-list-text">SEO Agency Abu Dhabi</span> </a> </li> <li class="elementor-icon-list-item"> <a href="https://uae.gorilla.marketing/seo-dubai/"> <span class="elementor-icon-list-icon"> <i aria-hidden="true" class="icon icon-right-arrow1"></i> </span> <span class="elementor-icon-list-text">SEO Agency Dubai</span> </a> </li> <li class="elementor-icon-list-item"> <a href="https://uae.gorilla.marketing/seo-ras-al-khaimah/"> <span class="elementor-icon-list-icon"> <i aria-hidden="true" class="icon icon-right-arrow1"></i> </span> <span class="elementor-icon-list-text">SEO Ras Al Khaimah</span> </a> </li> <li class="elementor-icon-list-item"> <a href="https://uae.gorilla.marketing/seo-fujairah/"> <span class="elementor-icon-list-icon"> <i aria-hidden="true" class="icon icon-right-arrow1"></i> </span> <span class="elementor-icon-list-text">SEO Agency Fujairah</span> </a> </li> <li class="elementor-icon-list-item"> <a href="https://uae.gorilla.marketing/seo-sharjah/"> <span class="elementor-icon-list-icon"> <i aria-hidden="true" class="icon icon-right-arrow1"></i> </span> <span class="elementor-icon-list-text">SEO Agency Sharjah</span> </a> </li> </ul> </div> </div> </div> </div> </section> <div class="elementor-element elementor-element-7ab0d88 elementor-widget elementor-widget-spacer" data-id="7ab0d88" data-element_type="widget" data-e-type="widget" data-settings="{"ekit_we_effect_on":"none"}" data-widget_type="spacer.default"> <div class="elementor-spacer"> <div class="elementor-spacer-inner"></div> </div> </div> </div> </div> </div> </section> </footer> <script> document.addEventListener('DOMContentLoaded', function() { /* ============================================ 2. HEADER SCROLL BEHAVIOUR ============================================ */ const header = document.querySelector('.sticky-header'); if (header) { let lastScroll = 0; const scrollThreshold = 200; window.addEventListener('scroll', function() { const currentScroll = window.pageYOffset; if (currentScroll > scrollThreshold) { if (currentScroll < lastScroll) { header.classList.add('header-fixed'); header.classList.remove('header-hidden'); } else { header.classList.add('header-hidden'); } } else { header.classList.remove('header-fixed'); header.classList.remove('header-hidden'); } lastScroll = currentScroll; }); } /* ============================================ 3. HERO IMAGE MAGNETIC FOLLOW EFFECT ============================================ */ const heroSection = document.getElementById('gorilla-hero'); const heroContainer = document.querySelector('.gorilla-hero-image'); if (heroSection && heroContainer) { const baseImg = heroContainer.querySelector('img'); if (baseImg) { const followImg = document.createElement('img'); followImg.src = baseImg.src; followImg.alt = baseImg.alt; followImg.className = 'hero-follow'; heroContainer.appendChild(followImg); let timeout; heroSection.addEventListener('mousemove', function(e) { const rect = heroSection.getBoundingClientRect(); const x = (e.clientX - rect.left) / rect.width - 0.5; const y = (e.clientY - rect.top) / rect.height - 0.5; const moveX = x * 30; const moveY = y * 30; followImg.classList.add('active'); followImg.style.transform = 'translate(' + moveX + 'px, ' + moveY + 'px)'; const hue = Math.round(80 + (x + 0.5) * 60); const saturate = 150 + Math.abs(x) * 100; followImg.style.filter = 'sepia(100%) saturate(' + saturate + '%) hue-rotate(' + hue + 'deg)'; clearTimeout(timeout); timeout = setTimeout(function() { followImg.classList.remove('active'); followImg.style.transform = 'translate(0, 0)'; }, 500); }); heroSection.addEventListener('mouseleave', function() { followImg.classList.remove('active'); followImg.style.transform = 'translate(0, 0)'; }); } } /* ============================================ 4. TEXT REVEAL ON SCROLL ============================================ */ const revealHeadings = document.querySelectorAll('.gorilla-reveal-heading, .gorilla-reveal-heading-dark'); if (revealHeadings.length) { // Set initial state - 5% revealed revealHeadings.forEach(function(heading) { heading.style.backgroundPosition = '95% 0'; }); window.addEventListener('scroll', function() { revealHeadings.forEach(function(heading) { const rect = heading.getBoundingClientRect(); const windowHeight = window.innerHeight; // Start when element enters viewport, complete at 50% viewport height const start = windowHeight; const end = windowHeight * 0.5; const current = rect.top; let progress = (start - current) / (start - end); progress = Math.max(0, Math.min(1, progress)); // 5% revealed at start (95% position), 100% revealed at end (0% position) const position = 95 - (progress * 95); heading.style.backgroundPosition = position + '% 0'; }); }); } /* ============================================ 5. MEGA MENU OVERLAY ============================================ */ const overlay = document.createElement('div'); overlay.className = 'mega-menu-overlay'; document.body.appendChild(overlay); const menuItems = document.querySelectorAll('.elementskit-navbar-nav > li.elementskit-megamenu-has'); const megaMenus = document.querySelectorAll('.elementskit-megamenu-panel'); function showOverlay() { overlay.classList.add('active'); } function hideOverlay() { overlay.classList.remove('active'); } menuItems.forEach(function(item) { item.addEventListener('mouseenter', showOverlay); item.addEventListener('mouseleave', function(e) { const relatedTarget = e.relatedTarget; if (!relatedTarget || !relatedTarget.closest('.elementskit-megamenu-panel')) { hideOverlay(); } }); }); megaMenus.forEach(function(menu) { menu.addEventListener('mouseenter', showOverlay); menu.addEventListener('mouseleave', function(e) { const relatedTarget = e.relatedTarget; if (!relatedTarget || !relatedTarget.closest('.elementskit-megamenu-has')) { hideOverlay(); } }); }); overlay.addEventListener('click', hideOverlay); /* ============================================ 6. MOBILE MENU DROPDOWNS Only targets #gorilla-mobile-menu ============================================ */ document.addEventListener('click', function(e) { var mobileMenu = document.getElementById('gorilla-mobile-menu'); if (!mobileMenu || !mobileMenu.contains(e.target)) return; if (e.target.closest('.elementskit-dropdown-has') || e.target.closest('.elementskit-submenu-indicator')) { var menuItem = e.target.closest('.elementskit-dropdown-has'); if (menuItem) { e.preventDefault(); var submenu = menuItem.querySelector('.elementskit-dropdown, .elementskit-megamenu-panel'); if (submenu) { var isOpen = submenu.classList.contains('show-submenu'); mobileMenu.querySelectorAll('.elementskit-dropdown.show-submenu, .elementskit-megamenu-panel.show-submenu').forEach(function(el) { el.classList.remove('show-submenu'); }); if (!isOpen) { submenu.classList.add('show-submenu'); } } } } }); }); </script> <script type="speculationrules"> {"prefetch":[{"source":"document","where":{"and":[{"href_matches":"/*"},{"not":{"href_matches":["/wp-*.php","/wp-admin/*","/wp-content/uploads/*","/wp-content/*","/wp-content/plugins/*","/wp-content/themes/hello-elementor/*","/*\\?(.+)"]}},{"not":{"selector_matches":"a[rel~=\"nofollow\"]"}},{"not":{"selector_matches":".no-prefetch, .no-prefetch a"}}]},"eagerness":"conservative"}]} </script> <link href="https://fonts.googleapis.com/css2?family=Poppins:wght@400;500;600;700&display=swap" rel="stylesheet"> <style>:root{--glc-brand:#136800;--glc-accent:#F5C614;}</style> <div id="glc-wrap"> <div id="glc-wa-chat" class="glc-panel glc-closed"></div> <div id="glc-ph-chat" class="glc-panel glc-closed"></div> <div id="glc-fabs"> <button id="glc-fab-wa" class="glc-fab"><svg width="26" height="26" viewBox="0 0 24 24" fill="#000"><path d="M17.472 14.382c-.297-.149-1.758-.867-2.03-.967-.273-.099-.471-.148-.67.15-.197.297-.767.966-.94 1.164-.173.199-.347.223-.644.075-.297-.15-1.255-.463-2.39-1.475-.883-.788-1.48-1.761-1.653-2.059-.173-.297-.018-.458.13-.606.134-.133.298-.347.446-.52.149-.174.198-.298.298-.497.099-.198.05-.371-.025-.52-.075-.149-.669-1.612-.916-2.207-.242-.579-.487-.5-.669-.51-.173-.008-.371-.01-.57-.01-.198 0-.52.074-.792.372-.272.297-1.04 1.016-1.04 2.479 0 1.462 1.065 2.875 1.213 3.074.149.198 2.096 3.2 5.077 4.487.709.306 1.262.489 1.694.625.712.227 1.36.195 1.871.118.571-.085 1.758-.719 2.006-1.413.248-.694.248-1.289.173-1.413-.074-.124-.272-.198-.57-.347m-5.421 7.403h-.004a9.87 9.87 0 01-5.031-1.378l-.361-.214-3.741.982.998-3.648-.235-.374a9.86 9.86 0 01-1.51-5.26c.001-5.45 4.436-9.884 9.888-9.884 2.64 0 5.122 1.03 6.988 2.898a9.825 9.825 0 012.893 6.994c-.003 5.45-4.437 9.884-9.885 9.884m8.413-18.297A11.815 11.815 0 0012.05 0C5.495 0 .16 5.335.157 11.892c0 2.096.547 4.142 1.588 5.945L.057 24l6.305-1.654a11.882 11.882 0 005.683 1.448h.005c6.554 0 11.89-5.335 11.893-11.893a11.821 11.821 0 00-3.48-8.413z"/></svg></button> <button id="glc-fab-ph" class="glc-fab glc-fab-phone"><svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="#fff" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M22 16.92v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07 19.5 19.5 0 0 1-6-6 19.79 19.79 0 0 1-3.07-8.67A2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72c.127.96.361 1.903.7 2.81a2 2 0 0 1-.45 2.11L8.09 9.91a16 16 0 0 0 6 6l1.27-1.27a2 2 0 0 1 2.11-.45c.907.339 1.85.573 2.81.7A2 2 0 0 1 22 16.92z"/></svg></button> </div> </div> <script> const lazyloadRunObserver = () => { const lazyloadBackgrounds = document.querySelectorAll( `.e-con.e-parent:not(.e-lazyloaded)` ); const lazyloadBackgroundObserver = new IntersectionObserver( ( entries ) => { entries.forEach( ( entry ) => { if ( entry.isIntersecting ) { let lazyloadBackground = entry.target; if( lazyloadBackground ) { lazyloadBackground.classList.add( 'e-lazyloaded' ); } lazyloadBackgroundObserver.unobserve( entry.target ); } }); }, { rootMargin: '200px 0px 200px 0px' } ); lazyloadBackgrounds.forEach( ( lazyloadBackground ) => { lazyloadBackgroundObserver.observe( lazyloadBackground ); } ); }; const events = [ 'DOMContentLoaded', 'elementor/lazyload/observe', ]; events.forEach( ( event ) => { document.addEventListener( event, lazyloadRunObserver ); } ); </script> <link rel='stylesheet' id='jeg-dynamic-style-css' href='https://uae.gorilla.marketing/wp-content/plugins/jeg-elementor-kit/lib/jeg-framework/assets/css/jeg-dynamic-styles.css?ver=1.3.0' media='all' /> <link rel='stylesheet' id='eael-37321-css' href='https://uae.gorilla.marketing/wp-content/uploads/essential-addons-elementor/eael-37321.css?ver=1679676360' media='all' /> <link rel='stylesheet' id='elementor-post-37321-css' href='https://uae.gorilla.marketing/wp-content/uploads/elementor/css/post-37321.css?ver=1783633439' media='all' /> <link rel='stylesheet' id='elementor-post-37332-css' href='https://uae.gorilla.marketing/wp-content/uploads/elementor/css/post-37332.css?ver=1783633440' media='all' /> <link rel='stylesheet' id='elementor-post-37224-css' href='https://uae.gorilla.marketing/wp-content/uploads/elementor/css/post-37224.css?ver=1783633440' media='all' /> <link rel='stylesheet' id='elementor-post-37228-css' href='https://uae.gorilla.marketing/wp-content/uploads/elementor/css/post-37228.css?ver=1783633440' media='all' /> <link rel='stylesheet' id='elementor-post-37216-css' href='https://uae.gorilla.marketing/wp-content/uploads/elementor/css/post-37216.css?ver=1783633440' media='all' /> <link rel='stylesheet' id='elementor-post-37220-css' href='https://uae.gorilla.marketing/wp-content/uploads/elementor/css/post-37220.css?ver=1783633441' media='all' /> <link rel='stylesheet' id='jet-elements-css' href='https://uae.gorilla.marketing/wp-content/plugins/jet-elements/assets/css/jet-elements.css?ver=2.8.0' media='all' /> <link rel='stylesheet' id='elementskit-reset-button-for-pro-form-css-css' href='https://uae.gorilla.marketing/wp-content/plugins/elementskit/modules/pro-form-reset-button/assets/css/elementskit-reset-button.css?ver=4.2.2' media='all' /> <script id="ekit-widget-scripts-js" src="https://uae.gorilla.marketing/wp-content/plugins/elementskit-lite/widgets/init/assets/js/widget-scripts.js?ver=3.8.2"></script> <script id="glc-front-js-extra"> var glcData = {"settings":{"whatsapp_number":"447572025314","email_to":"info@gorilla.marketing","wa_header_text":"How can we help?","phone_header_text":"Speak with us","brand_color":"#136800","accent_color":"#F5C614","phone_uk":"+447572025314","phone_us":"+1 334 829 0341","phone_uae":"+971 58 694 4142","phone_uk_hours":"Mon-Fri, 9am - 5pm GMT","phone_us_hours":"Mon-Fri, 9am - 5pm EST","phone_uae_hours":"Sun-Thu, 9am - 5pm GST","owner_email":"","meet_duration":15,"meet_title_template":"Meeting - {name}","crm_webhook_url":"https://sales.gorilla.marketing/api/webhook.php","crm_webhook_secret":"grla_wh_103cf5d00af0a2e99ef7a6b5039db1d07dcf916aa2a32485d7412b66422935c1"},"wa_tree":{"nodes":[{"id":"start","type":"choice","message":"Hello! \ud83d\udc4b Welcome to Gorilla Marketing. How can we be of assistance today?","options":[{"label":"Book a Free Audit","next":"audit_name","field_label":"Enquiry Type"},{"label":"Existing Client","next":"ec_department","field_label":"Enquiry Type"},{"label":"Something Else","next":"se_name","field_label":"Enquiry Type"}]},{"id":"audit_name","type":"input","message":"That is definitely something we could get booked in for you! What's your name?","input_type":"text","placeholder":"Your name","field_label":"Name","next":"audit_has_website"},{"id":"audit_has_website","type":"choice","message":"Nice to meet you {name}! Do you have a website?","options":[{"label":"Yes","next":"audit_website_url","field_label":"Has Website"},{"label":"No","next":"audit_no_website","field_label":"Has Website"}]},{"id":"audit_no_website","type":"end_message","message":"Unfortunately we're unable to provide a free audit without an existing website. If you'd like to discuss building a new website, feel free to get in touch!"},{"id":"audit_website_url","type":"input","message":"Could you kindly provide your website URL?","input_type":"text","placeholder":"www.example.com","field_label":"Website","next":"audit_channels"},{"id":"audit_channels","type":"multi_choice","message":"Are you currently running any digital marketing campaigns? Select all that apply:","field_label":"Current Channels","next":"audit_goals","options":[{"label":"SEO"},{"label":"PPC / Google Ads"},{"label":"Social Media Ads"}]},{"id":"audit_goals","type":"input","message":"Please provide a brief summary of your marketing goals, key terms or KPIs.","input_type":"text","placeholder":"E.g. increase organic traffic, rank for \"industrial shelving UK\"...","field_label":"Goals","next":"audit_competitors","large":true},{"id":"audit_competitors","type":"input","message":"Are there any competitors you'd like us to include in the audit?","input_type":"text","placeholder":"E.g. www.competitor1.com, www.competitor2.com","field_label":"Competitors","next":"audit_summary","large":true},{"id":"audit_summary","type":"summary","message":"Here's a summary of your audit request. Does everything look correct?","next_yes":"audit_send","show_fields":["Name","Website","Current Channels","Goals","Competitors"]},{"id":"audit_send","type":"send","message":"How would you like to send your audit request?"},{"id":"ec_department","type":"choice","message":"Which department can we help you with?","options":[{"label":"Finance","next":"ec_name","field_label":"Department"},{"label":"SEO","next":"ec_name","field_label":"Department"},{"label":"PPC","next":"ec_name","field_label":"Department"},{"label":"Other","next":"ec_name","field_label":"Department"}]},{"id":"ec_name","type":"input","message":"What's your name?","input_type":"text","placeholder":"Your name","field_label":"Name","next":"ec_company"},{"id":"ec_company","type":"input","message":"And where are you from, {name}?","input_type":"text","placeholder":"Company name","field_label":"Company","next":"ec_send"},{"id":"ec_send","type":"send","message":"Thanks {name}! How would you like to send this?"},{"id":"se_name","type":"input","message":"No problem! What's your name?","input_type":"text","placeholder":"Your name","field_label":"Name","next":"se_details"},{"id":"se_details","type":"input","message":"Tell us a bit more about what you need, {name}:","input_type":"text","placeholder":"Give us as much detail as possible...","field_label":"Details","next":"se_callback","large":true},{"id":"se_callback","type":"choice","message":"Would you like us to call you back?","options":[{"label":"Yes please","next":"se_phone","field_label":"Callback"},{"label":"No thanks","next":"se_send","field_label":"Callback"}]},{"id":"se_phone","type":"input","message":"What's the best number to reach you on?","input_type":"tel","placeholder":"Phone number","field_label":"Phone","next":"se_send"},{"id":"se_send","type":"send","message":"Thanks {name}! How would you like to send this?"}]},"phone_tree":{"nodes":[{"id":"start","type":"choice","message":"Would you like to speak to us on the phone or book a Google Meet?","options":[{"label":"\ud83d\udcde Phone call","next":"phone_region"},{"label":"\ud83d\udcbb Book a Google Meet","next":"meet_name"}]},{"id":"phone_region","type":"phone_region","message":"Where are you calling from?"},{"id":"meet_name","type":"input","message":"Great choice! What's your name?","input_type":"text","placeholder":"Your name","field_label":"Name","next":"meet_email"},{"id":"meet_email","type":"input","message":"Nice to meet you {name}! What's your email? (We'll send the invite here)","input_type":"email","placeholder":"Email address","field_label":"Email","next":"meet_topic"},{"id":"meet_topic","type":"input","message":"What would you like to discuss, {name}?","input_type":"text","placeholder":"E.g. SEO strategy, new website...","field_label":"Topic","next":"meet_calendar"},{"id":"meet_calendar","type":"calendar","message":"Pick a date and time for your meeting:","next":"meet_confirm"}]},"ajax_url":"https://uae.gorilla.marketing/wp-admin/admin-ajax.php","nonce":"592605c136"}; //# sourceURL=glc-front-js-extra </script> <script id="glc-front-js" src="https://uae.gorilla.marketing/wp-content/plugins/gorilla-sales/assets/js/chat-frontend.js?ver=4.14.0"></script> <script id="gft-tracker-js-extra"> var gft_vars = {"ajax_url":"https://uae.gorilla.marketing/wp-admin/admin-ajax.php","nonce":"01c08e6d2e","session_id":"47b1c4e8-e835-40d0-980b-1fa0949e0907","page_url":"https://uae.gorilla.marketing/insights/javascript-seo/","debug":"1"}; //# sourceURL=gft-tracker-js-extra </script> <script id="gft-tracker-js" src="https://uae.gorilla.marketing/wp-content/plugins/gorilla-sales/assets/js/tracker.js?ver=4.14.0"></script> <script id="hello-theme-frontend-js" src="https://uae.gorilla.marketing/wp-content/themes/hello-elementor/assets/js/hello-frontend.js?ver=3.4.5"></script> <script id="eael-general-js-extra"> var localize = {"ajaxurl":"https://uae.gorilla.marketing/wp-admin/admin-ajax.php","nonce":"0cd67b7d35","i18n":{"added":"Added ","compare":"Compare","loading":"Loading..."},"eael_translate_text":{"required_text":"is a required field","invalid_text":"Invalid","billing_text":"Billing","shipping_text":"Shipping","fg_mfp_counter_text":"of"},"page_permalink":"https://uae.gorilla.marketing/insights/javascript-seo/","cart_redirectition":"","cart_page_url":"","el_breakpoints":{"mobile":{"label":"Mobile Portrait","value":767,"default_value":767,"direction":"max","is_enabled":true},"mobile_extra":{"label":"Mobile Landscape","value":880,"default_value":880,"direction":"max","is_enabled":true},"tablet":{"label":"Tablet Portrait","value":1024,"default_value":1024,"direction":"max","is_enabled":true},"tablet_extra":{"label":"Tablet Landscape","value":1200,"default_value":1200,"direction":"max","is_enabled":true},"laptop":{"label":"Laptop","value":1366,"default_value":1366,"direction":"max","is_enabled":true},"widescreen":{"label":"Widescreen","value":2400,"default_value":2400,"direction":"min","is_enabled":true}},"ParticleThemesData":{"default":"{\"particles\":{\"number\":{\"value\":160,\"density\":{\"enable\":true,\"value_area\":800}},\"color\":{\"value\":\"#ffffff\"},\"shape\":{\"type\":\"circle\",\"stroke\":{\"width\":0,\"color\":\"#000000\"},\"polygon\":{\"nb_sides\":5},\"image\":{\"src\":\"img/github.svg\",\"width\":100,\"height\":100}},\"opacity\":{\"value\":0.5,\"random\":false,\"anim\":{\"enable\":false,\"speed\":1,\"opacity_min\":0.1,\"sync\":false}},\"size\":{\"value\":3,\"random\":true,\"anim\":{\"enable\":false,\"speed\":40,\"size_min\":0.1,\"sync\":false}},\"line_linked\":{\"enable\":true,\"distance\":150,\"color\":\"#ffffff\",\"opacity\":0.4,\"width\":1},\"move\":{\"enable\":true,\"speed\":6,\"direction\":\"none\",\"random\":false,\"straight\":false,\"out_mode\":\"out\",\"bounce\":false,\"attract\":{\"enable\":false,\"rotateX\":600,\"rotateY\":1200}}},\"interactivity\":{\"detect_on\":\"canvas\",\"events\":{\"onhover\":{\"enable\":true,\"mode\":\"repulse\"},\"onclick\":{\"enable\":true,\"mode\":\"push\"},\"resize\":true},\"modes\":{\"grab\":{\"distance\":400,\"line_linked\":{\"opacity\":1}},\"bubble\":{\"distance\":400,\"size\":40,\"duration\":2,\"opacity\":8,\"speed\":3},\"repulse\":{\"distance\":200,\"duration\":0.4},\"push\":{\"particles_nb\":4},\"remove\":{\"particles_nb\":2}}},\"retina_detect\":true}","nasa":"{\"particles\":{\"number\":{\"value\":250,\"density\":{\"enable\":true,\"value_area\":800}},\"color\":{\"value\":\"#ffffff\"},\"shape\":{\"type\":\"circle\",\"stroke\":{\"width\":0,\"color\":\"#000000\"},\"polygon\":{\"nb_sides\":5},\"image\":{\"src\":\"img/github.svg\",\"width\":100,\"height\":100}},\"opacity\":{\"value\":1,\"random\":true,\"anim\":{\"enable\":true,\"speed\":1,\"opacity_min\":0,\"sync\":false}},\"size\":{\"value\":3,\"random\":true,\"anim\":{\"enable\":false,\"speed\":4,\"size_min\":0.3,\"sync\":false}},\"line_linked\":{\"enable\":false,\"distance\":150,\"color\":\"#ffffff\",\"opacity\":0.4,\"width\":1},\"move\":{\"enable\":true,\"speed\":1,\"direction\":\"none\",\"random\":true,\"straight\":false,\"out_mode\":\"out\",\"bounce\":false,\"attract\":{\"enable\":false,\"rotateX\":600,\"rotateY\":600}}},\"interactivity\":{\"detect_on\":\"canvas\",\"events\":{\"onhover\":{\"enable\":true,\"mode\":\"bubble\"},\"onclick\":{\"enable\":true,\"mode\":\"repulse\"},\"resize\":true},\"modes\":{\"grab\":{\"distance\":400,\"line_linked\":{\"opacity\":1}},\"bubble\":{\"distance\":250,\"size\":0,\"duration\":2,\"opacity\":0,\"speed\":3},\"repulse\":{\"distance\":400,\"duration\":0.4},\"push\":{\"particles_nb\":4},\"remove\":{\"particles_nb\":2}}},\"retina_detect\":true}","bubble":"{\"particles\":{\"number\":{\"value\":15,\"density\":{\"enable\":true,\"value_area\":800}},\"color\":{\"value\":\"#1b1e34\"},\"shape\":{\"type\":\"polygon\",\"stroke\":{\"width\":0,\"color\":\"#000\"},\"polygon\":{\"nb_sides\":6},\"image\":{\"src\":\"img/github.svg\",\"width\":100,\"height\":100}},\"opacity\":{\"value\":0.3,\"random\":true,\"anim\":{\"enable\":false,\"speed\":1,\"opacity_min\":0.1,\"sync\":false}},\"size\":{\"value\":50,\"random\":false,\"anim\":{\"enable\":true,\"speed\":10,\"size_min\":40,\"sync\":false}},\"line_linked\":{\"enable\":false,\"distance\":200,\"color\":\"#ffffff\",\"opacity\":1,\"width\":2},\"move\":{\"enable\":true,\"speed\":8,\"direction\":\"none\",\"random\":false,\"straight\":false,\"out_mode\":\"out\",\"bounce\":false,\"attract\":{\"enable\":false,\"rotateX\":600,\"rotateY\":1200}}},\"interactivity\":{\"detect_on\":\"canvas\",\"events\":{\"onhover\":{\"enable\":false,\"mode\":\"grab\"},\"onclick\":{\"enable\":false,\"mode\":\"push\"},\"resize\":true},\"modes\":{\"grab\":{\"distance\":400,\"line_linked\":{\"opacity\":1}},\"bubble\":{\"distance\":400,\"size\":40,\"duration\":2,\"opacity\":8,\"speed\":3},\"repulse\":{\"distance\":200,\"duration\":0.4},\"push\":{\"particles_nb\":4},\"remove\":{\"particles_nb\":2}}},\"retina_detect\":true}","snow":"{\"particles\":{\"number\":{\"value\":450,\"density\":{\"enable\":true,\"value_area\":800}},\"color\":{\"value\":\"#fff\"},\"shape\":{\"type\":\"circle\",\"stroke\":{\"width\":0,\"color\":\"#000000\"},\"polygon\":{\"nb_sides\":5},\"image\":{\"src\":\"img/github.svg\",\"width\":100,\"height\":100}},\"opacity\":{\"value\":0.5,\"random\":true,\"anim\":{\"enable\":false,\"speed\":1,\"opacity_min\":0.1,\"sync\":false}},\"size\":{\"value\":5,\"random\":true,\"anim\":{\"enable\":false,\"speed\":40,\"size_min\":0.1,\"sync\":false}},\"line_linked\":{\"enable\":false,\"distance\":500,\"color\":\"#ffffff\",\"opacity\":0.4,\"width\":2},\"move\":{\"enable\":true,\"speed\":6,\"direction\":\"bottom\",\"random\":false,\"straight\":false,\"out_mode\":\"out\",\"bounce\":false,\"attract\":{\"enable\":false,\"rotateX\":600,\"rotateY\":1200}}},\"interactivity\":{\"detect_on\":\"canvas\",\"events\":{\"onhover\":{\"enable\":true,\"mode\":\"bubble\"},\"onclick\":{\"enable\":true,\"mode\":\"repulse\"},\"resize\":true},\"modes\":{\"grab\":{\"distance\":400,\"line_linked\":{\"opacity\":0.5}},\"bubble\":{\"distance\":400,\"size\":4,\"duration\":0.3,\"opacity\":1,\"speed\":3},\"repulse\":{\"distance\":200,\"duration\":0.4},\"push\":{\"particles_nb\":4},\"remove\":{\"particles_nb\":2}}},\"retina_detect\":true}","nyan_cat":"{\"particles\":{\"number\":{\"value\":150,\"density\":{\"enable\":false,\"value_area\":800}},\"color\":{\"value\":\"#ffffff\"},\"shape\":{\"type\":\"star\",\"stroke\":{\"width\":0,\"color\":\"#000000\"},\"polygon\":{\"nb_sides\":5},\"image\":{\"src\":\"http://wiki.lexisnexis.com/academic/images/f/fb/Itunes_podcast_icon_300.jpg\",\"width\":100,\"height\":100}},\"opacity\":{\"value\":0.5,\"random\":false,\"anim\":{\"enable\":false,\"speed\":1,\"opacity_min\":0.1,\"sync\":false}},\"size\":{\"value\":4,\"random\":true,\"anim\":{\"enable\":false,\"speed\":40,\"size_min\":0.1,\"sync\":false}},\"line_linked\":{\"enable\":false,\"distance\":150,\"color\":\"#ffffff\",\"opacity\":0.4,\"width\":1},\"move\":{\"enable\":true,\"speed\":14,\"direction\":\"left\",\"random\":false,\"straight\":true,\"out_mode\":\"out\",\"bounce\":false,\"attract\":{\"enable\":false,\"rotateX\":600,\"rotateY\":1200}}},\"interactivity\":{\"detect_on\":\"canvas\",\"events\":{\"onhover\":{\"enable\":false,\"mode\":\"grab\"},\"onclick\":{\"enable\":true,\"mode\":\"repulse\"},\"resize\":true},\"modes\":{\"grab\":{\"distance\":200,\"line_linked\":{\"opacity\":1}},\"bubble\":{\"distance\":400,\"size\":40,\"duration\":2,\"opacity\":8,\"speed\":3},\"repulse\":{\"distance\":200,\"duration\":0.4},\"push\":{\"particles_nb\":4},\"remove\":{\"particles_nb\":2}}},\"retina_detect\":true}"},"eael_login_nonce":"2a10a8866e","eael_register_nonce":"5419f50d52","eael_lostpassword_nonce":"7e97bedd8a","eael_resetpassword_nonce":"8b8bd7cdf7"}; //# sourceURL=eael-general-js-extra </script> <script id="eael-general-js" src="https://uae.gorilla.marketing/wp-content/plugins/essential-addons-for-elementor-lite/assets/front-end/js/view/general.min.js?ver=6.5.13"></script> <script id="eael-36910-js" src="https://uae.gorilla.marketing/wp-content/uploads/essential-addons-elementor/eael-36910.js?ver=1679676360"></script> <script id="elementor-webpack-runtime-js" src="https://uae.gorilla.marketing/wp-content/plugins/elementor/assets/js/webpack.runtime.min.js?ver=3.35.7"></script> <script id="elementor-frontend-modules-js" src="https://uae.gorilla.marketing/wp-content/plugins/elementor/assets/js/frontend-modules.min.js?ver=3.35.7"></script> <script id="jquery-ui-core-js" src="https://uae.gorilla.marketing/wp-includes/js/jquery/ui/core.min.js?ver=1.13.3"></script> <script id="elementor-frontend-js-extra"> var EAELImageMaskingConfig = {"svg_dir_url":"https://uae.gorilla.marketing/wp-content/plugins/essential-addons-for-elementor-lite/assets/front-end/img/image-masking/svg-shapes/"}; //# sourceURL=elementor-frontend-js-extra </script> <script id="elementor-frontend-js-before"> var elementorFrontendConfig = {"environmentMode":{"edit":false,"wpPreview":false,"isScriptDebug":false},"i18n":{"shareOnFacebook":"Share on Facebook","shareOnTwitter":"Share on Twitter","pinIt":"Pin it","download":"Download","downloadImage":"Download image","fullscreen":"Fullscreen","zoom":"Zoom","share":"Share","playVideo":"Play Video","previous":"Previous","next":"Next","close":"Close","a11yCarouselPrevSlideMessage":"Previous slide","a11yCarouselNextSlideMessage":"Next slide","a11yCarouselFirstSlideMessage":"This is the first slide","a11yCarouselLastSlideMessage":"This is the last slide","a11yCarouselPaginationBulletMessage":"Go to slide"},"is_rtl":false,"breakpoints":{"xs":0,"sm":480,"md":768,"lg":1025,"xl":1440,"xxl":1600},"responsive":{"breakpoints":{"mobile":{"label":"Mobile Portrait","value":767,"default_value":767,"direction":"max","is_enabled":true},"mobile_extra":{"label":"Mobile Landscape","value":880,"default_value":880,"direction":"max","is_enabled":true},"tablet":{"label":"Tablet Portrait","value":1024,"default_value":1024,"direction":"max","is_enabled":true},"tablet_extra":{"label":"Tablet Landscape","value":1200,"default_value":1200,"direction":"max","is_enabled":true},"laptop":{"label":"Laptop","value":1366,"default_value":1366,"direction":"max","is_enabled":true},"widescreen":{"label":"Widescreen","value":2400,"default_value":2400,"direction":"min","is_enabled":true}},"hasCustomBreakpoints":true},"version":"3.35.7","is_static":false,"experimentalFeatures":{"additional_custom_breakpoints":true,"container":true,"e_optimized_markup":true,"theme_builder_v2":true,"hello-theme-header-footer":true,"nested-elements":true,"home_screen":true,"global_classes_should_enforce_capabilities":true,"e_variables":true,"cloud-library":true,"e_opt_in_v4_page":true,"e_components":true,"e_interactions":true,"e_editor_one":true,"import-export-customization":true,"e_pro_variables":true},"urls":{"assets":"https:\/\/uae.gorilla.marketing\/wp-content\/plugins\/elementor\/assets\/","ajaxurl":"https:\/\/uae.gorilla.marketing\/wp-admin\/admin-ajax.php","uploadUrl":"https:\/\/uae.gorilla.marketing\/wp-content\/uploads"},"nonces":{"floatingButtonsClickTracking":"8204b151f9"},"swiperClass":"swiper","settings":{"page":[],"editorPreferences":[]},"kit":{"active_breakpoints":["viewport_mobile","viewport_mobile_extra","viewport_tablet","viewport_tablet_extra","viewport_laptop","viewport_widescreen"],"global_image_lightbox":"yes","lightbox_enable_counter":"yes","lightbox_enable_fullscreen":"yes","lightbox_enable_zoom":"yes","lightbox_enable_share":"yes","lightbox_title_src":"title","lightbox_description_src":"description","hello_header_logo_type":"title","hello_header_menu_layout":"horizontal","hello_footer_logo_type":"logo"},"post":{"id":93088,"title":"JavaScript%20SEO%20and%20How%20to%20Fix%20JS%20Rendering%20Issues%20That%20Kill%20Rankings%20%7C%20Gorilla%20Marketing%20UAE","excerpt":"How Google renders JavaScript, why JS-heavy sites lose rankings, and what to do about it. Covers CSR, SSR, dynamic rendering, frameworks, and testing.","featuredImage":"https:\/\/uae.gorilla.marketing\/wp-content\/uploads\/2026\/03\/0154_1_a-photorealistic-photograph-of-a-thought_XK1BAtn4QXyRBCWJcjdn6w_2e00PK2iT0W6F3im451Emg_cover-1024x574.png"}}; //# sourceURL=elementor-frontend-js-before </script> <script id="elementor-frontend-js" src="https://uae.gorilla.marketing/wp-content/plugins/elementor/assets/js/frontend.min.js?ver=3.35.7"></script> <script id="elementor-frontend-js-after"> var jkit_ajax_url = "https://uae.gorilla.marketing/?jkit-ajax-request=jkit_elements", jkit_nonce = "2f77d55bad"; //# sourceURL=elementor-frontend-js-after </script> <script id="eael-38118-js" src="https://uae.gorilla.marketing/wp-content/uploads/essential-addons-elementor/eael-38118.js?ver=1679676360"></script> <script id="imagesloaded-js" src="https://uae.gorilla.marketing/wp-includes/js/imagesloaded.min.js?ver=5.0.0"></script> <script id="eael-37321-js" src="https://uae.gorilla.marketing/wp-content/uploads/essential-addons-elementor/eael-37321.js?ver=1679676360"></script> <script id="elementor-pro-webpack-runtime-js" src="https://uae.gorilla.marketing/wp-content/plugins/elementor-pro/assets/js/webpack-pro.runtime.min.js?ver=3.35.1"></script> <script id="wp-hooks-js" src="https://uae.gorilla.marketing/wp-includes/js/dist/hooks.min.js?ver=7496969728ca0f95732d"></script> <script id="wp-i18n-js" src="https://uae.gorilla.marketing/wp-includes/js/dist/i18n.min.js?ver=781d11515ad3d91786ec"></script> <script id="wp-i18n-js-after"> wp.i18n.setLocaleData( { 'text direction\u0004ltr': [ 'ltr' ] } ); //# sourceURL=wp-i18n-js-after </script> <script id="elementor-pro-frontend-js-before"> var ElementorProFrontendConfig = {"ajaxurl":"https:\/\/uae.gorilla.marketing\/wp-admin\/admin-ajax.php","nonce":"52aaaf5f74","urls":{"assets":"https:\/\/uae.gorilla.marketing\/wp-content\/plugins\/elementor-pro\/assets\/","rest":"https:\/\/uae.gorilla.marketing\/wp-json\/"},"settings":{"lazy_load_background_images":true},"popup":{"hasPopUps":false},"shareButtonsNetworks":{"facebook":{"title":"Facebook","has_counter":true},"twitter":{"title":"Twitter"},"linkedin":{"title":"LinkedIn","has_counter":true},"pinterest":{"title":"Pinterest","has_counter":true},"reddit":{"title":"Reddit","has_counter":true},"vk":{"title":"VK","has_counter":true},"odnoklassniki":{"title":"OK","has_counter":true},"tumblr":{"title":"Tumblr"},"digg":{"title":"Digg"},"skype":{"title":"Skype"},"stumbleupon":{"title":"StumbleUpon","has_counter":true},"mix":{"title":"Mix"},"telegram":{"title":"Telegram"},"pocket":{"title":"Pocket","has_counter":true},"xing":{"title":"XING","has_counter":true},"whatsapp":{"title":"WhatsApp"},"email":{"title":"Email"},"print":{"title":"Print"},"x-twitter":{"title":"X"},"threads":{"title":"Threads"}},"facebook_sdk":{"lang":"en_US","app_id":""},"lottie":{"defaultAnimationUrl":"https:\/\/uae.gorilla.marketing\/wp-content\/plugins\/elementor-pro\/modules\/lottie\/assets\/animations\/default.json"}}; //# sourceURL=elementor-pro-frontend-js-before </script> <script id="elementor-pro-frontend-js" src="https://uae.gorilla.marketing/wp-content/plugins/elementor-pro/assets/js/frontend.min.js?ver=3.35.1"></script> <script id="pro-elements-handlers-js" src="https://uae.gorilla.marketing/wp-content/plugins/elementor-pro/assets/js/elements-handlers.min.js?ver=3.35.1"></script> <script id="jet-blocks-jsticky-js" src="https://uae.gorilla.marketing/wp-content/plugins/jet-blocks/assets/js/lib/jsticky/jquery.jsticky.min.js?ver=1.1.0"></script> <script id="jet-blocks-js-extra"> var jetBlocksData = {"recaptchaConfig":""}; var JetHamburgerPanelSettings = {"ajaxurl":"https://uae.gorilla.marketing/wp-admin/admin-ajax.php","isMobile":"false","templateApiUrl":"https://uae.gorilla.marketing/wp-json/jet-blocks-api/v1/elementor-template","devMode":"false","restNonce":"4772e2b833"}; //# sourceURL=jet-blocks-js-extra </script> <script id="jet-blocks-js" src="https://uae.gorilla.marketing/wp-content/plugins/jet-blocks/assets/js/jet-blocks.min.js?ver=1.3.23"></script> <script id="elementskit-elementor-js-extra"> var ekit_config = {"ajaxurl":"https://uae.gorilla.marketing/wp-admin/admin-ajax.php","nonce":"41bdfd39e3"}; //# sourceURL=elementskit-elementor-js-extra </script> <script id="elementskit-elementor-js" src="https://uae.gorilla.marketing/wp-content/plugins/elementskit-lite/widgets/init/assets/js/elementor.js?ver=3.8.2"></script> <script id="elementskit-elementor-pro-js" src="https://uae.gorilla.marketing/wp-content/plugins/elementskit/widgets/init/assets/js/elementor.js?ver=4.2.2"></script> <script id="elementskit-reset-button-js" src="https://uae.gorilla.marketing/wp-content/plugins/elementskit/modules/pro-form-reset-button/assets/js/elementskit-reset-button.js?ver=4.2.2"></script> <script id="wp-emoji-settings" type="application/json"> {"baseUrl":"https://s.w.org/images/core/emoji/17.0.2/72x72/","ext":".png","svgUrl":"https://s.w.org/images/core/emoji/17.0.2/svg/","svgExt":".svg","source":{"concatemoji":"https://uae.gorilla.marketing/wp-includes/js/wp-emoji-release.min.js?ver=7.0.1"}} </script> <script type="module"> /*! This file is auto-generated */ const a=JSON.parse(document.getElementById("wp-emoji-settings").textContent),o=(window._wpemojiSettings=a,"wpEmojiSettingsSupports"),s=["flag","emoji"];function i(e){try{var t={supportTests:e,timestamp:(new Date).valueOf()};sessionStorage.setItem(o,JSON.stringify(t))}catch(e){}}function c(e,t,n){e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(t,0,0);t=new Uint32Array(e.getImageData(0,0,e.canvas.width,e.canvas.height).data);e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(n,0,0);const a=new Uint32Array(e.getImageData(0,0,e.canvas.width,e.canvas.height).data);return t.every((e,t)=>e===a[t])}function p(e,t){e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(t,0,0);var n=e.getImageData(16,16,1,1);for(let e=0;e<n.data.length;e++)if(0!==n.data[e])return!1;return!0}function u(e,t,n,a){switch(t){case"flag":return n(e,"\ud83c\udff3\ufe0f\u200d\u26a7\ufe0f","\ud83c\udff3\ufe0f\u200b\u26a7\ufe0f")?!1:!n(e,"\ud83c\udde8\ud83c\uddf6","\ud83c\udde8\u200b\ud83c\uddf6")&&!n(e,"\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc65\udb40\udc6e\udb40\udc67\udb40\udc7f","\ud83c\udff4\u200b\udb40\udc67\u200b\udb40\udc62\u200b\udb40\udc65\u200b\udb40\udc6e\u200b\udb40\udc67\u200b\udb40\udc7f");case"emoji":return!a(e,"\ud83e\u1fac8")}return!1}function f(e,t,n,a){let r;const o=(r="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?new OffscreenCanvas(300,150):document.createElement("canvas")).getContext("2d",{willReadFrequently:!0}),s=(o.textBaseline="top",o.font="600 32px Arial",{});return e.forEach(e=>{s[e]=t(o,e,n,a)}),s}function r(e){var t=document.createElement("script");t.src=e,t.defer=!0,document.head.appendChild(t)}a.supports={everything:!0,everythingExceptFlag:!0},new Promise(t=>{let n=function(){try{var e=JSON.parse(sessionStorage.getItem(o));if("object"==typeof e&&"number"==typeof e.timestamp&&(new Date).valueOf()<e.timestamp+604800&&"object"==typeof e.supportTests)return e.supportTests}catch(e){}return null}();if(!n){if("undefined"!=typeof Worker&&"undefined"!=typeof OffscreenCanvas&&"undefined"!=typeof URL&&URL.createObjectURL&&"undefined"!=typeof Blob)try{var e="postMessage("+f.toString()+"("+[JSON.stringify(s),u.toString(),c.toString(),p.toString()].join(",")+"));",a=new Blob([e],{type:"text/javascript"});const r=new Worker(URL.createObjectURL(a),{name:"wpTestEmojiSupports"});return void(r.onmessage=e=>{i(n=e.data),r.terminate(),t(n)})}catch(e){}i(n=f(s,u,c,p))}t(n)}).then(e=>{for(const n in e)a.supports[n]=e[n],a.supports.everything=a.supports.everything&&a.supports[n],"flag"!==n&&(a.supports.everythingExceptFlag=a.supports.everythingExceptFlag&&a.supports[n]);var t;a.supports.everythingExceptFlag=a.supports.everythingExceptFlag&&!a.supports.flag,a.supports.everything||((t=a.source||{}).concatemoji?r(t.concatemoji):t.wpemoji&&t.twemoji&&(r(t.twemoji),r(t.wpemoji)))}); //# sourceURL=https://uae.gorilla.marketing/wp-includes/js/wp-emoji-loader.min.js </script> <script> (function(){ // NON-INVASIVE approach — don't override XHR.send (conflicts with Gorilla Sales tracker) // Instead, use jQuery ajaxPrefilter to read form data before it's sent if (typeof jQuery !== 'undefined') { // Hook into jQuery's AJAX pipeline — reads data without modifying it jQuery.ajaxPrefilter(function(options, originalOptions, jqXHR) { if (options.data && typeof options.data === 'string' && options.data.indexOf('form_fields') !== -1) { try { var params = new URLSearchParams(options.data); var data = {}; params.forEach(function(value, key) { var match = key.match(/form_fields\[(\w+)\]/); if (match && match[1]) { data[match[1]] = value; } }); if (Object.keys(data).length > 0) { sessionStorage.setItem('gm_form_data', JSON.stringify(data)); } } catch(e) {} } }); // Also listen for Elementor's form success event as backup jQuery(document).on('submit_success', function(event, response) { // If ajaxPrefilter already captured, this is just a safety net var existing = sessionStorage.getItem('gm_form_data'); if (!existing || existing === '{}') { // Try to grab from DOM as last resort var data = {}; jQuery('.elementor-form input, .elementor-form select, .elementor-form textarea').each(function() { var name = jQuery(this).attr('name') || ''; var match = name.match(/form_fields\[(\w+)\]/); if (match && match[1]) { data[match[1]] = jQuery(this).val() || ''; } }); if (Object.keys(data).length > 0) { sessionStorage.setItem('gm_form_data', JSON.stringify(data)); } } }); } })(); </script> <script> (function() { /* Capture phase: force-navigate real links */ document.addEventListener('click', function(e) { var link = e.target.closest('.ekit-sidebar-group .elementskit-megamenu-panel a[href]'); if (link) { var href = link.getAttribute('href'); if (href && href.charAt(0) !== '#') { e.preventDefault(); e.stopImmediatePropagation(); window.location.href = href; } } }, true); /* Bubble phase: stop accordion/tab clicks from closing off-canvas */ function fixPanels() { document.querySelectorAll('.ekit-sidebar-group .elementskit-megamenu-panel').forEach(function(panel) { if (panel.dataset.gmFixed) return; panel.dataset.gmFixed = '1'; panel.addEventListener('click', function(e) { e.stopPropagation(); }, false); }); } fixPanels(); setInterval(fixPanels, 1000); })(); </script> </body> </html>