PageSourceSearch

https://www.wbolt.com/wp-content/themes/wbolt/js/wb-front-fix.js?ver=4.4.36

js wbolt.com collected 2026-10-02 04:57:08 UTC 23,986 bytes, 696 lines download raw bytes

1/**
2 * Front-end recovery helpers (4.1.7+)
3 * - Strip OSS !o style that 404s (NoSuchKey)
4 * - Rewrite .avifs to .webp (CDN octet-stream / ORB) — do not fetch()
5 * - Mobile tab tap: overflow-x:auto often eats the synthesized click
6 * - Contain unstyled OCW so it cannot cover tabs
7 * - Silence deprecated PerformanceObserver entryTypes
8 * - Map unload → pagehide so bfcache can work
9 */
10(function () {
11  try {
12    if (window.onunload) {
13      window.onunload = null;
14    }
15    var _add = window.addEventListener;
16    window.addEventListener = function (type, fn, opts) {
17      if (type === 'unload') {
18        type = 'pagehide';
19      }
20      return _add.call(this, type, fn, opts);
21    };
22  } catch (e) {}
23
24  if (window.PerformanceObserver && PerformanceObserver.prototype.observe) {
25    var _observe = PerformanceObserver.prototype.observe;
26    PerformanceObserver.prototype.observe = function (opts) {
27      try {
28        return _observe.call(this, opts);
29      } catch (err) {
30        if (opts && opts.entryTypes && opts.entryTypes.length) {
31          var keep = [];
32          for (var i = 0; i < opts.entryTypes.length; i++) {
33            try {
34              var probe = new PerformanceObserver(function () {});
35              probe.observe({ type: opts.entryTypes[i], buffered: true });
36              probe.disconnect();
37              keep.push(opts.entryTypes[i]);
38            } catch (x) {}
39          }
40          if (keep.length) {
41            var next = {};
42            for (var k in opts) {
43              if (Object.prototype.hasOwnProperty.call(opts, k)) next[k] = opts[k];
44            }
45            next.entryTypes = keep;
46            try {
47              return _observe.call(this, next);
48            } catch (x2) {}
49          }
50        }
51      }
52    };
53  }
54
55  function stripBangO(url) {
56    if (!url || typeof url !== 'string') return url;
57    return url.replace(/(\.(?:jpe?g|png))!o(?=([\s"'?#,]|$))/gi, '$1');
58  }
59
60  function rewriteAvifs(url) {
61    if (!url || typeof url !== 'string') return url;
62    if (/wb_bn_learn\.(avifs|webp)\b/i.test(url)) {
63      return '/wp-content/themes/wbolt/images/wb_bn_learn.jpg';
64    }
65    return url;
66  }
67
68  function rewriteImg(img) {
69    if (!img || img.dataset.wbImgFix === '1') return;
70    var src = img.getAttribute('src') || '';
71    var srcset = img.getAttribute('srcset') || '';
72    var next = rewriteAvifs(stripBangO(src));
73    var nextSet = rewriteAvifs(stripBangO(srcset));
74    if (next !== src) img.setAttribute('src', next);
75    if (nextSet !== srcset) img.setAttribute('srcset', nextSet);
76    img.dataset.wbImgFix = '1';
77  }
78
79  function scan(root) {
80    var scope = root && root.querySelectorAll ? root : document;
81    var imgs = scope.querySelectorAll ? scope.querySelectorAll('img, source') : [];
82    for (var i = 0; i < imgs.length; i++) {
83      var node = imgs[i];
84      if (node.tagName === 'SOURCE') {
85        var ss = node.getAttribute('srcset') || '';
86        var ns = rewriteAvifs(stripBangO(ss));
87        if (ns !== ss) node.setAttribute('srcset', ns);
88        if (/\.avifs/i.test(ss) && /\.webp/i.test(ns)) {
89          node.setAttribute('type', 'image/webp');
90        }
91      } else {
92        rewriteImg(node);
93      }
94    }
95    if (scope !== document && scope.tagName === 'IMG') rewriteImg(scope);
96  }
97
98  document.addEventListener(
99    'error',
100    function (e) {
101      var t = e.target;
102      if (!t || (t.tagName !== 'IMG' && t.tagName !== 'SOURCE')) return;
103      var src = t.currentSrc || t.getAttribute('src') || t.getAttribute('srcset') || '';
104      if (/!o(\?|$)/.test(src) && t.dataset.wbImgRetry !== '1') {
105        t.dataset.wbImgRetry = '1';
106        if (t.getAttribute('src')) t.src = stripBangO(src);
107        if (t.getAttribute('srcset')) t.setAttribute('srcset', stripBangO(t.getAttribute('srcset')));
108        return;
109      }
110      if (/\.webp(\?|$)/i.test(src) && t.dataset.wbWebpRetry !== '1') {
111        t.dataset.wbWebpRetry = '1';
112        var png = src.replace(/\.webp(\b)/i, '.png');
113        if (t.getAttribute('src')) t.src = png;
114        if (t.getAttribute('srcset')) t.setAttribute('srcset', (t.getAttribute('srcset') || '').replace(/\.webp(\b)/gi, '.png'));
115      }
116    },
117    true
118  );
119
120  function bootImgs() {
121    scan(document);
122    if (typeof MutationObserver !== 'undefined') {
123      new MutationObserver(function (muts) {
124        muts.forEach(function (m) {
125          m.addedNodes &&
126            m.addedNodes.forEach(function (n) {
127              if (n.nodeType === 1) scan(n);
128            });
129        });
130      }).observe(document.documentElement, { childList: true, subtree: true });
131    }
132  }
133
134  var touch = { x: 0, y: 0, el: null };
135  document.addEventListener(
136    'touchstart',
137    function (e) {
138      var t = e.changedTouches && e.changedTouches[0];
139      if (!t) return;
140      var el = e.target.closest
141        ? e.target.closest('.tab-nav-item, .tab-item, .fl-tab-nav .tab-nav, .index-nav .nav-ele')
142        : null;
143      touch.x = t.clientX;
144      touch.y = t.clientY;
145      touch.el = el;
146    },
147    { passive: true }
148  );
149  document.addEventListener(
150    'touchend',
151    function (e) {
152      if (!touch.el) return;
153      var t = e.changedTouches && e.changedTouches[0];
154      if (!t) return;
155      var dx = Math.abs(t.clientX - touch.x);
156      var dy = Math.abs(t.clientY - touch.y);
157      var el = touch.el;
158      touch.el = null;
159      if (dx > 12 || dy > 12) return;
160      if (e.cancelable) e.preventDefault();
161      el.click();
162    },
163    { passive: false }
164  );
165
166  document.addEventListener(
167    'wheel',
168    function (e) {
169      var t = e.target;
170      if (!t || !t.classList || !t.classList.contains('code-input-area')) return;
171      var box = t.closest ? t.closest('.code-display-area') : null;
172      if (!box || box.scrollHeight <= box.clientHeight) return;
173      box.scrollTop += e.deltaY;
174      if (e.cancelable) e.preventDefault();
175    },
176    { passive: false }
177  );
178
179  function tameOcwCircles(root) {
180    var scope = root && root.querySelectorAll ? root : document;
181    var nodes = scope.querySelectorAll
182      ? scope.querySelectorAll('.ocw-animated-circles, .ocw-circle')
183      : [];
184    for (var i = 0; i < nodes.length; i++) {
185      nodes[i].style.pointerEvents = 'none';
186    }
187    if (scope !== document && scope.classList) {
188      if (
189        scope.classList.contains('ocw-circle') ||
190        scope.classList.contains('ocw-animated-circles')
191      ) {
192        scope.style.pointerEvents = 'none';
193      }
194    }
195    var sels = scope.querySelectorAll
196      ? scope.querySelectorAll('#OCW_Wp select, .ocw-contact-form select')
197      : [];
198    for (var s = 0; s < sels.length; s++) {
199      if (!sels[s].getAttribute('aria-label')) {
200        sels[s].setAttribute('aria-label', '在线客服选项');
201      }
202    }
203    var tools = scope.querySelectorAll ? scope.querySelectorAll('a.ocw-btn-tool') : [];
204    for (var j = 0; j < tools.length; j++) {
205      if (!tools[j].getAttribute('href')) {
206        tools[j].setAttribute('role', 'button');
207        tools[j].setAttribute('href', '#');
208      }
209    }
210  }
211
212  function openSheet(sel) {
213    var el = document.querySelector(sel);
214    if (!el) return;
215    el.classList.add('wb-active');
216    setTimeout(function () {
217      el.classList.add('wb-slide-in');
218    }, 40);
219  }
220  function closeSheet(el) {
221    if (!el) return;
222    el.classList.remove('wb-slide-in', 'wb-active');
223  }
224  function bindActionSheets() {
225    document.addEventListener('click', function (e) {
226      var trigger = e.target.closest('[data-wbats-target]');
227      if (trigger) {
228        var t = trigger.getAttribute('data-wbats-target');
229        if (t) openSheet(t);
230      }
231      var close = e.target.closest('.was-close, .was-mask');
232      if (close) {
233        var sheet = close.closest('.wb-action-sheet');
234        closeSheet(sheet);
235      }
236    });
237  }
238  function isNarrow() {
239    return window.matchMedia && window.matchMedia('(max-width: 800px)').matches;
240  }
241  function mountCommentSheet() {
242    if (!isNarrow()) return;
243    var form = document.querySelector('.wb-comment-form-mount');
244    var dest = document.querySelector('.wb-ats-comment .wb-ats-comment-bd');
245    if (!form || !dest || dest.contains(form)) return;
246    dest.appendChild(form);
247  }
248  function bindCommentReply() {
249    document.addEventListener('click', function (e) {
250      var reply = e.target.closest('.comment-reply-link');
251      if (!reply || !isNarrow() || !document.querySelector('.wb-ats-comment')) return;
252      setTimeout(function () {
253        mountCommentSheet();
254        openSheet('.wb-ats-comment');
255      }, 30);
256    });
257  }
258  function getQuery(name) {
259    var m = window.location.search.match(new RegExp('[?&]' + name + '=([^&]*)'));
260    return m ? decodeURIComponent(m[1]) : '';
261  }
262  function setQuery(url, name, value) {
263    var re = new RegExp(name + '=[^&]*', 'i');
264    if (url.match(re)) return url.replace(re, name + '=' + encodeURIComponent(value));
265    return url + (url.indexOf('?') >= 0 ? '&' : '?') + name + '=' + encodeURIComponent(value);
266  }
267  function overlayOf(root) {
268    var id = root.getAttribute('data-wb-fs');
269    return (id && document.getElementById('wb-fs-overlay-' + id)) || root.querySelector('.wb-fs-overlay');
270  }
271  function selectedOf(group) {
272    return group ? group.querySelector('.wb-fs-row.is-on') : null;
273  }
274  function pickGroup(scope, key) {
275    if (!scope) return null;
276    return (
277      scope.querySelector('.wb-fs-group[data-query="' + key + '"]') ||
278      scope.querySelector('.wb-fs-dd[data-query="' + key + '"]')
279    );
280  }
281  function groupNodes(scope) {
282    if (!scope) return [];
283    return scope.querySelectorAll('.wb-fs-group, .wb-fs-dd');
284  }
285  function isLocalGroup(group) {
286    return !!(group && group.getAttribute('data-local') === '1');
287  }
288  function closeDeskDrops(except) {
289    var panels = document.querySelectorAll('.wb-fs-dd-panel');
290    var btns = document.querySelectorAll('.wb-fs-dd-btn');
291    for (var i = 0; i < panels.length; i++) {
292      if (except && (panels[i] === except || except.contains(panels[i]))) continue;
293      panels[i].setAttribute('hidden', '');
294    }
295    for (var j = 0; j < btns.length; j++) {
296      if (except && except.contains(btns[j])) continue;
297      btns[j].setAttribute('aria-expanded', 'false');
298    }
299  }
300  function updateDeskBtn(dd) {
301    if (!dd) return;
302    var on = selectedOf(dd);
303    var v = dd.querySelector('.wb-fs-dd-v');
304    if (v && on) {
305      v.textContent = ((on.querySelector('.wb-fs-txt') || on).textContent || '').replace(/\s+/g, ' ').trim();
306    }
307  }
308  function applyCodexType(value) {
309    try {
310      sessionStorage.setItem('wb_codex_search_type', value);
311    } catch (e) {}
312    var tab = document.querySelector('#wbtCodexType .nav-item[data-type="' + value + '"]');
313    if (tab) tab.click();
314  }
315  function restoreCodexType() {
316    var t = '';
317    try {
318      t = sessionStorage.getItem('wb_codex_search_type') || '';
319    } catch (e) {}
320    if (!t || !document.querySelector('#wbtCodexType')) return;
321    var tab = document.querySelector('#wbtCodexType .nav-item[data-type="' + t + '"]');
322    if (tab && !tab.classList.contains('active')) tab.click();
323    var dds = document.querySelectorAll('.wb-fs-dd[data-query="type"]');
324    for (var i = 0; i < dds.length; i++) {
325      setRowOn(dds[i], t);
326      updateDeskBtn(dds[i]);
327    }
328    var ovs = document.querySelectorAll('.wb-fs-group[data-query="type"]');
329    for (var j = 0; j < ovs.length; j++) setRowOn(ovs[j], t);
330  }
331  function setRowOn(group, value) {
332    if (!group) return;
333    var rows = group.querySelectorAll('.wb-fs-row');
334    var hit = false;
335    for (var i = 0; i < rows.length; i++) {
336      var on = rows[i].getAttribute('data-value') === String(value);
337      rows[i].classList.toggle('is-on', on);
338      if (on) hit = true;
339    }
340    if (!hit && rows[0]) rows[0].classList.add('is-on');
341  }
342  function syncCopies(root) {
343    var overlay = overlayOf(root);
344    var desk = root.querySelector('.wb-fs-desktop');
345    if (!overlay || !desk) return;
346    var groups = overlay.querySelectorAll('.wb-fs-group');
347    for (var i = 0; i < groups.length; i++) {
348      var key = groups[i].getAttribute('data-query');
349      var on = selectedOf(groups[i]);
350      var target = pickGroup(desk, key);
351      setRowOn(target, on ? on.getAttribute('data-value') : '');
352      updateDeskBtn(target);
353    }
354  }
355  function collectState(root, fromOverlay) {
356    var scope = fromOverlay ? overlayOf(root) : root.querySelector('.wb-fs-desktop') || overlayOf(root) || root;
357    var groups = groupNodes(scope);
358    var out = [];
359    for (var i = 0; i < groups.length; i++) {
360      var g = groups[i];
361      var on = selectedOf(g);
362      out.push({
363        key: g.getAttribute('data-query'),
364        def: g.getAttribute('data-default') || 'all',
365        value: on ? on.getAttribute('data-value') : g.getAttribute('data-default') || 'all',
366        href: on ? on.getAttribute('data-href') || '' : '',
367        label: on ? ((on.querySelector('.wb-fs-txt') || on).textContent || '').replace(/\s+/g, ' ').trim() : '',
368        local: isLocalGroup(g),
369      });
370    }
371    return out;
372  }
373  function renderChips(root) {
374    var box = root.querySelector('.wb-fs-chips');
375    var badge = root.querySelector('.wb-fs-badge');
376    if (!box) return;
377    var state = collectState(root, true);
378    var html = '';
379    var n = 0;
380    for (var i = 0; i < state.length; i++) {
381      if (state[i].value === state[i].def) continue;
382      n++;
383      html +=
384        '<button type="button" class="wb-fs-chip" data-query="' +
385        state[i].key +
386        '" data-reset="' +
387        state[i].def +
388        '"><span>' +
389        state[i].label +
390        '</span><i aria-hidden="true">×</i></button>';
391    }
392    box.innerHTML = html;
393    if (badge) {
394      badge.textContent = String(n);
395      if (n) badge.removeAttribute('hidden');
396      else badge.setAttribute('hidden', '');
397    }
398  }
399  var vvUnbind = null;
400  function applyFilterViewport() {
401    var vv = window.visualViewport;
402    var top = 0;
403    var h = window.innerHeight || document.documentElement.clientHeight || 0;
404    if (vv) {
405      top = Math.max(0, Math.round(vv.offsetTop || 0));
406      if (vv.height) h = Math.max(0, Math.round(vv.height));
407    }
408    document.documentElement.style.setProperty('--wb-vv-top', top + 'px');
409    document.documentElement.style.setProperty('--wb-vv-h', h + 'px');
410  }
411  function bindFilterViewport() {
412    applyFilterViewport();
413    if (vvUnbind) return;
414    var on = function () {
415      applyFilterViewport();
416    };
417    var vv = window.visualViewport;
418    if (vv && vv.addEventListener) {
419      vv.addEventListener('resize', on);
420      vv.addEventListener('scroll', on);
421    }
422    window.addEventListener('resize', on);
423    vvUnbind = function () {
424      if (vv && vv.removeEventListener) {
425        vv.removeEventListener('resize', on);
426        vv.removeEventListener('scroll', on);
427      }
428      window.removeEventListener('resize', on);
429      vvUnbind = null;
430    };
431  }
432  function unbindFilterViewport() {
433    if (vvUnbind) vvUnbind();
434    document.documentElement.style.removeProperty('--wb-vv-top');
435    document.documentElement.style.removeProperty('--wb-vv-h');
436  }
437  function lockFilterScroll() {
438    var y = window.scrollY || document.documentElement.scrollTop || 0;
439    document.body.setAttribute('data-wb-fs-y', String(y));
440    document.documentElement.classList.add('wb-fs-lock');
441    document.body.classList.add('wb-fs-lock');
442    document.body.style.top = '-' + y + 'px';
443  }
444  function unlockFilterScroll() {
445    var y = parseInt(document.body.getAttribute('data-wb-fs-y') || '0', 10) || 0;
446    document.documentElement.classList.remove('wb-fs-lock');
447    document.body.classList.remove('wb-fs-lock');
448    document.body.style.top = '';
449    document.body.removeAttribute('data-wb-fs-y');
450    window.scrollTo(0, y);
451  }
452  function closeFilterSheet(root) {
453    var overlay = overlayOf(root);
454    var openBtn = root.querySelector('.wb-fs-open');
455    if (overlay) {
456      overlay.classList.remove('is-open');
457      overlay.setAttribute('hidden', '');
458    }
459    if (openBtn) {
460      openBtn.classList.remove('is-on');
461      openBtn.setAttribute('aria-expanded', 'false');
462    }
463    unlockFilterScroll();
464    unbindFilterViewport();
465  }
466  function openFilterSheet(root) {
467    var overlay = overlayOf(root);
468    var openBtn = root.querySelector('.wb-fs-open');
469    if (!overlay) return;
470    if (overlay.parentNode !== document.body) {
471      document.body.appendChild(overlay);
472    }
473    bindFilterViewport();
474    lockFilterScroll();
475    overlay.removeAttribute('hidden');
476    overlay.offsetHeight;
477    overlay.classList.add('is-open');
478    if (openBtn) {
479      openBtn.classList.add('is-on');
480      openBtn.setAttribute('aria-expanded', 'true');
481    }
482  }
483  function applyFilterSheet(root, fromOverlay) {
484    var mode = root.getAttribute('data-wb-fs-mode') || 'navigate';
485    var state = collectState(root, fromOverlay);
486    var nav = [];
487    for (var i = 0; i < state.length; i++) {
488      if (state[i].local) {
489        if (state[i].key === 'type') applyCodexType(state[i].value);
490        continue;
491      }
492      nav.push(state[i]);
493    }
494    if (!nav.length) {
495      closeFilterSheet(root);
496      closeDeskDrops();
497      renderChips(root);
498      return;
499    }
500    if (nav.length === 1 && nav[0].href) {
501      if (mode === 'ajax' && typeof window.wbUaLoadCategory === 'function') {
502        window.wbUaLoadCategory(nav[0].href, nav[0].value);
503        closeFilterSheet(root);
504        renderChips(root);
505        return;
506      }
507      window.location.href = nav[0].href;
508      return;
509    }
510    var url = window.location.pathname;
511    for (var j = 0; j < nav.length; j++) {
512      url = setQuery(url, nav[j].key, nav[j].value);
513    }
514    window.location.href = url;
515  }
516  function resetFilterSheet(root) {
517    var scopes = [overlayOf(root), root.querySelector('.wb-fs-desktop')];
518    for (var s = 0; s < scopes.length; s++) {
519      if (!scopes[s]) continue;
520      var groups = groupNodes(scopes[s]);
521      for (var i = 0; i < groups.length; i++) {
522        setRowOn(groups[i], groups[i].getAttribute('data-default') || 'all');
523        updateDeskBtn(groups[i]);
524      }
525    }
526  }
527  function bindOneFilterSheet(root) {
528    if (!root || root.dataset.wbFsBound === '1') return;
529    root.dataset.wbFsBound = '1';
530    root.addEventListener('click', function (e) {
531      if (e.target.closest('.wb-fs-open')) {
532        if (root.querySelector('.wb-fs-overlay.is-open')) closeFilterSheet(root);
533        else openFilterSheet(root);
534        return;
535      }
536      var chip = e.target.closest('.wb-fs-chip');
537      if (chip) {
538        var q = chip.getAttribute('data-query');
539        var def = chip.getAttribute('data-reset') || 'all';
540        var scopes = [overlayOf(root), root.querySelector('.wb-fs-desktop')];
541        for (var s = 0; s < scopes.length; s++) {
542          if (!scopes[s]) continue;
543          var groups = groupNodes(scopes[s]);
544          for (var i = 0; i < groups.length; i++) {
545            if (groups[i].getAttribute('data-query') === q) {
546              setRowOn(groups[i], def);
547              updateDeskBtn(groups[i]);
548            }
549          }
550        }
551        applyFilterSheet(root, true);
552        return;
553      }
554      var ddBtn = e.target.closest('.wb-fs-dd-btn');
555      if (ddBtn) {
556        var dd = ddBtn.closest('.wb-fs-dd');
557        var panel = dd ? dd.querySelector('.wb-fs-dd-panel') : null;
558        var open = ddBtn.getAttribute('aria-expanded') === 'true';
559        closeDeskDrops(open ? null : dd);
560        if (!open && panel) {
561          panel.removeAttribute('hidden');
562          ddBtn.setAttribute('aria-expanded', 'true');
563        }
564        return;
565      }
566      var deskRow = e.target.closest('.wb-fs-desktop .wb-fs-row');
567      if (deskRow) {
568        var dg = deskRow.closest('.wb-fs-dd') || deskRow.closest('.wb-fs-group');
569        if (dg && dg.getAttribute('data-single') !== '0') {
570          setRowOn(dg, deskRow.getAttribute('data-value'));
571        } else {
572          deskRow.classList.toggle('is-on');
573        }
574        updateDeskBtn(dg);
575        var ov = pickGroup(overlayOf(root), dg.getAttribute('data-query'));
576        setRowOn(ov, deskRow.getAttribute('data-value'));
577        closeDeskDrops();
578        applyFilterSheet(root, false);
579      }
580    });
581    var overlay = overlayOf(root);
582    if (!overlay) return;
583    overlay.addEventListener('click', function (e) {
584      if (e.target.closest('.wb-fs-mask') || e.target.closest('.wb-fs-x')) {
585        closeFilterSheet(root);
586        return;
587      }
588      if (e.target.closest('.wb-fs-reset')) {
589        resetFilterSheet(root);
590        return;
591      }
592      if (e.target.closest('.wb-fs-apply')) {
593        applyFilterSheet(root, true);
594        return;
595      }
596      if (e.target.closest('.wb-fs-more')) {
597        var g = e.target.closest('.wb-fs-group');
598        if (g) g.classList.add('is-expanded');
599        return;
600      }
601      var row = e.target.closest('.wb-fs-row');
602      if (row) {
603        var group = row.closest('.wb-fs-group');
604        if (group && group.getAttribute('data-single') !== '0') {
605          setRowOn(group, row.getAttribute('data-value'));
606        } else {
607          row.classList.toggle('is-on');
608        }
609        syncCopies(root);
610      }
611    });
612  }
613  function bindFilterSheets() {
614    var nodes = document.querySelectorAll('[data-wb-fs]');
615    for (var i = 0; i < nodes.length; i++) bindOneFilterSheet(nodes[i]);
616    if (!document.documentElement.dataset.wbFsDocBound) {
617      document.documentElement.dataset.wbFsDocBound = '1';
618      document.addEventListener('click', function (e) {
619        if (!e.target.closest('.wb-fs-dd')) closeDeskDrops();
620      });
621      document.addEventListener('keydown', function (e) {
622        if (e.key !== 'Escape') return;
623        closeDeskDrops();
624        var open = document.querySelector('.wb-fs-overlay.is-open');
625        if (!open) return;
626        var list = document.querySelectorAll('[data-wb-fs]');
627        for (var j = 0; j < list.length; j++) {
628          if (overlayOf(list[j]) === open) {
629            closeFilterSheet(list[j]);
630          }
631        }
632      });
633    }
634    restoreCodexType();
635    bindCodexSearchTabs();
636  }
637  function bindCodexSearchTabs() {
638    var nav = document.querySelector('#wbtCodexType');
639    if (!nav || nav.dataset.wbCodexBound === '1') return;
640    nav.dataset.wbCodexBound = '1';
641    nav.addEventListener('click', function (e) {
642      var item = e.target.closest('.nav-item');
643      if (!item) return;
644      try {
645        sessionStorage.setItem('wb_codex_search_type', item.getAttribute('data-type') || '');
646      } catch (err) {}
647    });
648  }
649  window.wbCloseFilterSheet = function () {
650    var list = document.querySelectorAll('[data-wb-fs]');
651    for (var i = 0; i < list.length; i++) closeFilterSheet(list[i]);
652  };
653
654  function bindMobileNavEarly() {
655    var btn = document.querySelector('#J_btnNavMb');
656    var body = document.body;
657    if (!btn || !body || btn.dataset.wbNavBound === '1') return;
658    btn.dataset.wbNavBound = '1';
659    var st = 0;
660    btn.addEventListener('click', function () {
661      var open = body.classList.contains('display-nav-m');
662      if (!open) {
663        st = document.documentElement.scrollTop || 0;
664      }
665      body.classList.toggle('display-nav-m');
666      if (open) {
667        window.scrollTo(0, st);
668      }
669    });
670  }
671
672  function boot() {
673    bootImgs();
674    tameOcwCircles(document);
675    bindActionSheets();
676    mountCommentSheet();
677    bindCommentReply();
678    bindFilterSheets();
679    bindMobileNavEarly();
680    if (typeof MutationObserver !== 'undefined') {
681      new MutationObserver(function (muts) {
682        muts.forEach(function (m) {
683          m.addedNodes &&
684            m.addedNodes.forEach(function (n) {
685              if (n.nodeType === 1) tameOcwCircles(n);
686            });
687        });
688      }).observe(document.documentElement, { childList: true, subtree: true });
689    }
690  }
691  if (document.readyState === 'loading') {
692    document.addEventListener('DOMContentLoaded', boot);
693  } else {
694    boot();
695  }
696})();

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.