main.js 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471
  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 page = 1; // 當前頁數
  7. let pageSize = 18; // 每頁數量
  8. let isFirstLoad = true; // 初始載入
  9. // 列表篩選
  10. // async function dataSearch(type = "") {
  11. // let url;
  12. // $('#builderSpinner').show();
  13. // $('#builderList').hide();
  14. // if (isFirstLoad) {
  15. // // 第一次載入使用本地 JSON 文件
  16. // // url = './json/designers_lists_data.json';
  17. // url = `https://m3.hhh.com.tw:18673/builder_search?page=${page}&page_size=${pageSize}`;
  18. // } else {
  19. // // 後續使用 API
  20. // url = `https://m3.hhh.com.tw:18673/builder_search?page=${page}&page_size=${pageSize}`;
  21. // let input = $(".keywords").val();
  22. // if (input !== "") {
  23. // let isExist = filterList.some((item) => item.id === "keyword"); // 判斷是否已存在關鍵字
  24. // const newItem = {
  25. // id: "keyword",
  26. // text: "關鍵字",
  27. // value: input
  28. // };
  29. // if (!isExist) {
  30. // filterList.push(newItem);
  31. // createFilterHtml(newItem);
  32. // } else {
  33. // // 移除原本關鍵字
  34. // $('.budget p.me-1').each(function () {
  35. // if ($(this).text().includes('關鍵字')) {
  36. // $(this).closest('.me-3').remove();
  37. // }
  38. // });
  39. // if (filterList.length === 0) {
  40. // $('#removeResultBtn').hide();
  41. // }
  42. // filterList = filterList.filter(item => item.text !== "關鍵字");
  43. // filterList.push(newItem);
  44. // createFilterHtml(newItem);
  45. // }
  46. // $(".keywords").val("")
  47. // // url += `&keyword=${input}`;
  48. // }
  49. // if (filterList.length) {
  50. // filterList.map(item => {
  51. // url += `&${item.id}=${item.value}`;
  52. // });
  53. // }
  54. // }
  55. // try {
  56. // const response = await axios.get(url);
  57. // console.log('response.data', response.data);
  58. // // console.log('response.data.videos', response.data.videos);
  59. // let totalCount = response.data.total_count;
  60. // let totalPages = Math.ceil(totalCount / pageSize);
  61. // $("#totalCount").html(totalCount);
  62. // if (totalPages) {
  63. // $('.filter-list .pagination').show();
  64. // setPagination(totalPages); // 分頁處理
  65. // } else {
  66. // $('.filter-list .pagination').hide();
  67. // }
  68. // let resultHtml = '';
  69. // if (response.data.videos.length) {
  70. // response.data.videos.forEach((item) => {
  71. // resultHtml += `
  72. // <div class="col-md-4 mb-4">
  73. // <a href="${item.DesignerLink}">
  74. // <div class="card lists-card">
  75. // <div class="position-relative">
  76. // <img src="../../img/icon/play.svg" class="play-img${item.Is_video === '0' ? ' d-none' : ''}" alt="play-img">
  77. // <img src="${item.BuilderCoverImg}" class="cover-img" alt="${item.BuilderTitle}">
  78. // </div>
  79. // <div class="card-body p-4">
  80. // <section>
  81. // <h5 class="text-dark">${item.BuilderTitle}</h5>
  82. // <p class="text-dark my-3">${item.BuilderDescr}</p>
  83. // <h6 class="mb-0 text-muted fw-normal">
  84. // ${item.BuilderAddress}
  85. // </h6>
  86. // </section>
  87. // </div>
  88. // </div>
  89. // </a>
  90. // </div>`;
  91. // });
  92. // } else {
  93. // resultHtml += "<p class='text-center mt-5'>找不到符合的資料,請重新搜尋。</p>"
  94. // }
  95. // $('#builderList').html(resultHtml);
  96. // setTimeout(() => {
  97. // $('#builderList').show();
  98. // $('#builderSpinner').hide();
  99. // }, 100)
  100. // // 更新初始載入狀態
  101. // if (isFirstLoad) {
  102. // isFirstLoad = false;
  103. // }
  104. // } catch (error) {
  105. // console.log("error", error);
  106. // }
  107. // }
  108. // dataSearch();
  109. let isLoading = false;
  110. let haveOtherBuilder = true; // 是否有推薦建案
  111. async function getData() {
  112. // 取得當前網址的查詢字串部分
  113. let urlParams = new URLSearchParams(window.location.search);
  114. // 從查詢字串中取得 'id' 的值
  115. let id = urlParams.get('id');
  116. let url = `https://m3.hhh.com.tw:18674/genbuilder?id=${id}&page=${page}`;
  117. if (haveOtherBuilder) {
  118. $(".spinners").show();
  119. }
  120. try {
  121. const response = await axios.get(url);
  122. let data = response.data[0];
  123. // 判斷是否有取回推薦建案
  124. if (data.other_builder.length) {
  125. haveOtherBuilder = true;
  126. } else {
  127. haveOtherBuilder = false;
  128. }
  129. $("#name").text(data.name);
  130. $("#city").text(data.city);
  131. $("#builder_name").text(data.name);
  132. $("#service_phone").text(data.service_phone);
  133. $("#service_phone").attr("href", "tel:" + data.service_phone);
  134. $("#detail").text(data.detail);
  135. // 封面圖片
  136. const coverImage = data.img.find(image => image.is_cover === 1);
  137. // Header
  138. $('title').text(`${data.name} - 幸福空間`);
  139. $('meta[name="description"]').attr('content', `${data.detail}`);
  140. $('meta[property="og:title"]').attr('content', `${data.name} - 幸福空間`);
  141. $('meta[property="og:image"]').attr('content', `${coverImage.name}`);
  142. $('meta[property="og:description"]').attr('content', `${data.detail}`);
  143. $('meta[name="twitter:title"]').attr('content', `${data.name} - 幸福空間`);
  144. $('meta[name="twitter:description"]').attr('content', `${data.detail}`);
  145. if (data.detail_data.unit_price !== "") {
  146. $("#unit_price span").text(data.detail_data.unit_price);
  147. } else {
  148. $("#unit_price").hide();
  149. }
  150. // 判斷是否有值,若無則隱藏
  151. if (data.detail_data.construction_company !== "") {
  152. $("#construction_company span").text(data.detail_data.construction_company);
  153. } else {
  154. $("#construction_company").hide();
  155. }
  156. if (data.detail_data.builder_type !== "") {
  157. $("#builder_type span").text(data.detail_data.builder_type);
  158. } else {
  159. $("#builder_type").hide();
  160. }
  161. if (data.detail_data.configuration !== "") {
  162. $("#configuration span").text(data.detail_data.configuration);
  163. } else {
  164. $("#configuration").hide();
  165. }
  166. if (data.detail_data.house_type !== "") {
  167. $("#house_type span").text(data.detail_data.house_type);
  168. } else {
  169. $("#house_type").hide();
  170. }
  171. if (data.detail_data.address !== "") {
  172. $("#address a").text(data.detail_data.address);
  173. $("#address a").attr("href", "https://maps.google.com.tw/maps?q=" + data.detail_data.address);
  174. } else {
  175. $("#address").hide();
  176. }
  177. if (data.detail_data.phone !== "") {
  178. $("#phone span").text(data.detail_data.phone);
  179. } else {
  180. $("#phone").hide();
  181. }
  182. if (data.detail_data.website !== "") {
  183. $("#website a").text(data.detail_data.website);
  184. $("#website a").attr("href", data.detail_data.website);
  185. } else {
  186. $("#website").hide();
  187. }
  188. let sliderDom = "";
  189. setTimeout(() => {
  190. isLoading = false;
  191. }, 2000)
  192. // 建案影片
  193. if (data.yt.length) {
  194. // let dom = "";
  195. data.yt.map((item) => {
  196. sliderDom += `
  197. <div class="swiper-slide">
  198. <button class="video-item" data-yt-id="${item.yt_id}">
  199. <img src="${item.imgUrl}" alt="">
  200. <img src="../../img/icon/play.svg" class="play-img" alt="play-img">
  201. </button>
  202. </div>`;
  203. });
  204. $(document).on('click', '.video-item', function () {
  205. const videoId = $(this).data('yt-id'); // 取得 data-yt-id
  206. const videoUrl = `https://www.youtube.com/embed/${videoId}`; // 影片 url
  207. $('#videoFrame').attr('src', videoUrl); // 設置 iframe src
  208. $('#videoModal').modal('show'); // 顯示影片彈跳視窗
  209. });
  210. // 當 modal 關閉時清空 iframe src
  211. $('#videoModal').on('hidden.bs.modal', function () {
  212. $('#videoFrame').attr('src', '');
  213. });
  214. }
  215. // 建案圖片
  216. if (data.img.length) {
  217. data.img.map((item) => {
  218. sliderDom += `
  219. <div class="swiper-slide">
  220. <a href="${item.name}" data-src="${item.name}">
  221. <img src="${item.name}" alt="">
  222. </a>
  223. </div>`;
  224. // sliderDom += `
  225. // <a href="${item.name}" data-src="${item.name}">
  226. // <img src="${item.name}" alt="">
  227. // </a>`;
  228. })
  229. }
  230. $(".slider-list").append(sliderDom);
  231. // 標籤
  232. if (data.tags.length) {
  233. let dom = "";
  234. data.tags.map((item) => {
  235. dom += ` <a href="/builder/lists/${item}-keyword/" target="_blank">${item}</a>`;
  236. })
  237. $(".tag-list").html(dom);
  238. }
  239. // 輪播
  240. // $(".slider-list").slick({
  241. // dots: false,
  242. // infinite: false,
  243. // speed: 500,
  244. // autoplay: true,
  245. // autoplaySpeed: 3000,
  246. // slidesToScroll: 1,
  247. // arrows: true,
  248. // draggable: false, // 禁用鼠標拖曳功能
  249. // prevArrow:
  250. // '<button type="button" class="slick-prev"><i class="fas fa-chevron-left" style="font-size: 36px;color: #D4D4D4;transform: translateY(-10px);"></i></button>',
  251. // nextArrow:
  252. // '<button type="button" class="slick-next"><i class="fas fa-chevron-right" style="font-size: 36px;color: #D4D4D4;transform: translateY(-10px);"></i></button>',
  253. // });
  254. var swiper = new Swiper(".swiper-list", {
  255. navigation: {
  256. nextEl: ".swiper-button-next",
  257. prevEl: ".swiper-button-prev",
  258. },
  259. });
  260. const container = document.querySelector('.slider-list');
  261. window.lightGallery(container, {
  262. selector: 'a', // 對應圖片的 <a> 標籤
  263. plugins: [lgZoom, lgThumbnail],
  264. preload: 4
  265. });
  266. // 雷達圖繪製 Chart.js
  267. let chartRadarDOM;
  268. let chartRadarData;
  269. let chartRadarOptions;
  270. //載入雷達圖
  271. Chart.defaults.global.legend.display = false;
  272. Chart.defaults.global.defaultFontColor = 'rgba(0,0,74, 1)';
  273. chartRadarDOM = document.getElementById("radar-pc");
  274. chartRadarData;
  275. chartRadarOptions =
  276. {
  277. scale:
  278. {
  279. ticks:
  280. {
  281. fontSize: 12,
  282. beginAtZero: true,
  283. maxTicksLimit: 5,
  284. min: 0,
  285. max: 5,
  286. backdropPaddingX: 5,
  287. backdropPaddingY: 5,
  288. },
  289. pointLabels:
  290. {
  291. fontSize: 16,
  292. fontColor: '#AAA',
  293. fontStyle: 'bold',
  294. lineHeight: 'normal',
  295. },
  296. gridLines:
  297. {
  298. color: '#AAA'
  299. },
  300. }
  301. };
  302. let graphData = new Array();
  303. graphData.push(data.traffic_level);
  304. graphData.push(data.life_level);
  305. graphData.push(data.building_level);
  306. graphData.push(data.price_level);
  307. graphData.push(data.space_level);
  308. console.log(graphData);
  309. // CreateData
  310. chartRadarData = {
  311. labels: ['交通', '生活機能', '建材公設', '總價', '空間坪數'],
  312. datasets: [{
  313. label: data.name,
  314. backgroundColor: "rgba(238, 120, 0, 0.7)",
  315. borderColor: "rgba(238, 120, 0, 1)",
  316. pointBackgroundColor: "rgba(238, 120, 0, 1)",
  317. pointBorderWidth: 5,
  318. borderWidth: 1,
  319. layout: {
  320. padding: {
  321. left: 0,
  322. right: 0,
  323. top: 0,
  324. bottom: 0
  325. }
  326. },
  327. data: graphData
  328. }]
  329. };
  330. // Draw
  331. var chartRadar = new Chart(chartRadarDOM, {
  332. type: 'radar',
  333. data: chartRadarData,
  334. options: chartRadarOptions
  335. });
  336. // 推薦建案
  337. if (data.other_builder.length) {
  338. let otherBuilder = "";
  339. // 動態生成卡片內容
  340. data.other_builder.map(item => {
  341. let dom = `
  342. <div class="col-6 col-md-4 mb-3">
  343. <div class="card">
  344. <a href="${item.link}">
  345. <img src="../../img/icon/play.svg" class="play-img${item.is_video === '0' ? ' d-none' : ''}" alt="play-img">
  346. <img src="${item.img}" alt="" class="img-fluid card-img-top">
  347. <div class="card-body">
  348. <h5 class="card-title">${item.title}</h5>
  349. </div>
  350. </a>
  351. </div>
  352. </div>`;
  353. otherBuilder += dom;
  354. });
  355. // 新增內容到現有 Masonry 容器
  356. let newItems = $(otherBuilder);
  357. $(".other-list .container .row").append(newItems);
  358. // 確保圖片載入完成後進行 Masonry 重新排版
  359. newItems.imagesLoaded(function () {
  360. $('.other-list .container .row').masonry('appended', newItems); // 重新排列
  361. $('.other-list .container .row').masonry('layout'); // 重新 layout
  362. });
  363. }
  364. setTimeout(() => {
  365. $(".spinners").hide();
  366. }, 1000)
  367. console.log('getData', data);
  368. } catch (error) {
  369. console.log("error", error);
  370. }
  371. }
  372. getData();
  373. let noData = false; // 無資料
  374. // 判斷是否捲動到底部
  375. $(window).on('scroll', function () {
  376. // 資料 < 18 筆取消判斷
  377. // if (noData) {
  378. // return;
  379. // }
  380. let scrollTop = $(window).scrollTop(); // 捲軸頂部位置
  381. let windowHeight = $(window).height(); // 視窗高度
  382. let footerOffset = $('#footer').offset().top; // 取得 footer 位置
  383. if (!isLoading && scrollTop + windowHeight >= footerOffset - 250) {
  384. isLoading = true;
  385. if (haveOtherBuilder) {
  386. setTimeout(() => {
  387. page++;
  388. getData();
  389. }, 100)
  390. }
  391. }
  392. });
  393. // 閱讀更多
  394. $(".article-read-more").on("click", () => {
  395. $(".article-content").css("height", "100%");
  396. $(".article-read-more").hide();
  397. });