PageSourceSearch

https://www.tour.ne.jp/element/announce/shared/script/announce.shared.uach.js?t=1778563011

js tour.ne.jp collected 2026-09-24 17:49:59 UTC 4,362 bytes, 98 lines download raw bytes

1/**
2 * JavaScript for announce.shared.uach.js
3 * @description いち早く実行されることを前提としているためjquery不使用
4 *
5 * @author [email protected]
6 */
7(function() {
8  'use strict';
9  window.addEventListener('DOMContentLoaded', function() {
10    const infoArea = document.querySelector('.announceList');
11    // お知らせエリアが存在しない場合は処理を終了
12    if (!infoArea) return;
13    const announceList = infoArea.querySelectorAll('[data-uach_announce]');
14    if (
15      announceList.length === 0 || // UACHチェック情報がない場合
16      !navigator.userAgentData || // navigator.userAgentDataが存在しない場合
17      typeof navigator.userAgentData.getHighEntropyValues !== 'function' // 高エントロピーの情報取得が不可な場合
18    ) {
19      // UACHでの判定が不要(情報取得不可)であれば、以降の処理は実行しない
20      return;
21    }
22
23    // UACHチェック
24    (async () => {
25      let highEntropyValues;
26      try {
27        // 高エントロピーの情報取得
28        highEntropyValues = await navigator.userAgentData.getHighEntropyValues(['platformVersion', 'fullVersionList']);
29      } catch (e) {
30        // 高エントロピーの情報取得に失敗した場合は、それ以降処理できないため処理を終了する
31        return;
32      }
33      // チェック処理
34      for (let n = 0; n < announceList.length; n++) {
35        // エレメント毎にUACHチェックの実施
36        const announceUach = JSON.parse(decodeURIComponent(announceList[n].dataset.uach_announce));
37        let isDevice = true;
38        if (typeof announceUach.device !== 'undefined') {
39          const osVersionRegexp = announceUach.device.map(device =>
40            new RegExp(device.version)
41          );
42          // OSバージョンの正規表現チェック
43          isDevice = osVersionRegexp.some((osVersionRegexp) => {
44            return osVersionRegexp.test(highEntropyValues.platformVersion);
45          });
46        }
47
48        let isBrowser = true;
49        if (typeof announceUach.browser !== 'undefined') {
50          // ブラウザの正規表現データがあればチェック
51          const browserRegexp = announceUach.browser.map(browser => ({
52            name: new RegExp(browser.name),
53            version: new RegExp(browser.version)
54          }));
55          // ブラウザ種別/バージョンの正規表現チェック
56          isBrowser = browserRegexp.some((browserRegexp) => {
57            return highEntropyValues.fullVersionList.some((fullVersionList) => {
58              return browserRegexp.name.test(fullVersionList.brand) &&   // ブラウザ名が一致
59                    browserRegexp.version.test(fullVersionList.version) // ブラウザバージョンが一致
60            });
61          });
62        }
63
64        if (isDevice && isBrowser) {
65          // 表示対象なので該当アナウンスを表示
66          announceList[n].style.display = 'block';
67        } else {
68          // 表示対象ではないので該当アナウンスを削除
69          announceList[n].remove();
70        }
71      }
72
73      // お知らせ表示エリアの状態変更
74      if (infoArea) {
75        // RWDを考慮して表示中のお知らせを取得して判定する
76        const visibleAnnounce = Array.from(infoArea.querySelectorAll('.announceItem')).filter(function(el) {
77          return getComputedStyle(el).display !== 'none';
78        });
79        // 表示中のお知らせがあれば何もしない
80        if (visibleAnnounce.length !== 0) return;
81
82        // RWDのSPビュー専用の固定お知らせがあるか確認
83        const rwdSpOnlyItems = infoArea.querySelectorAll('.announceItem.cmn-display-tab');
84        if (rwdSpOnlyItems.length > 0) {
85          // 表示中のお知らせがなく、かつRWDのSPビュー専用の固定お知らせがある場合は
86          // RWDのPCビューのためcmn-display-tabクラスを付与
87          const addClassTarget = infoArea.querySelector('#addClassTarget');
88          if (addClassTarget) {
89            addClassTarget.classList.add('cmn-display-tab');
90          }
91        } else {
92          // 表示するお知らせが存在しないのでお知らせエリアを削除
93          infoArea.remove();
94        }
95      }
96    })();
97  });
98})();

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.