Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

288
Views
(Gatsby) Los iframes de Datawrapper no se muestran antes de actualizar la página

Estoy usando Datawrapper para mostrar gráficos como iframes en mi sitio web.

Recientemente migré de Remark a MDX. Con la nueva configuración, mis gráficos de Datawrapper no se cargan antes de que la página que contiene los gráficos pueda cargarse en el sentido "tradicional" (es decir, presionar Actualizar o seguir la página que contiene los gráficos directamente).

Entonces, si sigue este enlace, los gráficos se muestran bien: kolstadmagnus.no/ekspert-mener-a-ha-svaret-bak-krfs-stortingssmell .

Pero si va a la página de inicio ( kolstadmagnus.no ) y luego presiona el enlace (segunda publicación superior), los gráficos no se mostrarán.


Algo de contexto

Los iframes de Datawrapper usan este script para que los iframes respondan:

 !function(){"use strict";window.addEventListener("message",(function(e){if(void 0!==e.data["datawrapper-height"]){var t=document.querySelectorAll("iframe");for(var a in e.data["datawrapper-height"])for(var r=0;r<t.length;r++){if(t[r].contentWindow===e.source)t[r].style.height=e.data["datawrapper-height"][a]+"px"}}}))}();

Dado que Gatsby funciona de la forma en que lo hace (sin cargar todas las páginas "tradicionalmente"; lo siento, no sé cómo se llama la característica), tuve que poner este script en el archivo html.js, así:

 <body {...props.bodyAttributes}> {props.preBodyComponents} <div key={`body`} id="___gatsby" dangerouslySetInnerHTML={{ __html: props.body }} /> {props.postBodyComponents} <script dangerouslySetInnerHTML={{ __html: ` !function(){"use strict";window.addEventListener("message",(function(e){if(void 0!==e.data["datawrapper-height"]){var t=document.querySelectorAll("iframe");for(var a in e.data["datawrapper-height"])for(var r=0;r<t.length;r++){if(t[r].contentWindow===e.source)t[r].style.height=e.data["datawrapper-height"][a]+"px"}}}))}(); ` }} /> </body>;

Esto hace que la secuencia de comandos se ejecute para todo el sitio web en lugar de solo para esa página, resolviendo así el problema en el que se requiere actualizar después de ingresar a las páginas con los iframes.


Sin embargo, con MDX, los problemas han vuelto. Pero ahora los iframes no se muestran en absoluto.

¿Cómo puedo solucionar esto?

about 4 years ago · Juan Pablo Isaza
1 answers
Answer question

0

Gatsby extiende su navegación y su "página de carga" desde @reach/router , por lo tanto, desde React.

Desaconsejaría encarecidamente incrustar un script personalizado que deba representarse en ciertas páginas en html.js ya que, como señaló, se cargará globalmente. Puede lograr el mismo efecto ejecutándolo localmente o atomizándolo.

El problema al que te enfrentas es que el script apunta directamente al DOM (debido al uso de window.addEventListener ) mientras que en React (y por lo tanto con Gatsby) creas y manipulas un DOM virtual (vDOM). Jugar y manipular ambos puede causar comportamientos engañosos porque uno no sabe cuándo cambia el otro y viceversa, interrumpiendo el proceso de hidratación y rehidratación (es por eso que ves los resultados en la actualización: porque la hidratación nunca ocurre).

Dicho esto, la solución ideal sería usar un módulo Datawrapper basado en React como react-datawrapper-chart o usar otra solución personalizada. Hacer que los scripts respondan no es gran cosa, puede hacer los mismos cálculos usando código basado en React.

Alternativamente, siguiendo su enfoque de "trabajo", puede cargar su secuencia de comandos personalizada utilizando el componente Helmet en una página determinada:

 const SomeSpecificPage = () =>{ return <> <Helmet> <script dangerouslySetInnerHTML={{ __html: ` !function(){"use strict";window.addEventListener("message", (function(e){if(void 0!==e.data["datawrapper-height"]){var t=document.querySelectorAll("iframe");for(var a in e.data["datawrapper-height"])for(var r=0;r<t.length;r++){if(t[r].contentWindow===e.source)t[r].style.height=e.data["datawrapper-height"][a]+"px"}}}))}(); ` }} /> </Helmet> </> }
about 4 years ago · Juan Pablo Isaza Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!