main.js 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305
  1. // 載入共用 template
  2. $('#navbar').load('../../template/navbar.html');
  3. $('#footer').load('../../template/footer.html');
  4. $('#btn-box').load('../../template/button.html');
  5. $('#topCarousel').load('../../template/top_carousel.html');
  6. // $("#columnLoading").hide(); // 隱藏讀取動畫
  7. let assignOrder = ""; // 當前排序
  8. // new, hot, recommend 排序 (預設推薦)
  9. $(".search-btn-filter button").click(function () {
  10. // 切換選取狀態
  11. $('.search-btn-filter').find('.active').removeClass('active');
  12. $(this).addClass('active');
  13. assignOrder = $(this).attr('id');
  14. dataSearch("order_by");
  15. });
  16. let columnType = ""; // 主要類別
  17. let columnSubType = ""; // 次要類別
  18. // 次要類別選單
  19. let subCategory = [
  20. {
  21. title: "編輯精選",
  22. list: ["居家趨勢", "人氣排行", "建築設計", "風格選店", "公益活動", "展演資訊"]
  23. },
  24. {
  25. title: "居家設計",
  26. list: ["小宅規劃", "老屋翻新", "風格營造", "配色佈置", "好宅特輯", "設計提案"]
  27. },
  28. {
  29. title: "裝修前線",
  30. list: ["新聞最前線", "預算分配", "施工流程", "建材知識", "裝潢撇步"]
  31. },
  32. {
  33. title: "生活PLUS",
  34. list: ["居家風水", "家事清潔", "收納技巧", "改造修繕", "退休好幸福"]
  35. },
  36. {
  37. title: "品牌好物",
  38. list: ["家具家飾", "美型家電", "推薦廚衛", "居家好物", "優質建材", "品牌新訊"]
  39. },
  40. {
  41. title: "房市焦點",
  42. list: ["房市新聞", "建案特搜", "買屋賣屋", "房貸稅務", "租房須知"]
  43. }
  44. ];
  45. // 主要篩選按鈕
  46. $('.category-btn .main button').on('click', function () {
  47. let btnText = $(this)[0].innerText;
  48. if (btnText === "所有文章") {
  49. columnType = "";
  50. } else if (btnText === "主題企劃") {
  51. window.open("https://hhh.com.tw/topic/lists/1-page/new-sort/", "_blank"); // 另開頁面
  52. return;
  53. } else {
  54. columnType = btnText;
  55. }
  56. page = 1;
  57. columnSubType = "";
  58. $('.category-btn .main button').removeClass('active');
  59. $(this).toggleClass('active');
  60. $('#dataList').html("");
  61. dataSearch();
  62. let subBtnHtml = [];
  63. subCategory.map(item => {
  64. if (btnText !== "所有文章" && btnText !== "主題企劃") {
  65. if (item.title === btnText) {
  66. $('.category-btn .sub').show();
  67. item.list.forEach(item => {
  68. let dom = `<button onclick="clickSubBtn(event, '${item}')">${item}</button>`;
  69. subBtnHtml.push(dom);
  70. })
  71. $('.category-btn .sub').html(subBtnHtml);
  72. }
  73. } else {
  74. $('.category-btn .sub').hide();
  75. }
  76. })
  77. });
  78. // 次要篩選按鈕
  79. function clickSubBtn(event, val) {
  80. page = 1;
  81. columnSubType = val;
  82. $('.category-btn .sub button').removeClass('active');
  83. $(event.currentTarget).toggleClass('active');
  84. $('#dataList').html("");
  85. dataSearch();
  86. }
  87. let page = 1; // 當前頁數
  88. let pageSize = 18; // 每頁數量
  89. let isFirstLoad = true; // 初始載入
  90. let noData = false; // 無資料
  91. // 列表篩選
  92. async function dataSearch(type = "") {
  93. console.log('type', type);
  94. let url;
  95. if (isFirstLoad) {
  96. $('#dataSpinner').show();
  97. // 第一次載入使用本地 JSON 文件
  98. // url = './json/designers_lists_data.json';
  99. url = `https://m3.hhh.com.tw:18673/column_search?page=${page}&page_size=${pageSize}`;
  100. } else {
  101. // 後續使用 API
  102. url = `https://m3.hhh.com.tw:18673/column_search?page=${page}&page_size=${pageSize}`;
  103. if (assignOrder === "") {
  104. url += "&order_by=new"; // 預設排序為 new
  105. } else {
  106. url += `&order_by=${assignOrder}`;
  107. }
  108. let input = $(".keywords").val();
  109. if (input !== "") {
  110. url += `&keyword=${input}`;
  111. }
  112. if (type === "keyword") {
  113. $('#dataList').html("");
  114. }
  115. // 篩選按鈕
  116. if (columnType !== "") {
  117. url += `&ctype=${columnType}`;
  118. }
  119. if (columnSubType !== "") {
  120. url += `&ctype_sub=${columnSubType}`;
  121. }
  122. }
  123. try {
  124. const response = await axios.get(url);
  125. console.log('response.data.columns', response.data.columns);
  126. let totalCount = response.data.total_count;
  127. $("#totalCount").html(totalCount);
  128. let resultHtml = '';
  129. if (response.data.columns.length) {
  130. if (response.data.columns.length === 18) {
  131. noData = false;
  132. } else {
  133. noData = true;
  134. }
  135. // 取得當前日期並計算三天前的日期
  136. const currentDate = new Date();
  137. const threeDaysAgo = new Date();
  138. threeDaysAgo.setDate(currentDate.getDate() - 3);
  139. response.data.columns.forEach((item, index) => {
  140. // 將 ColumnDate 轉換成日期物件
  141. const columnDate = new Date(item.ColumnDate);
  142. // 判斷 ColumnDate 是否在三天內
  143. const isNew = columnDate >= threeDaysAgo && columnDate <= currentDate;
  144. const newItemClass = isNew ? '' : 'd-none'; // 非三天內則隱藏 New 標籤
  145. let tagList = item.ColumnTag.split(',');
  146. let tagsHtml = '';
  147. tagList.forEach((tag) => {
  148. if (tag !== "") {
  149. tagsHtml += `<span class="tag-item" data-tag="${tag}">${tag}</span>`;
  150. }
  151. });
  152. resultHtml += `
  153. <div class="col-md-4 mb-4 ${index === 1 ? 'mt-4' : ''}" style="${index > 2 && index % 3 !== 1 ? 'margin-top: -2rem;' : ''}">
  154. <a href="${item.ColumnLink}">
  155. <div class="card lists-card h-auto">
  156. <img src="${item.ColumnCoverImg}" class="cover-img" alt="${item.ColumnTitle}">
  157. <div class="card-body d-flex flex-column">
  158. <h5 class="text-dark title">${item.ColumnTitle}</h5>
  159. <div class="tags-container columns-tag mt-3 me-auto">${tagsHtml}</div>
  160. </div>
  161. <span class="new-item ${newItemClass}">NEW</span>
  162. </div>
  163. </a>
  164. </div>`;
  165. });
  166. $('#dataList').append(resultHtml);
  167. } else {
  168. resultHtml += "<p class='text-center mt-5'>找不到符合的資料,請重新搜尋。</p>"
  169. $('#dataList').append(resultHtml);
  170. $("#columnLoading").hide();
  171. noData = true;
  172. }
  173. setTimeout(() => {
  174. // $('#dataList').show();
  175. $('#dataSpinner').hide();
  176. $("#columnLoading").hide();
  177. }, 100)
  178. setTimeout(() => {
  179. isLoading = false;
  180. if (response.data.columns.length === 18) {
  181. $("#columnLoading").show(); // 顯示讀取動畫
  182. } else {
  183. $("#columnLoading").hide(); // 隱藏讀取動畫
  184. }
  185. }, 2000)
  186. // 更新初始載入狀態
  187. if (isFirstLoad) {
  188. isFirstLoad = false;
  189. }
  190. } catch (error) {
  191. console.log("error", error);
  192. }
  193. }
  194. dataSearch();
  195. let isLoading = false;
  196. // 判斷是否捲動到底部
  197. $(window).on('scroll', function () {
  198. // 資料 < 18 筆取消判斷
  199. if (noData) {
  200. return;
  201. }
  202. let scrollTop = $(window).scrollTop(); // 捲軸頂部位置
  203. let windowHeight = $(window).height(); // 視窗高度
  204. let footerOffset = $('#footer').offset().top; // 取得 footer 位置
  205. if (!isLoading && scrollTop + windowHeight >= footerOffset - 150) {
  206. isLoading = true;
  207. // page++;
  208. setTimeout(() => {
  209. page++;
  210. dataSearch();
  211. }, 300)
  212. }
  213. });
  214. // ga 設計師搜尋 (熱搜關鍵字)
  215. $(".search-bar-keyword li a").on("click", (e) => {
  216. dataLayer.push({
  217. 'event': 'Click_Promo_Keyword',
  218. 'promo_keyword': `${e.target.innerText}`,
  219. 'promo_category': 'Designer_Search'
  220. });
  221. });
  222. // 新的搜尋欄位處理
  223. function ga4_keywords() {
  224. let elements = document.querySelectorAll(".me-1");
  225. // 創建一個數組來存儲所有元素的文本內容
  226. let keywords = Array.from(elements).map(element => {
  227. let text = element.innerText;
  228. // 查找 "關鍵字:" 的起始位置
  229. let keywordIndex = text.indexOf("關鍵字:");
  230. if (keywordIndex !== -1) {
  231. // 提取 "關鍵字:" 後面的部分
  232. return text.substring(keywordIndex + "關鍵字:".length).trim();
  233. }
  234. return ""; // 如果沒有找到 "關鍵字:",返回空字符串
  235. });
  236. // 過濾掉空字符串,並將剩餘文本合併為一個字符串
  237. let keyword = keywords.filter(text => text !== "").join(", ");
  238. dataLayer.push({
  239. 'event': 'View_Search_Results',
  240. 'search_term': `${keyword}`,
  241. 'search_category': 'Designer_Search'
  242. });
  243. }
  244. document.getElementById("keywordInput").addEventListener("keydown", function (event) {
  245. if (event.key === "Enter") {
  246. ga4_keywords();
  247. }
  248. });