PageSourceSearch

https://chateando.net/ch-ajax-nav.js?v=7

js chateando.net collected 2026-09-24 09:00:10 UTC 6,954 bytes, 125 lines download raw bytes

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.