{"id":159,"date":"2026-01-25T11:06:41","date_gmt":"2026-01-25T10:06:41","guid":{"rendered":"https:\/\/seoradaritalia.it\/blog\/?p=159"},"modified":"2026-01-25T11:25:15","modified_gmt":"2026-01-25T10:25:15","slug":"contenuti-javascript-click-seo","status":"publish","type":"post","link":"https:\/\/seoradaritalia.it\/blog\/guide\/contenuti-javascript-click-seo\/","title":{"rendered":"Il &#8220;Contenuto Fantasma&#8221;: Perch\u00e9 Google ignora quello che carichi al Click."},"content":{"rendered":"\n<p>Se gestisci un sito moderno come magari un e-commerce con schede prodotto che si aprono in modale (una finestra a parte caricata dinamicamente), un blog con tab che si attivano a richiesta, o una Single Page Application (SPA) complessa fermati un istante. C&#8217;\u00e8 un&#8217;alta probabilit\u00e0 che <strong>Google non stia indicizzando una parte cruciale del tuo contenuto.<\/strong><\/p>\n\n\n\n<p>Questo \u00e8 uno dei problemi architetturali pi\u00f9 sottovalutati e, paradossalmente, pi\u00f9 diffusi nel 2025 e dibatturi anche nel 2026. Il vero corto circuito informativo \u00e8 che Google lo dichiara esplicitamente nella sua documentazione ufficiale, <strong>ma molti sviluppatori e SEO specialist continuano a ignorarlo<\/strong>, vittime di quello che in psicologia cognitiva si chiama &#8220;bias di conferma&#8221;: <em>se io lo vedo sul mio schermo, allora esiste.<\/em><\/p>\n\n\n\n<p>In questo articolo dissezioniamo la <strong>Fake News #3 L\u2019illusione del \u201cBuffet Servito\u201d<\/strong>, analizzando il comportamento di Googlebot a livello di codice per capire perch\u00e9, agli occhi del motore di ricerca, il tuo sito potrebbe essere &#8220;vuoto a met\u00e0&#8221;.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Il Problema: Contenuti che esistono solo &#8220;su richiesta&#8221;<\/h2>\n\n\n\n<p>Immagina un sito di abbigliamento. L&#8217;utente clicca su &#8220;Dettagli&#8221; in una scheda prodotto e un JavaScript carica dinamicamente le specifiche tecniche (materiale, peso, istruzioni di lavaggio). L&#8217;utente vede tutto. L&#8217;esperienza \u00e8 fluida. Ma Google? <strong>Google non vede nulla di tutto questo.<\/strong><\/p>\n\n\n\n<p>Oppure prendiamo un blog con una sezione a schede (Tabs). Il contenuto principale \u00e8 visibile, ma quando clicchi sulla tab &#8220;FAQ&#8221; o &#8220;Prodotti Correlati&#8221;, viene iniettato nuovo HTML tramite JavaScript. Ancora una volta: per l&#8217;utente \u00e8 tutto l\u00ec. Per Google, quel contenuto non \u00e8 mai arrivato.<\/p>\n\n\n\n<p>Perch\u00e9 succede? Perch\u00e9 c&#8217;\u00e8 una regola d&#8217;oro nell&#8217;architettura dei crawler che viene spesso dimenticata: <strong>Googlebot non \u00e8 un utente. Googlebot non ha le mani.<\/strong><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Come Funziona Googlebot Davvero (La Documentazione)<\/h2>\n\n\n\n<p>Per comprendere l&#8217;errore, dobbiamo guardare sotto il cofano del WRS (Web Rendering Service) di Google. Secondo la guida ufficiale <em>&#8220;<a href=\"https:\/\/developers.google.com\/search\/docs\/crawling-indexing\/javascript\/javascript-seo-basics?hl=it\" data-type=\"link\" data-id=\"https:\/\/developers.google.com\/search\/docs\/crawling-indexing\/javascript\/javascript-seo-basics?hl=it\">Understand JavaScript SEO Basics<\/a>&#8220;<\/em> (aggiornata a Dicembre 2025) e gli studi di reverse-engineering come quelli di Vercel &amp; MERJ, il processo avviene in tre fasi distinte:<\/p>\n\n\n\n<ol start=\"1\" class=\"wp-block-list\">\n<li><strong>Crawl (La richiesta):<\/strong> Googlebot effettua una richiesta HTTP GET e legge l&#8217;HTML &#8220;grezzo&#8221; che il server restituisce.<\/li>\n\n\n\n<li><strong>Render (L&#8217;esecuzione):<\/strong> Google mette la pagina in una coda (la famosa <em>Render Queue<\/em>). Quando le risorse sono disponibili (possono passare secondi o ore), esegue il JavaScript utilizzando una versione <em>headless<\/em> di Chromium (il motore di Chrome, ma senza interfaccia grafica).<\/li>\n\n\n\n<li><strong>Index (L&#8217;archiviazione):<\/strong> Google usa <strong>l&#8217;HTML renderizzato<\/strong> (il DOM statico che emerge <em>dopo<\/em> l&#8217;esecuzione automatica del JS) per indicizzare la pagina.<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">Il punto critico (Didattico)<\/h3>\n\n\n\n<p>Qui nasce l&#8217;equivoco. Molti pensano che &#8220;Renderizzare&#8221; significhi &#8220;Simulare un utente che naviga&#8221;. <strong>Falso.<\/strong> Il rendering di Googlebot esegue il JavaScript che parte <em>al caricamento<\/em> della pagina (<code>onload<\/code>, <code>onmount<\/code>). Google <strong>non esegue<\/strong> click, non fa scroll infiniti, non fa hover col mouse e non interagisce con l&#8217;interfaccia.<\/p>\n\n\n\n<p>\u00c8 scritto nero su bianco nella documentazione: <em>&#8220;If content is not visible in the rendered HTML, Google won&#8217;t be able to index it.&#8221;<\/em> (Se il contenuto non \u00e8 visibile nell&#8217;HTML renderizzato, Google non sar\u00e0 in grado di indicizzarlo.)<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Analisi del Codice: Quando il Rendering fallisce<\/h2>\n\n\n\n<p>Vediamo tre scenari reali, analizzati a livello di codice, dove il contenuto diventa invisibile (Fantasma).<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">1. Il contenuto caricato al Click (Anti-Pattern)<\/h3>\n\n\n\n<p>Questo \u00e8 l&#8217;errore pi\u00f9 comune. Il contenuto viene chiamato via API solo quando l&#8217;utente compie un&#8217;azione esplicita.<\/p>\n\n\n\n<pre class=\"wp-block-code\" style=\"border-style:none;border-width:0px\"><code>\/\/ \u274c QUESTO CODICE \u00c8 INVISIBILE PER LA SEO\n\/\/ L'evento 'click' \u00e8 il trigger necessario\ndocument.getElementById('btn-dettagli').addEventListener('click', function() {\n  fetch('\/api\/dettagli-prodotto\/' + productId)\n    .then(res =&gt; res.json())\n    .then(data =&gt; {\n      \/\/ Questo HTML viene iniettato solo se qualcuno clicca\n      document.getElementById('pannello-dettagli').innerHTML = data.html;\n    });\n});<\/code><\/pre>\n\n\n\n<p><strong>L&#8217;analisi:<\/strong> Quando Googlebot renderizza la pagina, carica il DOM ed esegue gli script iniziali. Tuttavia, poich\u00e9 Googlebot <strong>non clicca<\/strong> sul pulsante <code>#btn-dettagli<\/code>, la funzione <code>fetch<\/code> non parte mai. Il div di destinazione rimane vuoto. Per Google, i dettagli del prodotto non esistono.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">2. Lazy-Loading Aggressivo<\/h3>\n\n\n\n<p>Se usi un lazy-loading che carica il contenuto solo quando l&#8217;elemento entra nel viewport, c&#8217;\u00e8 un rischio concreto. Googlebot ridimensiona il viewport (spesso simulando un dispositivo mobile molto alto), ma non fa uno scroll &#8220;umano&#8221;. Se il contenuto \u00e8 troppo in basso o richiede uno scroll specifico per attivare il trigger JS, potrebbe rimanere escluso dal rendering.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">3. Shadow DOM non proiettato<\/h3>\n\n\n\n<p>Se utilizzi Web Components con <em>Shadow DOM<\/em> in modalit\u00e0 &#8220;closed&#8221; o senza usare correttamente gli <code>&lt;slot&gt;<\/code>, il contenuto rimane incapsulato in una &#8220;bolla&#8221; che il crawler potrebbe non penetrare o associare correttamente al documento principale.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Cosa cerca un Tool di Analisi Tecnico (Come SEO Radar)<\/h2>\n\n\n\n<p>Qui entra in gioco la differenza tra un tool SEO generico e uno strumento di <strong>diagnostica tecnica<\/strong>. Fare questa verifica manualmente per ogni pagina \u00e8 impossibile. Un tool moderno deve replicare lo stack tecnologico del crawler:<\/p>\n\n\n\n<ol start=\"1\" class=\"wp-block-list\">\n<li><strong>Fetch via cURL:<\/strong> Scarica l&#8217;HTML grezzo (Server-Side) per vedere cosa arriva prima del JS.<\/li>\n\n\n\n<li><strong>Rendering via Playwright\/Puppeteer:<\/strong> Simula un browser headless che esegue il JS, attende il network idle, ma <em>non clicca<\/em>.<\/li>\n\n\n\n<li><strong>Confronto Differenziale:<\/strong> Sovrappone i due stati.<\/li>\n<\/ol>\n\n\n\n<p>Ecco l&#8217;output che dovresti cercare in un&#8217;analisi tecnica:<\/p>\n\n\n\n<p><strong>Stato A: HTML Grezzo (Server Response)<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;div id=\"tab-contents\"&gt;&lt;\/div&gt;<\/code><\/pre>\n\n\n\n<p>Qui il contenuto non c&#8217;\u00e8 ancora.<\/p>\n\n\n\n<p><strong>Stato B: DOM Renderizzato (Googlebot View)<\/strong> Se il codice \u00e8 scritto bene, dopo l&#8217;esecuzione automatica del JS, il tool deve vedere questo:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;div id=\"tab-contents\"&gt;\n  &lt;div class=\"tab\"&gt;Contenuto Tab 1&lt;\/div&gt; &lt;\/div&gt;\n<\/code><\/pre>\n\n\n\n<p>Il tool ti dir\u00e0: <em>&#8220;\u2713 Contenuto iniettato via JS rilevato. Indicizzabile.&#8221;<\/em><\/p>\n\n\n\n<p><strong>Stato C: DOM Renderizzato Incompleto (Il problema)<\/strong> Se l&#8217;API \u00e8 lenta o il contenuto dipende da un click che il bot non ha fatto:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;div id=\"tab-contents\"&gt;\n  &lt;\/div&gt;\n<\/code><\/pre>\n\n\n\n<p>In questo caso, il tool deve lanciare un allarme: <strong>&#8220;\u26a0\ufe0f Contenuto assente nel DOM renderizzato. Rischio deindicizzazione.&#8221;<\/strong><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">La Soluzione: Come scrivere codice &#8220;Google-Friendly&#8221;<\/h2>\n\n\n\n<p>Non devi rinunciare a JavaScript. Devi solo cambiare il <strong>momento<\/strong> in cui il contenuto viene caricato. Google suggerisce due strade principali:<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">1. Server-Side Rendering (SSR) o Static Generation (SSG)<\/h3>\n\n\n\n<p>La soluzione aurea. Il server invia l&#8217;HTML gi\u00e0 completo. Il contenuto delle tab o dei modali \u00e8 gi\u00e0 nel codice sorgente, magari nascosto via CSS (<code>display: none<\/code>), ma presente semanticamente.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">2. Client-Side Rendering all&#8217;inizializzazione<\/h3>\n\n\n\n<p>Se devi usare il rendering lato client, assicurati che il fetch dei dati avvenga al montaggio del componente, non all&#8217;evento click.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ \u2705 CORRETTO: Il contenuto si carica automaticamente (Google lo vede)\nuseEffect(() =&gt; {\n  \/\/ Parte subito, senza bisogno di click\n  fetch(`\/api\/prodotto\/${productId}`)\n    .then(res =&gt; res.json())\n    .then(data =&gt; setDettagli(data));\n}, &#91;productId]);\n<\/code><\/pre>\n\n\n\n<p>Nel primo caso, Googlebot esegue la pagina, attende il fetch e vede il contenuto. Nel secondo caso (l&#8217;anti-pattern visto prima), il contenuto resta per sempre in un limbo digitale.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Checklist Operativa: Cosa Fare Adesso<\/h2>\n\n\n\n<p>Se sospetti che il tuo sito abbia contenuti &#8220;nascosti&#8221;, ecco il piano d&#8217;azione pratico:<\/p>\n\n\n\n<ol start=\"1\" class=\"wp-block-list\">\n<li><strong>Audit con il &#8220;Controllo URL&#8221;:<\/strong> Usa la Google Search Console. Inserisci un URL, clicca su &#8220;Testa URL Pubblicato&#8221; e poi su &#8220;Visualizza Pagina Testata&#8221; -&gt; &#8220;HTML&#8221;. Cerca nel codice il testo che temi non venga visto (es. &#8220;Istruzioni lavaggio&#8221;). Se non c&#8217;\u00e8 nel codice HTML della GSC, Google non lo vede.<\/li>\n\n\n\n<li><strong>Identifica le Priorit\u00e0:<\/strong> Se mancano le recensioni, \u00e8 grave ma passabile. Se manca la descrizione del prodotto o i link ai prodotti correlati, \u00e8 un&#8217;emergenza SEO.<\/li>\n\n\n\n<li><strong>Risolvi i contenuti critici:<\/strong>\n<ul class=\"wp-block-list\">\n<li>Prodotti principali? Sposta i dettagli in SSR.<\/li>\n\n\n\n<li>FAQ nascoste? Pre-caricale nel DOM iniziale (anche se nascoste visivamente).<\/li>\n\n\n\n<li>Navigazione interna? Assicurati che i link siano veri <code>&lt;a href&gt;<\/code> e non eventi <code>onclick<\/code>.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusione: L&#8217;importanza di vedere l&#8217;invisibile<\/h2>\n\n\n\n<p>Nel 2025, affidarsi alla sola ispezione visiva (&#8220;Il sito \u00e8 bello, funziona&#8221;) \u00e8 un suicidio SEO. Googlebot \u00e8 un software cieco alle interazioni umane. Se il tuo contenuto \u00e8 nascosto dietro un click, un hover o uno scroll, statisticamente \u00e8 molto probabile che Google non lo stia indicizzando.<\/p>\n\n\n\n<p>La soluzione non \u00e8 tornare all&#8217;HTML statico del 1999. \u00c8 usare JavaScript con intelligenza architetturale: carica i contenuti critici subito e verifica sempre il DOM Renderizzato, non quello visivo.<\/p>\n\n\n\n<p>In <strong>SEO Radar Italia<\/strong>, il nostro obiettivo non \u00e8 darti un bollino verde facile. \u00c8 mostrarti esattamente queste discrepanze tecniche tra HTML Grezzo e Renderizzato. Perch\u00e9 il tuo posizionamento dipende da ci\u00f2 che Google vede davvero, non da ci\u00f2 che speri che veda.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Fonti Ufficiali e Approfondimenti Accademici<\/h3>\n\n\n\n<p><strong>Google Search Central: &#8220;Understand JavaScript SEO Basics&#8221; (Dec 2025)<\/strong> La guida definitiva su come Google processa (e non processa) gli eventi JS. <a target=\"_blank\" rel=\"noreferrer noopener\" href=\"https:\/\/developers.google.com\/search\/docs\/crawling-indexing\/javascript\/javascript-seo-basics?hl=it\">Link alla documentazione ufficiale<\/a><\/p>\n\n\n\n<p><strong>Vercel &amp; MERJ Research: &#8220;Javascript SEO: How Google Crawls, Renders &amp; Indexes JS&#8221; (2024)<\/strong> Uno studio empirico su oltre 100.000 fetch che conferma: il 100% delle pagine viene renderizzato, ma il contenuto post-click viene sistematicamente ignorato. <a href=\"https:\/\/vercel.com\/blog\/how-google-handles-javascript-throughout-the-indexing-process\" data-type=\"link\" data-id=\"https:\/\/vercel.com\/blog\/how-google-handles-javascript-throughout-the-indexing-process\">Link allo studio Vercel<\/a><\/p>\n\n\n\n<p><strong>Google Search Central: &#8220;URL Inspection Tool&#8221;<\/strong> Come usare lo strumento ufficiale per vedere lo screenshot e l&#8217;HTML renderizzato da Googlebot. <a target=\"_blank\" rel=\"noreferrer noopener\" href=\"https:\/\/support.google.com\/webmasters\/answer\/9012289?hl=it\">Guida allo Strumento Controllo URL<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Se gestisci un sito moderno come magari un e-commerce con schede prodotto che si aprono in modale (una finestra a parte caricata dinamicamente), un blog con tab che si attivano a richiesta, o una Single Page Application (SPA) complessa fermati un istante. C&#8217;\u00e8 un&#8217;alta probabilit\u00e0 che Google non stia indicizzando una parte cruciale del tuo&hellip;&nbsp;<\/p>\n","protected":false},"author":1,"featured_media":167,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"neve_meta_sidebar":"","neve_meta_container":"","neve_meta_enable_content_width":"","neve_meta_content_width":0,"neve_meta_title_alignment":"","neve_meta_author_avatar":"","neve_post_elements_order":"","neve_meta_disable_header":"","neve_meta_disable_footer":"","neve_meta_disable_title":"","footnotes":""},"categories":[26],"class_list":["post-159","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-guide"],"_links":{"self":[{"href":"https:\/\/seoradaritalia.it\/blog\/wp-json\/wp\/v2\/posts\/159","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/seoradaritalia.it\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/seoradaritalia.it\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/seoradaritalia.it\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/seoradaritalia.it\/blog\/wp-json\/wp\/v2\/comments?post=159"}],"version-history":[{"count":0,"href":"https:\/\/seoradaritalia.it\/blog\/wp-json\/wp\/v2\/posts\/159\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/seoradaritalia.it\/blog\/wp-json\/wp\/v2\/media\/167"}],"wp:attachment":[{"href":"https:\/\/seoradaritalia.it\/blog\/wp-json\/wp\/v2\/media?parent=159"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/seoradaritalia.it\/blog\/wp-json\/wp\/v2\/categories?post=159"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}