main.js 9.6 KB

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