PageSourceSearch

https://joc.or.jp/assets/js/news.js?v=240805

js joc.or.jp collected 2026-10-02 03:23:27 UTC 16,263 bytes, 374 lines download raw bytes

1/* ---------------------------------------------
2 *   定数
3 --------------------------------------------- */
4const timestamp = Math.floor(Date.now() / 1000);
5const url = new URL(window.location.href);
6const searchParams = new URLSearchParams(window.location.search);
7const gameCategoryJsonFileUrl = window.location.origin + '/json/news/' + 'newsgamecategory.json';
8const workspaceJsonUrl = window.location.origin + '/json/' + 'workspacename.json';
9const containerElm = document.getElementById('js-news-ul');
10const pagerContainerElm = document.getElementById('js-pager-div');
11const perPage = 20;
12const heading = document.getElementById('js-news-top-heading');
13const title = document.title;
14
15let titleArr = title.split('|');
16titleArr.splice(1,0,'ニュース');
17
18
19let currentPage;
20
21if (!searchParams.get('page')) {
22    currentPage = 1;
23} else {
24    if (searchParams.get('page') >= 1) {
25        currentPage = searchParams.get('page');
26    } else {
27        currentPage = 1;
28    }
29}
30if (currentPage == 1) {
31    containerElm.classList.add("c-card-list-8--accent");
32}
33
34// OG:URLの変更
35var headData = document.head.children;
36for (var i = 0; i < headData.length; i++) {
37    // OGPの設定
38    var propertyVal = headData[i].getAttribute('property');
39    if (propertyVal !== null) {
40        if (propertyVal.indexOf('og:url') != -1) {
41            headData[i].setAttribute('content', window.location.href);
42            break;
43        }
44    }
45}
46
47let subcategory = searchParams.get('subcategory');
48if (!subcategory) {
49    subcategory = '';
50}
51let ssubcategory = searchParams.get('ssubcategory');
52if (!ssubcategory) {
53    ssubcategory = '';
54}
55let category = '';
56let categoryparams = '';
57let sports = '';
58let gamesports = '';
59let game = '';
60let athlete = '';
61let year = '';
62let pagerJson = 'news-pager-info.json';
63let queryArr = [];
64//過去大会の見出しの対応
65if (searchParams.get('subcategory') || searchParams.get('ssubcategory')) {
66    pagerJson = 'subcategory-ssubcategory-pager-info.json';
67    queryArr.push(subcategory);
68    queryArr.push(ssubcategory);
69    fetch(gameCategoryJsonFileUrl + '?' + timestamp)
70        .then(response => response.json())
71        .then(gameCategoryArr => {
72            gameCategoryArr.forEach((gameCategory, index) => {
73                //カテゴリーがどちらも存在する時
74                if (subcategory && ssubcategory) {
75                    if (
76                        gameCategory['subcategory'] == subcategory &&
77                        gameCategory['ssubcategory'] == ssubcategory
78                    ) {
79                        heading.textContent = gameCategory['game'];
80                        titleArr[0] = gameCategory['game'];
81                        document.title = titleArr.join('|');
82                        document.querySelector('meta[property="og:title"]').setAttribute('content', titleArr.join('|'));
83                        return;
84                    }
85                }
86                //subcategoryのみ
87                if (!ssubcategory) {
88                    if (gameCategory['subcategory'] == subcategory) {
89                        heading.textContent = gameCategory['game'];
90                        titleArr[0] = gameCategory['game'];
91                        document.title = titleArr.join('|');
92                        document.querySelector('meta[property="og:title"]').setAttribute('content', titleArr.join('|'));
93                        return;
94                    }
95                }
96            });
97        })
98        .catch(error => {
99            console.log(error);
100            alert('エラーが発生しました。再読み込みをしてください。');
101        });
102} else if (searchParams.get('category')) {
103    pagerJson = 'news-category-pager-info.json';
104    queryArr.push(searchParams.get('category'));
105    category = searchParams.get('category').split(' ');
106    if (category.length >= 2) {
107        pagerJson = 'news-multiple-category-pager-info.json';
108        queryArr = category;
109    }
110    categoryparams = searchParams.get('category');
111    let categoryHeading = '';
112    category.forEach((val, index) => {
113        if (index == 0) {
114            categoryHeading += val;
115        } else {
116            categoryHeading += '、' + val;
117        }
118        heading.textContent = categoryHeading;
119        titleArr[0] = categoryHeading;
120        document.title = titleArr.join('|');
121        document.querySelector('meta[property="og:title"]').setAttribute('content', titleArr.join('|'));
122    });
123} else if (searchParams.get('sports')) {
124    pagerJson = 'news-sports-pager-info.json';
125    queryArr.push(searchParams.get('sports'));
126    sports = searchParams.get('sports');
127    heading.textContent = sports;
128    titleArr[0] = sports;
129    document.title = titleArr.join('|');
130    document.querySelector('meta[property="og:title"]').setAttribute('content', titleArr.join('|'));
131} else if (searchParams.get('game')) {
132    pagerJson = 'news-game-pager-info.json';
133    queryArr.push(searchParams.get('sports'));
134    game = searchParams.get('game');
135    fetch(workspaceJsonUrl + '?' + timestamp)
136        .then(response => response.json())
137        .then(workspaceArr => {
138            workspaceArr.forEach((workspace, index) => {
139                if (workspace['fullname'] == game) {
140                    heading.textContent = workspace['shortname'];
141                    titleArr[0] = workspace['shortname'];
142                    document.title = titleArr.join('|');
143                    document.querySelector('meta[property="og:title"]').setAttribute('content', titleArr.join('|'));
144                    return;
145                }
146            });
147        })
148        .catch(error => {
149            console.log(error);
150            alert('エラーが発生しました。再読み込みをしてください。');
151        });
152} else if (searchParams.get('athlete')) {
153    pagerJson = 'news-athlete-pager-info.json';
154    queryArr.push(searchParams.get('athlete'));
155    athlete = searchParams.get('athlete');
156    heading.textContent = athlete;
157    titleArr[0] = athlete;
158    document.title = titleArr.join('|');
159    document.querySelector('meta[property="og:title"]').setAttribute('content', titleArr.join('|'));
160} else if (searchParams.get('year')) {
161    pagerJson = 'news-year-pager-info.json';
162    queryArr.push(searchParams.get('year'));
163    year = searchParams.get('year');
164    heading.textContent = year + 'å¹´';
165    titleArr[0] = year + 'å¹´';
166    document.title = titleArr.join('|');
167    document.querySelector('meta[property="og:title"]').setAttribute('content', titleArr.join('|'));
168} else if (!url.pathname.match(/^\/news\/index\.html/) && url.pathname.match(/^\/news\/([\w\d]+)/)) {
169    //パリ2024以降対応
170    str = url.pathname.match(/^\/news\/(\w+)(?:\/index.html)?/);
171    // 絞り込みの判別
172    if (searchParams.get('gamesports')) {
173        queryArr.push(searchParams.get('gamesports'));
174        gamesports = searchParams.get('gamesports');
175        pagerJson = str[1] + '/newsgamesports-pager-info.json';
176    } else {
177    pagerJson = str[1] + '/newsgames-pager-info.json';
178    }
179    fetch(gameCategoryJsonFileUrl + '?' + timestamp)
180        .then(response => response.json())
181        .then(gameCategoryArr => {
182            gameCategoryArr.forEach((gameCategory, index) => {
183                //baseurlチェック
184                if (gameCategory['baseurl'] == str[1]) {
185                    if (searchParams.get('gamesports')) {
186                    titleArr[0] = gameCategory['game'] + '、' + searchParams.get('gamesports');
187                    heading.textContent = gameCategory['game'] + '、' + searchParams.get('gamesports');
188                    } else {
189                    titleArr[0] = gameCategory['game'];
190                    heading.textContent = gameCategory['game'];
191                    }
192                    document.title = titleArr.join('|');
193                    document.querySelector('meta[property="og:title"]').setAttribute('content', titleArr.join('|'));
194                    return;
195                }
196            });
197        })
198        .catch(error => {
199            console.log(error);
200            alert('エラーが発生しました。再読み込みをしてください。');
201        });
202} else {
203document.title = titleArr.join('|');
204document.querySelector('meta[property="og:title"]').setAttribute('content', titleArr.join('|'));
205}
206
207fillter(pagerJson, queryArr);
208
209function fillter(pagerJson, queryArr) {
210    let requestYearArr = [];
211    let displayNewsIdArr = [];
212    let cnt = 0;
213    //何年から何年までのjsonを読み込むか
214    fetch(window.location.origin + '/json/news/' + pagerJson + '?' + timestamp)
215        .then(response => response.json())
216        .then(pagerDataArr => {
217            pagerDataArr.forEach((pagerData, index) => {
218                if (queryArr.length >= 2) {
219                    //カテゴリー2つ以上
220                    if (pagerData['data'][3].includes('OR')) {
221                    for(const query of queryArr){
222                        if (pagerData['data'][3].includes(query)) {
223                            makeNewsPagerIds(pagerData, requestYearArr, displayNewsIdArr);
224                            cnt++;
225                            break;
226                        }
227                    }
228                    } else {
229                        //subcategory、ssubcategory
230                        if (queryArr[0] == pagerData['data'][3] && queryArr[1] == pagerData['data'][4]) {
231                            makeNewsPagerIds(pagerData, requestYearArr, displayNewsIdArr);
232                            cnt++;
233                        }
234                    }
235                } else if (queryArr.length >= 1) {
236                    if (queryArr[0] == pagerData['data'][3]) {
237                        makeNewsPagerIds(pagerData, requestYearArr, displayNewsIdArr);
238                        cnt++;
239                    }
240                } else {
241                    //全て
242                    makeNewsPagerIds(pagerData, requestYearArr, displayNewsIdArr);
243                    cnt++;
244                }
245            })
246            if (displayNewsIdArr.length < 1) {
247                location.href = "/news/index.html?page=1";
248                return;
249            }
250            requestYearArr = Array.from(new Set(requestYearArr));
251            // 何年から何年までのjsonをまとめてリクエスト
252            // Fetchリクエストを送信する関数
253            const fetchData = async (url) => {
254                const response = await fetch(url);
255                if (!response.ok) {
256                    throw new Error(`HTTP error! status: ${response.status}`);
257                }
258                return response.json();
259            };
260            let allNewsArr = [];
261            // 複数のFetchリクエストを並行して実行し、すべてのリクエストが完了するのを待つ
262            Promise.all(requestYearArr.map(url => fetchData(url + '?' + timestamp)))
263                .then(dataArray => {
264                    dataArray.forEach((val, index) => {
265                        //年毎のjsonのデータを全てマージ
266                        allNewsArr = allNewsArr.concat(val);
267                    });
268                    allNewsArr.forEach((val, index) => {
269                        if (displayNewsIdArr.indexOf(val['id']) != -1) {
270                            addNews(val);
271                        };
272                    });
273                })
274                .catch(error => {
275                    console.log(error);
276                    alert('エラーが発生しました。再読み込みをしてください。');
277                });
278            const totalPage = Math.ceil(cnt / perPage);
279            // 旧版とパリ以降とでURL構成を変更
280            let url;
281            if (pagerJson.indexOf('newsgames-pager-info.json') === -1 && pagerJson.indexOf('newsgamesports-pager-info.json') === -1) {
282                url = window.location.origin + '/news/index.html?subcategory=' + subcategory + "&ssubcategory=" + ssubcategory + "&category=" + categoryparams + '&game=' + game + '&sports=' + sports + '&athlete=' + athlete + '&year=' + year + '&page=';
283            } else {
284                path = pagerJson.split("/");
285                url = window.location.origin + '/news/' + path[0] + '/?gamesports=' + gamesports + '&page=';
286            }
287            if (currentPage > 1) {
288                makeElm('a', ["c-pager__link", "c-pager__link--prev"], pagerContainerElm, "", url + Number(currentPage - 1), "", "", "", "", "");
289            }
290            makeElm('span', ["c-pager__txt"], pagerContainerElm, "", "", "", currentPage + "/" + totalPage, "", "", "");
291            if (currentPage != totalPage) {
292                const nextPage = Number(currentPage) + 1;
293                makeElm('a', ["c-pager__link", "c-pager__link--next"], pagerContainerElm, "", url + nextPage, "", "", "", "", "");
294            }
295        })
296        .catch(error => {
297            console.log(error);
298            alert('エラーが発生しました。再読み込みをしてください。');
299        });
300}
301
302function makeNewsPagerIds(pagerData, requestYearArr, displayNewsIdArr) {
303    if (pagerData['data'][2] == currentPage) {
304        requestYearArr.push(window.location.origin + '/json/news/' + pagerData['data'][1] + '/news.json');
305        displayNewsIdArr.push(pagerData['data'][0]);
306    }
307}
308
309function addNews(displayContent) {
310    const ccardlist8__item = makeElm('li', ["c-card-list-8__item"], containerElm, "", "", "", "", "", "", "");
311    let newsUrl;
312    if (displayContent["externalurl"]) {
313        newsUrl = displayContent["externalurl"];
314    } else {
315        newsUrl = window.location.origin + displayContent["permalink"];
316    }
317    let target = "";
318    if (displayContent["istargetblank"] == "1") {
319        target = "_blank";
320    }
321    const ccardlist8__itemlink = makeElm('a', ["c-card-list-8__item-link"], ccardlist8__item, "", newsUrl, "", "", "", "", target);
322    const ccardlist8__img = makeElm('figure', ["c-card-list-8__img", "hover-zoom-img"], ccardlist8__itemlink, "", "", "", "", "", "", "");
323    let thumbnailimageClassArr = [];
324    if (displayContent["newsthumbnailfitcover"] == "1") {
325        thumbnailimageClassArr.push("object-fit-cover");
326    }
327    if (displayContent["thumbnailposition"] == "下寄せ") {
328        thumbnailimageClassArr.push("object-position-bottom");
329    } else if (displayContent["thumbnailposition"] == "上寄せ") {
330        thumbnailimageClassArr.push("object-position-top");
331    }
332    let thumbnailimage = window.location.origin + "/assets/img/common/img_default_h.png";
333    if (displayContent["thumbnailimage"]) {
334        thumbnailimage = displayContent["thumbnailimage"];
335    }
336    makeElm('img', thumbnailimageClassArr, ccardlist8__img, "", "", thumbnailimage, "", displayContent["label"], "async", "");
337    const ccardlist8__txtwrap = makeElm('div', ["c-card-list-8__txt-wrap"], ccardlist8__itemlink, "", "", "", "", "", "", "");
338    makeElm('p', ["c-card-list-8__ttl", "hover-underline-2", "text-line-clamp-3"], ccardlist8__txtwrap, "", "", "", displayContent["label"], "", "", "");
339    const ccardlist8__sup = makeElm('div', ["c-card-list-8__sup"], ccardlist8__txtwrap, "", "", "", "", "", "", "");
340    makeElm('span', ["c-card-list-8__date"], ccardlist8__sup, "", "", "", displayContent["publishedon"], "", "", "");
341    makeElm('span', ["c-card-list-8__category"], ccardlist8__sup, "", "", "", displayContent["category"].join(','), "", "", "");
342}
343
344function makeElm(tag, classAttributeArr, parent, style, href, src, text, alt, decoding, target) {
345    const elm = document.createElement(tag);
346    if (classAttributeArr.length > 0) {
347        for (let i = 0; i < classAttributeArr.length; i++) {
348            elm.classList.add(classAttributeArr[i]);
349        }
350    }
351    if (style != "") {
352        elm.style = style;
353    }
354    if (href != "") {
355        elm.href = href;
356    }
357    if (src != "") {
358        elm.src = src;
359    }
360    if (text != "") {
361        elm.innerHTML = text;
362    }
363    if (alt != "") {
364        elm.alt = alt;
365    }
366    if (decoding != "") {
367        elm.decoding = decoding;
368    }
369    if (target != "") {
370        elm.target = target;
371    }
372    parent.appendChild(elm);
373    return elm;
374}

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.