1/** 2 * ch-ajax-nav.js â que TODAS las secciones se abran por Ajax, con su barra roja. 3 * 4 * EL PROBLEMA. La navegación Ajax de WoWonder solo intercepta enlaces que lleven 5 * el atributo `data-ajax`. En chateando.net lo llevaban 98 enlaces y NO lo 6 * llevaban 116: el logo, los juegos, los blogs, el foro⦠Esos hacÃan recarga 7 * completa, sin barra roja y con la espera entera (Yvenel, 2026-09-09). 8 * 9 * CÃMO SE ARREGLA SIN TOCAR TREINTA PLANTILLAS. El manejador de WoWonder está 10 * delegado en `document` y en fase de burbuja: comprueba `a[data-ajax]` en el 11 * momento del clic, no al cargar la página. Asà que basta con escuchar el clic 12 * ANTES âen fase de capturaâ y poner el atributo al vuelo. Cuando el clic llega 13 * al manejador de WoWonder, el enlace ya lo lleva. 14 * 15 * Ventaja sobre recorrer el DOM: funciona también con los enlaces que aparecen 16 * después (feed infinito, contenido traÃdo por Ajax) sin observadores ni pasadas 17 * periódicas. Y si mañana este fichero desaparece, la web vuelve exactamente a 18 * como estaba: no modifica nada, solo añade un atributo al vuelo. 19 * 20 * LISTA BLANCA, NO ADIVINANZA. La regla del sitio es `/<sección>` â `?link1=<sección>`, 21 * PERO una ruta de un solo segmento también puede ser el perfil de un usuario 22 * (`/juanmorales` â `link1=timeline`), y no hay forma de distinguirlos mirando la 23 * ruta. Por eso solo se tocan secciones conocidas. La lista sale de dos sitios, 24 * ninguno de ellos una suposición: 25 * · los enlaces que YA llevaban data-ajax en el propio sitio (23 secciones); 26 * · una comprobación contra el endpoint, una por una, mirando que devolviera 27 * su `#json-data` y su `page` (games, reels, jobs, my-events). 28 * Lo que no está en la lista se queda como está: carga completa. 29 * 30 * Y aunque algo saliera mal, el `.fail()` de container.phtml ya cae a una carga 31 * normal desde el 2026-09-09. Lo peor que puede pasar es lo de antes. 32 * 33 * SOBRE `reels`, y la lección vale más que el caso. Se sacó de esta lista el 34 * 2026-09-09 porque por Ajax se pintaba el reel pero no se pasaba al siguiente, y 35 * porque su página suelta parecÃa no tener `#contnet`. Las dos observaciones eran 36 * CIERTAS y la conclusión FALSA: las tomé mientras el sitio devolvÃa páginas rotas 37 * por el `count(null)` de `loggedin-header.phtml`. Arreglado aquello, reels carga 38 * por Ajax, el plugin de gestos aparece y el swipe pasa de /reels/284 a 39 * /reels/79115. Devuelto a la lista. 40 * 41 * La regla que queda NO es «reels no se puede»: es que una medida tomada mientras 42 * algo está roto mide lo roto, no lo que uno cree estar midiendo. 43 */ 44(function () { 45 'use strict'; 46 47 // Secciones que se abren por Ajax. Clave = primer segmento de la ruta. 48 var SECCIONES = { 49 '': 'home', 50 'advertise': 'advertise', 'albums': 'albums', 'blogs': 'blogs', 51 'boosted-pages': 'boosted-pages', 'contact-us': 'contact-us', 52 'events': 'events', 'forum': 'forum', 'games': 'games', 'go-pro': 'go-pro', 53 'groups': 'groups', 'jobs': 'jobs', 'liked-pages': 'liked-pages', 54 'my-blogs': 'my-blogs', 'my-events': 'my-events', 'my-products': 'my-products', 55 'pages': 'pages', 'poke': 'poke', 'products': 'products', 'reels': 'reels', 56 'saved-posts': 'saved-posts', 'search': 'search', 'wallet': 'wallet' 57 }; 58 59 // Páginas de DOS segmentos: /read-blog/68013_titulo.html y /post/65340_algo.html. 60 // El identificador es el número con el que empieza el último trozo, y el 61 // endpoint lo acepta tanto suelto como con el slug detrás; se manda solo el 62 // número, que es lo canónico. Comprobado el 2026-09-09: `read-blog` devuelve 63 // page=read-blog y `post` devuelve page=story, ambas con su #json-data, y sus 64 // páginas sueltas viven dentro de #contnet (la condición para poder ajaxificar). 65 var CON_IDENTIFICADOR = { 'read-blog': 1, 'post': 1 }; 66 67 // Fuera a propósito: `checkout` y los `create-*` son formularios, y un 68 // formulario dentro de un contenedor que se reemplaza se comporta de forma 69 // rara. `logout`, `switch-account` y `admin-cp` son acciones o aplicaciones 70 // aparte: tienen que cargar de verdad. 71 var PROHIBIDAS = /^(logout|switch-account|admin-cp|admin|checkout|create-|new-|delete)/; 72 73 function esNavegable(a, e) { 74 if (!a || a.hasAttribute('data-ajax')) return null; 75 // Abrir en otra pestaña, descargar, o clic que no es el principal: se 76 // respeta el comportamiento del navegador. Poner data-ajax aquà serÃa 77 // robarle al visitante el ctrl+clic, porque el manejador hace preventDefault. 78 if (e.button !== 0 || e.metaKey || e.ctrlKey || e.shiftKey || e.altKey) return null; 79 if (a.hasAttribute('download') || (a.getAttribute('target') || '')
79=== '_blank') return null; 80 81 var href = a.getAttribute('href') || ''; 82 if (!href || href.charAt(0) === '#' || /^(javascript|mailto|tel):/i.test(href)) return null; 83 84 var u; 85 try { u = new URL(a.href, location.href); } catch (err) { return null; } 86 if (u.origin !== location.origin) return null; 87 88 // `?lang=` cambia el idioma de TODO el sitio y necesita recarga de verdad: 89 // ese se deja pasar entero, pase lo que pase. 90 if (/(^|[?&])lang=/.test(u.search)) return null; 91 92 var partes = u.pathname.replace(/^\/+|\/+$/g, '').split('/'); 93 var seg = partes[0]; 94 if (PROHIBIDAS.test(seg)) return null; 95 96 if (partes.length === 2) { 97 if (!Object.prototype.hasOwnProperty.call(CON_IDENTIFICADOR, seg)) return null; 98 var id = (partes[1].match(/^\d+/) || [])[0]; 99 if (!id) return null; 100 return '?link1=' + seg + '&id=' + id; 101 } 102 if (partes.length !== 1) return null; // tres o más: no se toca 103 if (!Object.prototype.hasOwnProperty.call(SECCIONES, seg)) return null; 104 105 // Los parámetros se arrastran tal cual: «Explorar» del menú a
105punta a 106 // /search?query= y sin esto era el ÃNICO enlace de menú que seguÃa haciendo 107 // carga completa (Yvenel, 2026-09-09). Comprobado que el endpoint los acepta: 108 // `?link1=search&query=` devuelve page=search con sus 102 KB. 109 if (u.search) return '?link1=' + SECCIONES[seg] + '&' + u.search.slice(1); 110 111 // Inicio tiene atajo propio en container.phtml, y lo reconoce por esta 112 // cadena EXACTA: con «?link1=home» se traerÃa los 359 KB de la página. 113 return seg === '' ? '?index.php?link1=home' : '?link1=' + SECCIONES[seg]; 114 } 115 116 document.addEventListener('click', function (e) { 117 // Solo donde existe la navegación Ajax de WoWonder (o sea, con sesión). 118 if (typeof window.Wo_StartBar !== 'function' || !document.getElementById('contnet')) return; 119 var a = e.target && e.target.closest ? e.target.closest('a[href]') : null; 120 var valor = esNavegable(a, e); 121 if (valor) a.setAttribute('data-ajax', valor); 122 // No se hace nada más: el manejador de WoWonder recoge el clic al burbujear 123 // y ya se encuentra el atributo puesto. 124 }, true); // <- captura: esto corre ANTES que el manejador delegado 125})();
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.