PageSourceSearch

https://www.trygroup.co.jp/base-assets/common/js/add-query-params.js

js trygroup.co.jp collected 2026-10-01 15:55:31 UTC 12,397 bytes, 300 lines download raw bytes

1(function(){
2    function QueryParamHandler(p) {
3        var self = this;  // `this`を`self`に代入して保持
4
5        this.currentPath = window.location.origin + window.location.pathname;
6
7        this.isSendPath = p.validSendPaths.indexOf("*") !== -1
8            ? true
9            : p.validSendPaths.some(function(validSendPaths2) {
10                return self.currentPath === validSendPaths2;
11            });
12
13        this.isApplyLink = p.validApplyLink.length > 0;
14        this.validApplyLink = p.validApplyLink;
15
16        // ▼ applyStoredParamsでクエリパラメータを引き継がないキー
17        this.excludeKeys = Array.isArray(p.excludeKeys) ? p.excludeKeys : [];
18    }
19
20    QueryParamHandler.prototype.init = function () {
21        var self = this;  // `this`を`self`に代入して保持
22        
23        // クエリパラメータをsessionStorageに保存
24        this.saveQueryParamsToStorage();
25
26        // 対象パスの場合のみ、保存したクエリパラメータを現在のURLに反映
27        if (this.isSendPath) {
28            this.applyStoredParams();
29        }
30
31        // 対象リンクが設定されている場合のみ、保存したクエリパラメータをリンクに反映
32        if (this.isApplyLink) {
33            if (document.readyState === 'loading') {
34                document.addEventListener('DOMContentLoaded', function () {
35                    self.applyLinksStoredParams(self.validApplyLink);
36                });
37            } else {
38                this.applyLinksStoredParams(this.validApplyLink);
39            }
40        }
41
42        // クエリパラメータの処理完了をイベントで通知
43        this.notifyLoaded();
44    };
45
46    QueryParamHandler.prototype.notifyLoaded = function () {
47        var event;
48        if (typeof Event === 'function') {
49            event = new Event('queryParamHandlerLoaded');
50        } else {
51            event = document.createEvent('Event');
52            event.initEvent('queryParamHandlerLoaded', true, true);
53        }
54        window.dispatchEvent(event);
55    };
56
57    QueryParamHandler.prototype.getQueryParams = function() {
58        var params = new URLSearchParams(window.location.search);
59        var queryParams = {};
60        params.forEach(function(value, key) {
61            queryParams[key] = value;
62        });
63        return queryParams;
64    };
65
66    /* ---------------------------------------------------
67       ▼ クエリパラメータの保存処理
68    --------------------------------------------------- */
69    QueryParamHandler.prototype.saveQueryParamsToStorage = function() {
70        var params = this.getQueryParams();
71
72        // sessionStorageに保存されているクエリパラメータを取得
73        var storedParams = this.getStoredQueryParams();
74
75        // 現在のクエリパラメータを既存の値にマージ
76        // 同じキーが存在する場合は現在の値で上書きし、新しいキーは追加
77        var mergedParams = Object.assign({}, storedParams, params);
78
79        // マージしたクエリパラメータをsessionStorageに保存
80        sessionStorage.setItem('queryParams', JSON.stringify(mergedParams));
81    };
82
83    QueryParamHandler.prototype.getStoredQueryParams = function() {
84        var storedParams = sessionStorage.getItem('queryParams');
85        return storedParams ? JSON.parse(storedParams) : {};
86    };
87
88    /* ---------------------------------------------------
89       ▼ 保存したクエリパラメータの反映処理
90       現在のURLに保存済みのクエリパラメータを反映する。
91    --------------------------------------------------- */
92    QueryParamHandler.prototype.applyStoredParams = function() {
93        var storedParams = this.getStoredQueryParams();
94        var currentParams = this.getQueryParams();
95
96        // ▼ 除外対象のキーを取り除く
97        var filteredStoredParams = {};
98        for (var key in storedParams) {
99            if (this.excludeKeys.indexOf(key) === -1) {
100                filteredStoredParams[key] = storedParams[key];
101            }
102        }
103
104        // 現在のクエリパラメータと保存済みのクエリパラメータをマージ
105        var mergedParams = Object.assign({}
105, currentParams, filteredStoredParams);
106        var newParams = new URLSearchParams(mergedParams).toString();
107
108        if (newParams) {
109            var currentUrl = new URL(window.location.href);
110            if (currentUrl.search !== "?" + newParams) {
111                currentUrl.search = newParams;
112                window.history.replaceState({}, '', currentUrl.toString());
113            }
114        }
115    };
116
117    /* ---------------------------------------------------
118       ▼ 対象リンクへのクエリパラメータ反映処理
119       対象リンクのhrefに保存済みのクエリパラメータを付与する。
120       除外対象のキーは付与しない。
121    --------------------------------------------------- */
122    QueryParamHandler.prototype.applyLinksStoredParams = function(validApplyLink) {
123        var self = this;
124        var paramKey = 'source_url';
125        var paramValue = window.location.href; // 現在のページのURL
126
127        // sessionStorageに保存されているクエリパラメータを取得
128        var storedParams = this.getStoredQueryParams();
129
130        // ▼ 除外対象のキーを取り除く
131        var filteredStoredParams = {};
132        for (var key in storedParams) {
133            if (this.excludeKeys.indexOf(key) === -1) {
134                filteredStoredParams[key] = storedParams[key];
135            }
136        }
137
138        // ページ内のすべてのリンクを取得
139        var links = document.querySelectorAll('a');
140        for (var i = 0; i < links.length; i++) {
141            this.processLink(links[i], validApplyLink, filteredStoredParams, paramKey, paramValue);
142        }
143
144        // ▼ MutationObserver による動的監視の追加
145        if (!this.observer) {
146            this.observer = new MutationObserver(function(mutations) {
147                mutations.forEach(function(mutation) {
148                    if (mutation.type === 'childList') {
149                        mutation.addedNodes.forEach(function(node) {
150                            if (node.nodeName === 'A') {
151                                self.processLink(node, validApplyLink, filteredStoredParams, paramKey, paramValue);
152                            } else if (node.querySelectorAll) {
153                                var newLinks = node.querySelectorAll('a');
154                                newLinks.forEach(function(link) {
155                                    self.processLink(link, validApplyLink, filteredStoredParams, paramKey, paramValue);
156                                });
157                            }
158                        });
159                    } else if (mutation.type === 'attributes' && mutation.attributeName === 'href') {
160                        self.processLink(mutation.target, validApplyLink, filteredStoredParams, paramKey, paramValue);
161                    }
162                });
163            });
164            this.observer.observe(document.body, {
165                childList: true,
166                subtree: true,
167                attributes: true,
168                attributeFilter: ['href']
169            });
170        }
171    };
172
173    /**
174     * 個別リンクの判定とパラメータ付与
175     */
176    QueryParamHandler.prototype.processLink = function(a, validApplyLink, filteredStoredParams, paramKey, paramValue) {
177        var href = a.getAttribute('href');
178        if (!href || href.indexOf('javascript:') === 0 || href.indexOf('#') === 0) return;
179
180        var result = this.getTargetUrlFromHref(a.href);
181        var targetUrl = result.url;
182        var isAdlpo = result.isAdlpo;
183
184        var matched = false;
185        try {
186            var urlObj = new URL(targetUrl, window.location.origin);
187            for (var j = 0; j < validApplyLink.length; j++) {
188                if (urlObj.href.indexOf(validApplyLink[j]) === 0) {
189                    matched = true;
190                    break;
191                }
192            }
193        } catch (e) {
194            matched = false;
195        }
196
197        if (matched) {
198            var finalUrl = new URL(targetUrl, window.location.origin);
199
200            // ▼ 除外後の保存済みパラメータを付与
201            for (var key in filteredStoredParams) {
202                finalUrl.searchParams.set(key, filteredStoredParams[key]);
203            }
204
205            // 追加の source_url パラメータ
206            finalUrl.searchParams.set(paramKey, paramValue);
207
208            if (isAdlpo) {
209                // adlpo の場合は ul パラメータを差し替える
210                var adlpoUrl = new URL(a.href);
211                var newFinalUrlStr = finalUrl.toString();
212                if (adlpoUrl.searchParams.get('ul') !== newFinalUrlStr) {
213                    adlpoUrl.searchParams.set('ul', newFinalUrlStr);
214                    a.href = adlpoUrl.toString();
215                }
216            } else {
217                var newUrlStr = finalUrl.toString();
218                if (a.href !== newUrlStr) {
219                    a.href = newUrlStr;
220                }
221            }
222        }
223    };
224
225    /**
226     * href から実体となる URL を抽出する
227     * adlpo.com の場合は ul パラメータから抽出
228     */
229    QueryParamHandler.prototype.getTargetUrlFromHref = function(href) {
230        try {
231            var url = new URL(href, window.location.origin);
232            if (url.hostname.indexOf('adlpo.com') !== -1 && url.searchParams.has('ul')) {
233                return {
234                    url: decodeURIComponent(url.searchParams.get('ul')),
235                    isAdlpo: true
236                };
237            }
238        } catch (e) {}
239        return {
240            url: href,
241            isAdlpo: false
242        };
243    };
244
245    /* ---------------------------------------------------
246       ▼ 初期設定とQueryParamHandlerの初期化
247    --------------------------------------------------- */
248    (function(){
249        var params = {
250            // クエリパラメータを引き継ぐ対象ページ
251            validSendPaths : [
252                "https://www.trygroup.co.jp/eiken/request/",
253                "https://www.trygroup.co.jp/study-support/request/",
254                "https://www.trygroup.co.jp/study-support/reserve/",
255                "https://www.trygroup.co.jp/request/english/",
256                "https://www.trygroup.co.jp/request/english/confirm/",
257                "https://www.trygroup.co.jp/request/english/finish/",
258                "https://develop-preview.trygroup.co.jp/eiken/request/",
259                "https://develop-preview.trygroup.co.jp/study-support/request/",
260                "https://develop-preview.trygroup.co.jp/study-support/reserve/",
261                "https://develop-preview.trygroup.co.jp/request/english/",
262                "https://develop-preview.trygroup.co.jp/request/english/confirm/",
263                "https://develop-preview.trygroup.co.jp/request/english/finish/",
264            ],
265            // URLに保存済みのクエリパラメータを付与する対象リンク
266            validApplyLink : [
267                "https://www.trygroup.co.jp/request/",
268                "https://www.trygroup.co.jp/online/request/",
269                "https://develop-preview.trygroup.co.jp/request/",
270                "https://develop-preview.trygroup.co.jp/online/request/",
271            ],
272            // クエリパラメータの引き継ぎから除外するキー
273            excludeKeys : [
274                "request_materials-1",
275                "soudan-1",
276                "price-1",
277                "_kz_embed",
278                "_kz_cse",
279                "_kzs_var_id",
280                "ptengine-event-explore", 
281                "ptengine-url-type", 
282                "target-url", 
283                "pt_sid", 
284                "ptengine_heatmap_token", 
285                "pt_lang", 
286                "pt_slpo", 
287                "pt_extensions", 
288                "ptengine_heatmap_iframe", 
289                "pt-device", 
290                "ptengine_campaign_version_id", 
291                "ptengine_editor_iframe", 
292                "pt_smart_report", 
293            ]
294        };
295
296        window.queryParamHandler = new QueryParamHandler(params);
297        window.queryParamHandler.init();
298
299    })();
300})();

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.