main.js 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  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. let assignOrder = ""; // 當前排序
  7. // new, hot, recommend 排序 (預設推薦)
  8. $(".search-btn-filter button").click(function () {
  9. // 切換選取狀態
  10. $('.search-btn-filter').find('.active').removeClass('active');
  11. $(this).addClass('active');
  12. assignOrder = $(this).attr('id');
  13. dataSearch("order_by");
  14. });
  15. let page = 1; // 當前頁數
  16. let pageSize = 18; // 每頁數量
  17. let isFirstLoad = true; // 初始載入
  18. // 列表篩選
  19. async function dataSearch(type = "") {
  20. let url;
  21. $('#designerSpinner').show();
  22. $('#designerList').hide();
  23. if (isFirstLoad) {
  24. // 第一次載入使用本地 JSON 文件
  25. url = './json/designers_lists_data.json';
  26. } else {
  27. // 後續使用 API (預設排序為 recommend)
  28. url = `https://m3.hhh.com.tw:18673/designer_search?page=${page}&page_size=${pageSize}`;
  29. if (type === "order_by") {
  30. url += `&${type}=${assignOrder}`;
  31. }
  32. if (assignOrder === "") {
  33. url += "&order_by=recommend";
  34. }
  35. let input = $(".keywords").val();
  36. if (input !== "") {
  37. let isExist = filterList.some((item) => item.id === "keyword"); // 判斷是否已存在關鍵字
  38. const newItem = {
  39. id: "keyword",
  40. text: "關鍵字",
  41. value: input
  42. };
  43. if (!isExist) {
  44. filterList.push(newItem);
  45. createFilterHtml(newItem);
  46. } else {
  47. // 移除原本關鍵字
  48. $('.budget p.me-1').each(function () {
  49. if ($(this).text().includes('關鍵字')) {
  50. $(this).closest('.me-3').remove();
  51. }
  52. });
  53. if (filterList.length === 0) {
  54. $('#removeResultBtn').hide();
  55. }
  56. filterList = filterList.filter(item => item.text !== "關鍵字");
  57. filterList.push(newItem);
  58. createFilterHtml(newItem);
  59. }
  60. $(".keywords").val("")
  61. // url += `&keyword=${input}`;
  62. }
  63. if (filterList.length) {
  64. filterList.map(item => {
  65. if (item.id === 'budget') {
  66. switch (item.value) {
  67. case "100萬以下":
  68. url += `&${item.id}=1`;
  69. break;
  70. case "100~200萬":
  71. url += `&${item.id}=2`;
  72. break;
  73. case "200~300萬":
  74. url += `&${item.id}=3`;
  75. break;
  76. case "300~400萬":
  77. url += `&${item.id}=4`;
  78. break;
  79. case "400~500萬":
  80. url += `&${item.id}=5`;
  81. break;
  82. case "500萬以上":
  83. url += `&${item.id}=6`;
  84. break;
  85. default:
  86. break;
  87. }
  88. } else {
  89. url += `&${item.id}=${item.value}`;
  90. }
  91. });
  92. }
  93. }
  94. try {
  95. const response = await axios.get(url);
  96. console.log('response.data.designers', response.data.designers);
  97. let totalCount = response.data.total_count;
  98. let totalPages = Math.ceil(totalCount / pageSize);
  99. $("#totalCount").html(totalCount);
  100. if (totalPages) {
  101. $('.filter-list .pagination').show();
  102. setPagination(totalPages); // 分頁處理
  103. } else {
  104. $('.filter-list .pagination').hide();
  105. }
  106. let resultHtml = '';
  107. if (response.data.designers.length) {
  108. response.data.designers.forEach((item) => {
  109. resultHtml += `
  110. <div class="col-md-4 mb-4">
  111. <a href="${item.DesignerLink}">
  112. <div class="card lists-card">
  113. <img src="${item.CaseCoverImg}" class="cover-img" alt="${item.DesignerName} ${item.DesignerTitle}">
  114. <div class="card-body d-flex align-items-center">
  115. <div class="person-img me-3 me-md-2 me-lg-3" style="background-image: url('${item.DesignerCoverImg}');"></div>
  116. <section>
  117. <h5 class="text-muted mb-2">${item.DesignerTitle}</h5>
  118. <h6 class="mb-0 text-dark">
  119. <span class="font-weight-bold">
  120. ${item.DesignerName}
  121. </span>
  122. 設計師
  123. </h6>
  124. </section>
  125. </div>
  126. </div>
  127. </a>
  128. </div>`;
  129. });
  130. } else {
  131. resultHtml += "<p class='text-center mt-5'>找不到符合的資料,請重新搜尋。</p>"
  132. }
  133. $('#designerList').html(resultHtml);
  134. setTimeout(() => {
  135. $('#designerList').show();
  136. $('#designerSpinner').hide();
  137. }, 100)
  138. // 更新初始載入狀態
  139. if (isFirstLoad) {
  140. isFirstLoad = false;
  141. }
  142. } catch (error) {
  143. console.log("error", error);
  144. }
  145. }
  146. dataSearch();
  147. // ga 設計師搜尋 (熱搜關鍵字)
  148. $(".search-bar-keyword li a").on("click", (e) => {
  149. dataLayer.push({
  150. 'event': 'Click_Promo_Keyword',
  151. 'promo_keyword': `${e.target.innerText}`,
  152. 'promo_category': 'Designer_Search'
  153. });
  154. });
  155. // 新的搜尋欄位處理
  156. function ga4_keywords() {
  157. let elements = document.querySelectorAll(".me-1");
  158. // 創建一個數組來存儲所有元素的文本內容
  159. let keywords = Array.from(elements).map(element => {
  160. let text = element.innerText;
  161. // 查找 "關鍵字:" 的起始位置
  162. let keywordIndex = text.indexOf("關鍵字:");
  163. if (keywordIndex !== -1) {
  164. // 提取 "關鍵字:" 後面的部分
  165. return text.substring(keywordIndex + "關鍵字:".length).trim();
  166. }
  167. return ""; // 如果沒有找到 "關鍵字:",返回空字符串
  168. });
  169. // 過濾掉空字符串,並將剩餘文本合併為一個字符串
  170. let keyword = keywords.filter(text => text !== "").join(", ");
  171. dataLayer.push({
  172. 'event': 'View_Search_Results',
  173. 'search_term': `${keyword}`,
  174. 'search_category': 'Designer_Search'
  175. });
  176. }
  177. document.getElementById("keywordInput").addEventListener("keydown", function (event) {
  178. if (event.key === "Enter") {
  179. ga4_keywords();
  180. }
  181. });