El post vs. el spot
// ------------------------------------------------------------------------------------------------------------------------------- // PHOTOSWIPE
var initPhotoSwipeFromDOM = function(gallerySelector) {
// parse slide data (url, title, size ...) from DOM elements // (children of gallerySelector) var parseThumbnailElements = function(el) { var thumbElements = el.childNodes, numNodes = thumbElements.length, items = [], figureEl, linkEl, size, item;
for(var i = 0; i < numNodes; i++) {
figureEl = thumbElements[i]; //
// include only element nodes if(figureEl.nodeType !== 1) { continue; }
linkEl = figureEl.children[0]; // element
size = linkEl.getAttribute('data-size').split('x');
// create slide object item = { src: linkEl.getAttribute('href'), w: parseInt(size[0], 10), h: parseInt(size[1], 10) };
if(figureEl.children.length > 1) {
//
if(linkEl.children.length > 0) {
// thumbnail element, retrieving thumbnail url
item.msrc = linkEl.children[0].getAttribute('src');
}
item.el = figureEl; // save link to element for getThumbBoundsFn items.push(item); }
return items; };
// find nearest parent element var closest = function closest(el, fn) { return el && ( fn(el) ? el : closest(el.parentNode, fn) ); };
// triggers when user clicks on thumbnail var onThumbnailsClick = function(e) { e = e || window.event; e.preventDefault ? e.preventDefault() : e.returnValue = false;
var eTarget = e.target || e.srcElement;
// find root element of slide var clickedListItem = closest(eTarget, function(el) { return (el.tagName && el.tagName.toUpperCase() === 'FIGURE'); });
if(!clickedListItem) { return; }
// find index of clicked item by looping through all child nodes // alternatively, you may define index via data- attribute var clickedGallery = clickedListItem.parentNode, childNodes = clickedListItem.parentNode.childNodes, numChildNodes = childNodes.length, nodeIndex = 0, index;
for (var i = 0; i < numChildNodes; i++) { if(childNodes[i].nodeType !== 1) { continue; } if(childNodes[i] === clickedListItem) { index = nodeIndex; break; } nodeIndex++; } if(index >= 0) { // open PhotoSwipe if valid index found openPhotoSwipe( index, clickedGallery ); } return false; };
// parse picture index and gallery index from URL (#&pid=1&gid=2) var photoswipeParseHash = function() { var hash = window.location.hash.substring(1), params = {};
if(hash.length < 5) { return params; } var vars = hash.split('&'); for (var i = 0; i < vars.length; i++) { if(!vars[i]) { continue; } var pair = vars[i].split('='); if(pair.length < 2) { continue; } params[pair[0]] = pair[1]; } if(params.gid) { params.gid = parseInt(params.gid, 10); } return params; }; var openPhotoSwipe = function(index, galleryElement, disableAnimation, fromURL) { var pswpElement = document.querySelectorAll('.pswp')[0], gallery, options, items; items = parseThumbnailElements(galleryElement); // define options (if needed) options = { // define gallery index (for URL) galleryUID: galleryElement.getAttribute('data-pswp-uid'), getThumbBoundsFn: function(index) { // See Options -> getThumbBoundsFn section of documentation for more info var thumbnail = items[index].el.getElementsByTagName('img')[0], // find thumbnail pageYScroll = window.pageYOffset || document.documentElement.scrollTop, rect = thumbnail.getBoundingClientRect();
return {x:rect.left, y:rect.top + pageYScroll, w:rect.width}; }
};
// PhotoSwipe opened from URL if(fromURL) { if(options.galleryPIDs) { // parse real index when custom PIDs are used // http://photoswipe.com/documentation/faq.html#custom-pid-in-url for(var j = 0; j < items.length; j++) { if(items[j].pid == index) { options.index = j; break; } } } else { // in URL indexes start from 1 options.index = parseInt(index, 10) - 1; } } else { options.index = parseInt(index, 10); } // exit if index not found if( isNaN(options.index) ) { return; } if(disableAnimation) { options.showAnimationDuration = 0; } // Pass data to PhotoSwipe and initialize it gallery = new PhotoSwipe( pswpElement, PhotoSwipeUI_Default, items, options); gallery.init(); }; // loop through all gallery elements and bind events var galleryElements = document.querySelectorAll( gallerySelector ); for(var i = 0, l = galleryElements.length; i < l; i++) { galleryElements[i].setAttribute('data-pswp-uid', i+1); galleryElements[i].onclick = onThumbnailsClick; } // Parse URL and open gallery if it contains #&pid=3&gid=1 var hashData = photoswipeParseHash(); if(hashData.pid && hashData.gid) { openPhotoSwipe( hashData.pid , galleryElements[ hashData.gid - 1 ], true, true ); } }; // execute above function initPhotoSwipeFromDOM('.my-gallery'); // ====================================== // FIN SCRIPTS PHOTOSWIPE // ======================================
En 2006, una coincidencia de circunstancias hizo que tuviera en mi lugar de trabajo una televisión que todo el tiempo estaba sintonizada en el canal de mayor audiencia en el país. Por ello pude atestiguar, en medio de telenovelas, programas cómicos y noticieros, la incontenible avalancha de anuncios que conformaron la campaña negra contra Andrés Manuel López Obrador, entonces candidato presidencial del PRD.
De distintas formas, mediante lemas y frases hechas, diálogos fingidos y efectos especiales que simulaban todas las cosas que podrían desaparecer del patrimonio de los mexicanos (desde los muebles hasta la casa entera), se auguraba una debacle apocalíptica si ganaba el abanderado de la izquierda.
“Un peligro para México”, se repetía machaconamente en cada corte comercial. Seis o siete anuncios consecutivos, obsesivamente reiterativos. Eran los tiempos en los que todavía la pantalla chica monopolizaba buena parte del ocio. Y aquellos mensajes de alarmismo estresante desplazaron a los típicos comerciales de detergentes y consomé de pollo.
Algún efecto debió tener aquel bombardeo descomunal e incesante entre los millones de televidentes que seguían su melodrama favorito, y es muy probable que haya contribuido a cerrar la distancia entre los contendientes en las encuestas, que llegó a ser muy amplia.
Lo cierto es que aquella “guerra sucia” abrió un intenso debate que derivó en una reforma electoral que, entre otros puntos, prohibió ese tipo de propaganda agresiva. Determinación que fue objetada por analistas y algunos actores políticos al considerarla contraria a la libertad de expresión y a la naturaleza de la contienda política.
Los argumentos de aquella discusión local volverán a resonar durante los próximos meses, pero esta vez a escala global, y en una plataforma mediática distinta: las de las redes sociales. Adiós a la era del spot, ¿bienvenida la del post?
Twitter abrió fuego el miércoles al anunciar que a partir de noviembre no permitirá la propaganda política pagada en ninguno de los países donde resuenen sus trinos.
Jack Dorsey, CEO de esa plataforma, dio muchos argumentos para justificar la decisión, pero ninguno resume mejor su intención como la frase inicial: “el alcance del mensaje político debe ganarse, no comprarse”.
El anuncio llevaba un destinatario: su mucho más poderoso competidor, Facebook, que ese mismo día dio a conocer su reporte financiero trimestral. Su fundador y presidente, Mark Zuckerberg, aprovechó la ocasión para ratificar que su plataforma seguiría abierta a la compra de espacios partidistas escudándose en la libertad de expresión.
Como en todas las discusiones complejas, los argumentos de ambos tienen algo de razón pero también algo de discutible. Dorsey está en lo correcto cuando proclama que el dinero no debe determinar la influencia que alcance un mensaje. Sin embargo, no puede dejar de mencionarse que el principal influencer de la política global, el presidente estadunidense Donald Trump, logra un alcance orgánico mayúsculo en Twitter con sólo agregarle mayúsculas y signos de admiración a sus posteos, y sin invertir ahí un solo dólar.
Y, sin embargo, no parece bastarle. A finales de septiembre, el magnate neoyorquino publicó en su canal de YouTube un spot a la antigüita en la que acusa al exvicepresidente y probable contrincante demócrata Joe Biden de haber prometido mil millones de dólares a Ucrania para que despidiera al fiscal que presuntamente investigaba la corrupción de una empresa de la exrepública soviética en la que participaba su hijo, Hunter Biden. Por supuesto, Trump no aporta una prueba de su dicho y pagó a las redes sociales para que lo difundieran urbi et orbi.
A pesar de la evidente falsedad del spot, Facebook se negó a retirar el anuncio, bajo el socorrido argumento de la libertad de expresión. El mismo que reiteró incluso cuando Elizabeth Warren, la precandidata demócrata, pagó un post en esa plataforma en el que decía, como noticia de última hora, que Mark Zuckerberg decidió apoyar la reelección de Donald Trump. Un contenido evidentemente apócrifo para demostrar que, con tal de obtener dinero, la red social más grande del mundo deja pasar cualquier cosa sin una mínima verificación.
Zuckerberg aclaró el miércoles que la publicidad política no le representará ni 0.5% de sus ingresos en 2020. Y de esa forma arrojó la pelota en otra cancha: el problema no es el dinero, sino si la gente tiene la madurez necesaria para discernir por sí misma si un mensaje es verdadero o falso.
Y más allá de cuál sea la perspectiva que se imponga, lo cierto es que la publicidad partidista o electoral es sólo otra arena más de la competencia entre los gigantes de las redes sociales por ver cuál es más influyente, capitalizando distintas credenciales de corrección política.
Comentarios
// Obtener todos los elementos con clase .col-md-12 var colElements = document.querySelectorAll('.col-md-12');
// Iterar sobre cada elemento colElements.forEach(function(element) { // Verificar si tiene un hijo inmediato con clase .titulo-region var tituloRegion = element.querySelector('.titulo-region');
if (tituloRegion) { // Agregar la clase .is-sticky al elemento padre element.classList.add('is-sticky'); } });
// Obtener el elemento article dentro de .fila-especial-v2 .p50 var articleElement = document.querySelector('.home .fila-especial-v2 .p50 article');
// Obtener el texto del elemento .z-foto .bajada p var bajadaText = articleElement.querySelector('.z-foto .bajada p').textContent;
// Crear un nuevo elemento para mostrar el texto obtenido var textoElement = document.createElement('p'); textoElement.textContent = bajadaText;
// Obtener el elemento .z-txt .titulo dentro del article var tituloElement = articleElement.querySelector('.z-txt .titulo');
// Insertar el nuevo elemento al final del article articleElement.appendChild(textoElement);
Cortesía de Proceso.
Dejanos un comentario: