PageSourceSearch

https://www.paypay-sec.co.jp/shared/js/top-news.js?v=260819

js paypay-sec.co.jp collected 2026-10-02 10:50:40 UTC 3,822 bytes, 108 lines download raw bytes

1(function () {
2  "use strict";
3
4  // CMS 由来の値 (TITLE / SPECIAL_KEY) を innerHTML へ埋め込む前に HTML エスケープし、
5  // テキスト/属性コンテキストでの XSS を防ぐ。
6  function escapeHtml(str) {
7    return String(str)
8      .replace(/&/g, "&")
9      .replace(/</g, "&lt;")
10      .replace(/>/g, "&gt;")
11      .replace(/"/g, "&quot;")
12      .replace(/'/g, "&#39;");
13  }
14
15  function fetchData(api, successCallback, errorCallback) {
16    $.ajax({
17      url: api,
18      success: successCallback,
19      error: errorCallback,
20    });
21  }
22
23  document.addEventListener("DOMContentLoaded", function () {
24
25    function renderList(targetElement, data, labelText) {
26      var listHTML = "";
27      var itemCount = data && data.DATAS ? data.DATAS.length : 0;
28
29      if (itemCount === 0) {
30        targetElement.innerHTML = '<li class="newsticker-lists__item">リクエスト処理に時間がかかっておりますので、しばらくしてから再度アクセスをお願い致します。</li>';
31        return;
32      }
33
34      // 最新の5件だけを取得
35      var displayData = data.DATAS.slice(0, 5);
36
37      for (var i = 0; i < displayData.length; i++) {
38        var item = displayData[i];
39        var formattedDate = item.OPEN_FROM.replace(/-/g, "").substr(0, 8);
40        var year = formattedDate.substr(0, 4);
41        var month = formattedDate.substr(4, 2);
42        var day = formattedDate.substr(6, 2);
43        var displayDate = year + "." + month + "." + day;
44        var labelText = item.TYPE === "1" ? "お知らせ" : "ニュースリリース";
45        var url = getTargetUrl(item.SPECIAL_KEY, labelText);
46        var listItemHTML = '<li class="newsticker-lists__item">\n' +
47          '<a href="' + escapeHtml(url) + '">\n' +
48          '<div class="newsticker-ttl">\n' +
49          '<span class="newsticker-date">' + displayDate + '</span>\n' +
50          '<span class="newsticker-category">' + labelText + '</span>\n' +
51          '</div>\n' +
52          '<div class="newsticker-subject">' + escapeHtml(item.TITLE) + '</div>\n' +
53          '</a>\n' +
54          '</li>\n';
55
56        listHTML += listItemHTML;
57      }
58
59      targetElement.innerHTML = listHTML;
60
61      // Slickの初期化
62      initSlickSlider();
63    }
64
65    function displayCombinedList(newsApi, targetElement) {
66      fetchData(newsApi,
67        function (newsData) {
68          // 日付で降順にソート
69          newsData.DATAS.sort(function (a, b) {
70            return b.OPEN_FROM.localeCompare(a.OPEN_FROM);
71          });
72
73          // 結合されたリストを指定の要素に表示
74          renderList(targetElement, newsData);
75        },
76        function () {
77          renderList(targetElement, null, "");
78        }
79      );
80    }
81
82    function initSlickSlider() {
83      $('.newsticker-slide').slick({
84        autoplay: false,
85        infinite: true,
86        arrows: true,
87        dots: false,
88        pauseOnFocus: false,
89        pauseOnHover: false,
90        slidesToShow: 1,
91        prevArrow: ".newsticker-lists__controller-prev",
92        nextArrow: ".newsticker-lists__controller-next",
93        appendDots: ".newsticker-lists__controller"
94      });
95    }
96
97    // newstickerに結合されたリストを表示
98    displayCombinedList("/cms/list?p-len=5", document.querySelector(".newsticker-lists"));
99  });
100
101  function getTargetUrl(specialKey, labelText) {
102    // labelText に基づいて正しいパスを組み込む
103    // 返す URL は必ず "/notice/" か "/news/" で始まる相対パスのため、specialKey に
104    // "javascript:" 等を入れても擬似プロトコル URL にはならない。属性脱出は呼び出し側の escapeHtml で防止。
105    var basePath = labelText === "お知らせ" ? "/notice/" : "/news/";
106    return basePath + specialKey + '.html';
107  }
108})();

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.