En un proyecto de Django, es común encontrarse con la necesidad de personalizar la carga de anuncios según el tipo de dispositivo del usuario (móvil o escritorio). Sin embargo, al cargar ambos scripts de anuncios simultáneamente, se pueden generar conflictos. Este artículo aborda cómo resolver este problema, especialmente considerando que se está usando Cloudflare, que almacena en caché las páginas y limita la lógica del lado del servidor.
Problema Planteado
En el código de plantilla proporcionado, se cargan tanto anuncios móviles como de escritorio en dos bloques <div>
diferentes:
<div class="ads-mobile">
<script async type="application/javascript" src="https://cdn-ads.com/ad-mobile.js"></script>
<ins class="ee31" data-zoneid="68"></ins>
<script>(Ads = window.Ads || []).push({"goserve": {}});</script>
</div>
<div class="ads-desktop">
<script async type="application/javascript" src="https://cdn-ads.com/ad-desktop.js"></script>
<ins class="ee31" data-zoneid="68"></ins>
<script>(Ads = window.Ads || []).push({"goserve": {}});</script>
</div>
Dado que ambas secciones están presentes en la carga de la página, las scripts de anuncios móviles pueden interferir con los anuncios de escritorio.
Solución Propuesta
Alternativa utilizando JavaScript
Dado que no se puede utilizar lógica del lado del servidor para determinar qué anuncios mostrar debido a la caché de Cloudflare, se puede implementar una solución en el lado del cliente:
-
Detectar el Dispositivo: Utiliza JavaScript para detectar el tipo de dispositivo del usuario.
- Cargar Condicionalmente los Scripts: Basado en la detección, carga el script correspondiente y oculta el otro bloque de anuncios.
Aquí hay un ejemplo de cómo podría implementarse:
<script>
// Función para detectar el tipo de dispositivo
function isMobile() {
return /Mobi/.test(navigator.userAgent);
}
// Función para cargar anuncios
function loadAds() {
if (isMobile()) {
// Cargar anuncios móviles
const mobileAdsDiv = document.querySelector('.ads-mobile');
mobileAdsDiv.style.display = 'block'; // Mostramos el bloque de anuncios móviles
const script = document.createElement('script');
script.src = "https://cdn-ads.com/ad-mobile.js";
script.async = true;
document.body.appendChild(script);
(Ads = window.Ads || []).push({"goserve": {}});
} else {
// Cargar anuncios de escritorio
const desktopAdsDiv = document.querySelector('.ads-desktop');
desktopAdsDiv.style.display = 'block'; // Mostramos el bloque de anuncios de escritorio
const script = document.createElement('script');
script.src = "https://cdn-ads.com/ad-desktop.js";
script.async = true;
document.body.appendChild(script);
(Ads = window.Ads || []).push({"goserve": {}});
}
}
// Cargar anuncios al cargar la página
window.onload = loadAds;
</script>
<div class="ads-mobile" style="display: none;"></div>
<div class="ads-desktop" style="display: none;"></div>
Consideraciones
-
Uso de
navigator.userAgent
: Es importante recordar que aunque esta técnica es efectiva, no es infalible. Algunos usuarios pueden estar usando navegadores que alteren sus agentes de usuario. -
Impacto en el Rendimiento: Asegúrate de que el tiempo de carga de estas scripts no afecte negativamente la experiencia del usuario. Considera la posibilidad de optimizar la inclusión en producción.
- Pruebas: Prueba exhaustivamente en diferentes dispositivos y navegadores para asegurarte de que los anuncios se muestran correctamente y no hay efectos secundarios no deseados.
Con esta solución en el lado del cliente, puedes evitar el conflicto de JavaScript causado por la carga simultánea de ambos tipos de anuncios y asegurarte de que cada usuario vea el contenido apropiado en función de su dispositivo.