let userAgent;
let isSafari = false;
let browserName;
// pagination variables
let num_per_page = 9;
let n = 0;
let totalPages = {
intro: 0,
video: 0,
columns: 0,
vr360: 0,
company: 0,
};
window.onload = function () {
// hhh_user_api();
if (screen.width < 991) {
window.location.href = `https://m.hhh.com.tw/`;
}
userAgent = navigator.userAgent;
detectBrowser(userAgent);
// detectDirection();
// let result;
// $.ajax({
// method: "GET",
// url: "./hhh_index/json/realtime.json",
// dataType: "json",
// }).done(function (msg) {
// result = [...msg];
// console.log('result', result);
// renderTopCarousel(result);
// // renderBanner(result);
// });
// $('#navbar').load('https://hhh.com.tw/hhh-test/template/navbar.html');
// $('#footer').load('https://hhh.com.tw/hhh-test/template/footer.html');
// $('#btn-box').load('https://hhh.com.tw/hhh-test/template/button.html');
// $('#topCarousel').load('https://hhh.com.tw/hhh-test/template/top_carousel.html');
};
function hhh_user_api_login() {
window.location.href = `https://hhh.com.tw/users`;
}
let user_data = [];
function hhh_user_api() {
$.ajax({
method: "post",
url: "https://hhh.com.tw/adapter/index?http_method=GET&api_url=/base/v1/member/index",
// async: false,
dataType: "json",
}).done(function (msg) {
user_data = msg;
let app_user = "";
console.log('hhh_user_msg', msg);
if (msg.status == "Success") {
app_user += `
`;
} else {
app_user += `
登入
`;
}
$("#app_user").html(app_user);
}).fail(function (err) {
console.log('err', err);
});
}
hhh_user_api();
// function detectDirection() {
// let height = (window.screen.width * 5) / 12;
// $(".sec-02 .slide-item").css("height", `${height}px`);
// }
function detectBrowser(agent) {
if (userAgent.match(/chrome|chromium|crios/i)) {
browserName = "chrome";
} else if (userAgent.match(/firefox|fxios/i)) {
browserName = "firefox";
} else if (userAgent.match(/safari/i)) {
browserName = "safari";
} else if (userAgent.match(/opr\//i)) {
browserName = "opera";
} else if (userAgent.match(/edg/i)) {
browserName = "edge";
} else {
browserName = "No browser detection";
}
if (browserName === "safari") {
isSafari = true;
}
}
// 範圍內取隨機整數(0-8)
function getRandomInt(max) {
return Math.floor(Math.random() * max);
}
function renderBanner(data) {
let temp = data[1]["data"];
// renderBullet(temp);
// renderBannerStr("banner-slider", temp);
let str = "";
let img = "";
if (window.innerWidth < 767) {
// 手機版
img = "imgUrl";
} else {
// 電腦版
img = "Dwebp";
}
let adNamesMain = [];
for (let i = 0; i < temp.length; i++) {
let adNameMain = `${temp[i]["id"]}${temp[i]["alt"]}`;
adNamesMain.push(adNameMain);
str += `
${temp[i].index_char_1}
${temp[i].index_char_2_1}
${temp[i].index_char_2_2}
${temp[i].index_char_2_3}
`;
}
$(`.banner-slider`).html(str);
//ga4-banners
adNamesMain.forEach((adNameMain) => {
document.querySelectorAll(`a[data-ga4="${adNameMain}"]`).forEach((element) => {
element.addEventListener('click', function () {
dataLayer.push({
'event': 'Banner_Click',
'ad_name': adNameMain,
'ad_location': '首頁大Banner'
});
});
});
});
let randomInt = getRandomInt(8);
let list_Top_Banner;
let ad_first;
//首頁大Banner ga4(一開始近來先送)剩下輪播送
list_Top_Banner = document.querySelectorAll('.banner-slider .slide-item');
//console.log('list_TOP:',list_Top_Banner[randomInt].getAttribute('data_id'))
try {
ad_first = list_Top_Banner[randomInt].getAttribute('data_id');
} catch (e) {
ad_first = '加載問題,所以請無視';
console.log(ad_first);
}
dataLayer.push({
'event': 'Banner_Impression',
'ad_name': ad_first,
'ad_location': '首頁大Banner'
});
// 輪播設定
$('.banner-slider').slick({
dots: true,
infinite: true,
speed: 300,
arrows: true,
autoplay: true,
autoplaySpeed: 4000,
slidesToShow: 1,
slidesToScroll: 1,
centerMode: true,
variableWidth: true,
initialSlide: randomInt, // 起始順序
prevArrow:
'',
nextArrow:
'',
responsive: [
{
breakpoint: 575,
settings: {
dots: false,
arrows: false,
}
}
]
});
// 初始輪播外層新增 className
try {
list_Top_Banner[randomInt].parentNode.classList.add("slick-now");
} catch (e) {
console.log(e);
}
// On before slide change
$('.banner-slider').on('beforeChange', function (event, { slideCount: count }, currentSlide, nextSlide) {
let selectors = [nextSlide, nextSlide - count, nextSlide + count].map(n => `[data-slick-index="${n}"]`).join(', ');
$('.slick-now').removeClass('slick-now');
$(selectors).addClass('slick-now');
});
$('[data-slick-index="0"]').addClass('slick-now');
}
function renderBannerStr(sec, data) {
let adNamesTop = [];
let str = "";
for (let i = 0; i < data.length; i++) {
let adNameTop = `${data[i]["id"]}${data[i]["alt"]}`;
adNamesTop.push(adNameTop);
if (data[i]["Dwebp"]) {
str += `
`;
} else {
str += `
`;
}
}
$(`.${sec}`).html(str);
//ga4-banners
adNamesTop.forEach((adNameTop) => {
document.querySelectorAll(`a[data-ga4="${adNameTop}"]`).forEach((element) => {
element.addEventListener('click', function () {
dataLayer.push({
'event': 'Banner_Click',
'ad_name': adNameTop,
'ad_location': '新刊頭'
});
});
});
});
}
$(window)
.scroll(function () {
if ($(this).scrollTop() > 800) {
$(".fixed-btn").fadeIn(222);
} else {
$(".fixed-btn").stop().fadeOut(222);
}
})
.scroll();
$("#top-btn").click(function () {
$("html, body").animate(
{
scrollTop: 0,
},
500
);
});
$(".slider-close-btn").click(function () {
$(this).css("display", "none");
sticky = 0;
});
document.addEventListener("lazybeforeunveil", function (e) {
var bg = e.target.getAttribute("data-bg");
if (bg) {
e.target.style.backgroundImage = "url(" + bg + ")";
}
});
function addToFavorite(cid) {
if (user_data.data["uid"] == undefined) {
Swal.fire({
title: "請先登入",
showConfirmButton: false,
});
$.ajax({
url: "https://hhh.com.tw/hhhajax/save_http_referer",
type: "post",
datatype: "json",
data: { http_referer: location.href },
success: function () {
location.href = "/login/index";
},
});
}
$.ajax({
url: `https://hhh.com.tw/favorite/set?type=column&id=${cid}`,
}).done(function (data) {
if (data == 1) {
$(".like").css("display", "block");
$(".like-o").css("display", "none");
} else {
$(".like").css("display", "none");
$(".like-o").css("display", "block");
}
});
}
function putEmail() {
const emailPattern =
/^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
if ($("#email").val() !== null && emailPattern.test($("#email").val())) {
$("#error").hide();
$("#putEmail_hidden").css("display", "block");
$("#add_email").text($("#email").val());
$("#email").val("");
} else {
$("#error").show();
$("#error").text("email 格式有誤");
}
}
$(".fm-close").click(() => {
$("#putEmail_hidden").css("display", "none");
$("#add_email").text("");
});
$("#putEmail").click(function (event) {
$("#putEmail_hidden").show();
const vm = $("#email").val();
const emailPattern =
/^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
if (vm.length == 0) {
$("#error").show();
$("#error").text("請輸入Email");
$("#email").addClass("border-revise");
$("#button-fm").addClass("fm-btn-border");
$("#email").focus();
return false;
} else if (!emailPattern.test(vm)) {
$("#error").show();
$("#error").text("email 格式有誤");
$("#email").addClass("border-revise");
$("#button-fm").addClass("fm-btn-border");
$("#email").focus();
return false;
// } else if (vm.length >= 5) {
// $('#error').show();
// $('#error').text('最多一次轉寄 5 封');
// $('#email').addClass('border-revise');
// $('#button-fm').addClass('fm-btn-border');
//
// $('#email').focus();
// return false;
} else {
$("#email").removeClass("border-revise");
$("#button-fm").removeClass("fm-btn-border");
$("#error").hide();
$("#add_email").text($("#email").val());
$("#email").val("");
}
});
$("#doSend").click(function (event) {
stop = 0;
var emailPattern =
/^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
let this_url = window.location.href;
// 如果 uid 為空代表沒登入(由於此寄信功能需要 uid 故需要先登入)
if (user_data.data["uid"] == undefined) {
$("#error").text("請先登錄/註冊會員帳號");
stop = 1;
} else if ($("#email").val() == "") {
$("#error").text("收件人不得為空");
stop = 1;
} else {
if (!emailPattern.test($("#email").val())) {
$("#error").text("請以 email 格式填寫");
stop = 1;
}
}
if (stop == 0) {
$("#error").text();
$.ajax({
url: "https://hhh.com.tw/adapter/index?http_method=POST&api_url=/base/v1/member/forward",
type: "post",
datatype: "json",
data: {
data: JSON.stringify({
uid: user_data.data["uid"],
sender: user_data.data["email"],
recipient: $("#email").val(),
url: this_url,
subject: $("#title").val(),
content: $("#content").val(),
}),
},
success: function (result) {
$("#forward_modal").modal("hide");
Swal.fire({
title: "發送成功",
showConfirmButton: false,
});
$("#emailModal").modal("hide");
},
});
}
});
/* 手機版輪播進度條 */
//ga4-頂部廣告banner參數
let adTop_count = []
let time_top_count = 0
$('.banner-slider').on('beforeChange', function (event, slick, currentSlide, nextSlide) { // 頂部輪播(首頁大Banner)
let list = document.querySelectorAll('.banner-slider .slide-item');
//console.log(list[nextSlide+2].getAttribute('data_id'))
let ad1 = list[nextSlide + 2].getAttribute('data_id');
//由於剛進來就會送首頁大Banner的ga4,所以之後輪播時就不再送出
if (time_top_count == 0) {
let ad2 = list[nextSlide + 1].getAttribute('data_id');
adTop_count.push(ad2);
time_top_count = 1
}
//送dataLayer(要看得到廣告才送(電腦手機板不一樣))
if ($('.banner-slider .slide-item').offset().top - $(window).scrollTop() > -330) {
if (!adTop_count.includes(ad1)) {
dataLayer.push({
'event': 'Banner_Impression',
'ad_name': ad1,
'ad_location': '首頁大Banner'
});
adTop_count.push(ad1);
}
}
// 以下才是輪播
let calc = ((nextSlide) / (slick.slideCount - 1)) * 100;
$('.banner-content .progress')
.css('background-size', calc + '% 100%')
.attr('aria-valuenow', calc);
});
//ga4-中間廣告banner參數
let ad_count = []
$('.sub-banner-slider').on('beforeChange', function (event, slick, currentSlide, nextSlide) { // 廣告區塊
//ga4-送參數(電腦手機不一樣)
let list = document.querySelectorAll('.sub-banner-slider .slide-item');
let max_v = (list.length - 2) / 2
let ad1 = list[currentSlide > 0 ? currentSlide - 1 : max_v - 1].getAttribute('data_id')
let ad2 = list[currentSlide].getAttribute('data_id')
//console.log(currentSlide-1,currentSlide)
//console.log(ad1,ad2)
//廣告位置(電腦手機不一樣)
if ($('.container-fluid.py-4.sub-banner-content').offset().top - $(window).scrollTop() < 800 && $('.container-fluid.py-4.sub-banner-content').offset().top - $(window).scrollTop() > -154) {
//送dataLayer
if (!ad_count.includes(ad1)) {
dataLayer.push({
'event': 'Banner_Impression',
'ad_name': ad1,
'ad_location': '首頁列表'
});
ad_count.push(ad1);
}
if (!ad_count.includes(ad2)) {
dataLayer.push({
'event': 'Banner_Impression',
'ad_name': ad2,
'ad_location': '首頁列表'
});
ad_count.push(ad2);
}
}
// 以下才是輪播
let calc = ((nextSlide) / (slick.slideCount - 1)) * 100;
$('.sub-banner-content .progress')
.css('background-size', calc + '% 100%')
.attr('aria-valuenow', calc);
});
let optionsSliderList = document.querySelectorAll('.options-slider'); // 廣告上方列表
for (let i = 0; i < optionsSliderList.length; i++) {
let count;
let element;
const progressBar = $(`.progress.item-0${i}`);
const progressBarLabel = $('.slider-label');
if (i === 0) {
count = 2;
element = $(`.space-slider.slider-0${i}`);
} else {
window.innerWidth < 415 ? count = 2 : count = 3;
element = $(`.options-slider.slider-0${i}`);
}
element.on('beforeChange', function (event, slick, currentSlide, nextSlide) {
let calc = ((nextSlide) / (slick.slideCount - count)) * 100;
progressBar
.css('background-size', calc + '% 100%')
.attr('aria-valuenow', calc);
progressBarLabel.text(calc + '% completed');
});
}
let mainSliderList = document.querySelectorAll('.main-content .slider'); // 廣告下方列表
let count;
window.innerWidth < 415 ? count = 1 : count = 2;
for (let i = 0; i < mainSliderList.length; i++) {
let element = $(`.main-content .slider.item-0${i}`);
const progressBar = $(`.main-content .progress.item-0${i}`);
const progressBarLabel = $('.main-content .slider-label');
element.on('beforeChange', function (event, slick, currentSlide, nextSlide) {
let calc = ((nextSlide) / (slick.slideCount - count)) * 100;
progressBar
.css('background-size', calc + '% 100%')
.attr('aria-valuenow', calc);
progressBarLabel.text(calc + '% completed');
});
}
/* 2024/02/21關閉 */
// 廣告彈跳視窗 Modal
/*
(function createModal() {
const newDiv = document.createElement("div");
let str = `
`;
newDiv.innerHTML = str;
document.body.appendChild(newDiv);
})();
*/
/* 判斷閒置 */
let defaultNum = 60; // 60 秒
let maxTime = defaultNum;
let intervalId;
let time = maxTime;
$('body').on('keydown mousemove mousedown', function (e) {
maxTime = defaultNum; // Seconds
time = maxTime; // Reset
});
runSetInterval();
function runSetInterval() {
intervalId = setInterval(function () {
time--;
if (time <= 0) {
ShowInvalidLoginMessage();
clearInterval(intervalId);
}
}, 1000)
}
$('#adModal').on('hide.bs.modal', function () {
dialogTimeclose();
runSetInterval();
$('body').addClass('scrollable');
});
function dialogTimeclose() {
time = maxTime;
}
function ShowInvalidLoginMessage() {
$('#adModal').modal('show');
}
/* genjson_new 新版首頁 */
let result;
$.ajax({
method: "get",
url: "./json/data_index.json",
// url: "https://m3.hhh.com.tw:18689/genjson_new?filename=realtime.json",
dataType: "json",
}).done((data) => {
result = [...data];
// 隱藏 loading
$('body').removeClass('unscrollable');
$('.loading-item').addClass('loading-hide');
let ad = localStorage.getItem('ad');
if (!ad) {
localStorage.setItem('ad', true);
$('#adModal').modal('show');
} else {
$('#adModal').modal('hide');
$('body').addClass('scrollable');
}
// renderTopCarousel(result);
renderBanner(result);
renderData(result); // 廣告上方列表
renderEventAd(result); // 廣告輪播
renderTopic(); // 主題企劃
renderDesigner(result); // 推薦設計師
renderTabContent(result); // 最夯設計, 影音實錄, 專欄文章
//ga4_Click
document.querySelectorAll('a[data-ga4="By_Style"]').forEach(function (element) {
element.addEventListener('click', function () {
dataLayer.push({
'event': 'Inner_Click',
'section_name': '依照風格瀏覽設計'
});
});
});
document.querySelectorAll('a[data-ga4="By_Space"]').forEach(function (element) {
element.addEventListener('click', function () {
dataLayer.push({
'event': 'Inner_Click',
'section_name': '依照空間瀏覽設計'
});
});
});
document.querySelectorAll('a[data-ga4="By_Specialty"]').forEach(function (element) {
element.addEventListener('click', function () {
dataLayer.push({
'event': 'Inner_Click',
'section_name': '依照專長尋找專家'
});
});
});
document.querySelectorAll('a[data-ga4="By_Topic"]').forEach(function (element) {
element.addEventListener('click', function () {
dataLayer.push({
'event': 'Inner_Click',
'section_name': '主題企劃'
});
});
});
document.querySelectorAll('a[data-ga4="By_Designer"]').forEach(function (element) {
element.addEventListener('click', function () {
dataLayer.push({
'event': 'Inner_Click',
'section_name': '本週推薦設計師'
});
});
});
document.querySelectorAll('a[data-ga4="By_Editor"]').forEach(function (element) {
element.addEventListener('click', function () {
dataLayer.push({
'event': 'Inner_Click',
'section_name': '編輯精選'
});
});
});
document.querySelectorAll('a[data-ga4="Best_Design"]').forEach(function (element) {
element.addEventListener('click', function () {
dataLayer.push({
'event': 'Inner_Click',
'section_name': '最夯設計'
});
});
});
document.querySelectorAll('a[data-ga4="Latest_Video"]').forEach(function (element) {
element.addEventListener('click', function () {
dataLayer.push({
'event': 'Inner_Click',
'section_name': '最新影音實錄'
});
});
});
}).fail((error) => {
console.log('genjson_new error', error);
});
$.ajax({
method: "get",
url: "./json/index-slider.json",
async: false,
dataType: "json",
}).done((data) => {
renderJsonData(data); // 依照空間尋找商品, 依照專長尋找設計師
}).fail((error) => {
console.log('error', error);
});
function renderJsonData(data) {
data.map(e => {
if (e.tab === "依照空間尋找商品") {
let str = "";
let SpaceProducts = [];
for (let i = 0; i < e.data.length; i++) {
let item = e.data[i];
let SpaceProduct = `${item.name}`;
SpaceProducts.push(SpaceProduct);
str += `
`
}
$(".space-slider").html(str);
//ga4-banners
SpaceProducts.forEach((SpaceProduct) => {
document.querySelectorAll(`a[data-ga4="${SpaceProduct}"]`).forEach((element) => {
element.addEventListener('click', function () {
dataLayer.push({
'event': 'ShopBanner_Click',
'product_name': SpaceProduct
});
});
});
});
// 輪播設定
$('.space-slider').slick({
infinite: false,
slidesToShow: 4,
slidesToScroll: 1,
variableWidth: false,
prevArrow:
'',
nextArrow:
'',
responsive: [
{
breakpoint: 991,
settings: {
slidesToShow: 3,
slidesToScroll: 1
}
},
{
breakpoint: 767,
settings: {
slidesToShow: 2,
slidesToScroll: 1,
}
},
{
breakpoint: 575,
settings: {
slidesToShow: 2,
slidesToScroll: 1,
variableWidth: true,
arrows: false,
}
}
]
});
} else {
let str = "";
for (let i = 0; i < e.data.length; i++) {
let item = e.data[i];
str += `
`
}
$(".options-slider.designer").html(str);
}
hideSlickArrow();
})
}
let locationUrl = '';
window.innerWidth > 767 ? locationUrl = "https://hhh.com.tw" : locationUrl = "https://m.hhh.com.tw";
// 首頁廣告上方列表
function renderData(data) {
data.map((e) => {
if (e._comment === "加好物商品") {
renderDom("slider-01", e.data);
} else if (e._comment === "首頁photo頁") {
e.data.map((list, index) => {
renderDom(`slider-0${index + 2}`, list.data);
// $(`.slider-0${index + 1}-title`).text(list.tab);
})
}
})
// 輪播設定
$('.options-slider').slick({
infinite: false,
slidesToShow: 6,
slidesToScroll: 6,
variableWidth: false,
prevArrow:
'',
nextArrow:
'',
responsive: [
{
breakpoint: 1200,
settings: {
slidesToShow: 5,
slidesToScroll: 5,
}
},
{
breakpoint: 991,
settings: {
slidesToShow: 4,
slidesToScroll: 4
}
},
{
breakpoint: 767,
settings: {
slidesToShow: 3,
slidesToScroll: 1,
}
},
{
breakpoint: 575,
settings: {
slidesToShow: 3,
slidesToScroll: 1,
variableWidth: true,
arrows: false,
}
},
{
breakpoint: 415,
settings: {
slidesToShow: 2,
slidesToScroll: 1,
variableWidth: true,
arrows: false,
}
}
]
});
hideSlickArrow();
}
function renderDom(sec, data) {
if (sec !== "slider-01" && sec == "slider-02") {
data = data.sort((a, b) => a.order - b.order);
let str = "";
for (let i = 0; i < data.length; i++) {
str += `
`
}
$(`.${sec}`).html(str);
}
else if (sec !== "slider-01" && sec == "slider-03") {
data = data.sort((a, b) => a.order - b.order);
let str = "";
for (let i = 0; i < data.length; i++) {
str += `
`
}
$(`.${sec}`).html(str);
}
else {
data = data.sort(() => Math.random() - 0.5); // 隨機排序
data = data.slice(0, 12); // 取前 12 筆
let str = "";
ShopProducts = [];
for (let i = 0; i < data.length; i++) {
let ShopProduct = `${data[i]["title"]}`;
ShopProducts.push(ShopProduct);
str += `
`
}
$(`.${sec}`).html(str);
//ga4-banners
ShopProducts.forEach((ShopProduct) => {
document.querySelectorAll(`a[data-ga4="${ShopProduct}"]`).forEach((element) => {
element.addEventListener('click', function () {
dataLayer.push({
'event': 'ShopBanner_Click',
'product_name': ShopProduct
});
});
});
});
}
}
// let timer;
// $(window).resize(function () {
// // 延遲縮放
// window.clearTimeout(timer);
// timer = window.setTimeout(() => {
// renderTopic();
// }, 100);
// })
// 首頁主題企劃
function renderTopic() {
if (result) {
result.map(list => {
if (list._comment === "主題企劃區") {
let webData = [];
let mobileData = [];
list.data.filter(e => {
if (e.tab === "web") {
webData = e.data;
} else {
mobileData = e.data;
}
});
let arr;
let str = "";
// 固定取手機版第一筆
let linkHref = `https://m.hhh.com.tw${mobileData[0].link}`;
window.innerWidth > 767 ? arr = webData : arr = mobileData;
let topicLink = document.querySelector(".topic-content .more-link");
topicLink.setAttribute("href", linkHref);
for (let i = 0; i < arr.length; i++) {
str += `
`;
}
$('.topic-slider').html(str);
// 輪播設定
$('.topic-slider').slick({
infinite: false,
slidesToShow: 4,
slidesToScroll: 4,
variableWidth: false,
prevArrow:
'',
nextArrow:
'',
responsive: [
{
breakpoint: 991,
settings: {
slidesToShow: 2,
slidesToScroll: 2,
}
},
{
breakpoint: 767,
settings: {
slidesToShow: 2,
slidesToScroll: 1,
// variableWidth: true,
// arrows: false,
}
},
{
breakpoint: 575,
settings: {
slidesToShow: 2,
slidesToScroll: 1,
variableWidth: true,
arrows: false,
}
},
{
breakpoint: 415,
settings: {
slidesToShow: 1,
slidesToScroll: 1,
variableWidth: true,
arrows: false,
}
}
]
});
}
});
}
}
// 按鈕 hover
$(function () {
$('.top-card a, .center-card a')
.on('mouseenter', function (e) {
var parentOffset = $(this).offset(),
relX = e.pageX - parentOffset.left,
relY = e.pageY - parentOffset.top;
$(this).find('span').css({ top: relY, left: relX })
})
.on('mouseout', function (e) {
var parentOffset = $(this).offset(),
relX = e.pageX - parentOffset.left,
relY = e.pageY - parentOffset.top;
$(this).find('span').css({ top: relY, left: relX })
});
});
// 首頁廣告輪播
function renderEventAd(data) {
let adNames = [];
data.map(list => {
if (list._comment === "活動頁banners區") {
let str = "";
list.data = list.data.sort(() => Math.random() - 0.5); // 隨機排序
for (let i = 0; i < list.data.length; i++) {
let adName = `${list.data[i]["id"]}${list.data[i]["alt"]}`;
adNames.push(adName);
str += `
`
}
$('.sub-banner-content .sub-banner-slider').html(str);
//ga4-banners
adNames.forEach((adName) => {
document.querySelectorAll(`a[data-ga4="${adName}"]`).forEach((element) => {
element.addEventListener('click', function () {
dataLayer.push({
'event': 'Banner_Click',
'ad_name': adName,
'ad_location': '首頁列表'
});
});
});
});
}
});
// 輪播設定
$('.sub-banner-content .sub-banner-slider').slick({
dots: false,
infinite: true,
speed: 300,
arrows: true,
autoplay: true,
autoplaySpeed: 4000,
slidesToShow: 2,
slidesToScroll: 1,
prevArrow:
'',
nextArrow:
'',
responsive: [
{
breakpoint: 767,
settings: {
slidesToShow: 1,
slidesToScroll: 1,
}
},
{
breakpoint: 575,
settings: {
slidesToShow: 1,
slidesToScroll: 1,
arrows: false
}
}
]
});
}
// 隨機對調前後順序(e.g. 5678 1234)
function randomArr(ary, num = 4) {
// 取得隨機整數
let randomVal;
(Math.random() > 0.5) ? randomVal = 1 : randomVal = 0;
let data = [...ary]; // 深拷貝
let list = [];
// index < 拆分的次數
// 如陣列長度為 8 跟 12,拆分次數即為 2 跟 3
// 例如:[8] => [4,4] or [12] => [4,4,4]
for (let index = 0; index < 1; index++) {
list.push(data.splice(num, num));
// list.push(test.splice(4, 4));
}
list = list.sort(() => Math.random() - 0.5); // 隨機排序
let finalData = [];
if (randomVal) {
finalData = data.concat(list);
} else {
finalData = list.concat(data);
}
return finalData.flat(Infinity) // 展開陣列
}
function renderDesigner(data) {
data.map(list => {
if (list._comment === "推薦設計師") {
let randomData = randomArr(list.data, 6);
let str = "";
for (let i = 0; i < randomData.length; i++) {
const item = randomData[i];
str += `
`;
}
$('.designer-slider').html(str);
// 輪播設定
$('.designer-slider').slick({
infinite: false,
slidesToShow: 6,
slidesToScroll: 6,
variableWidth: false,
prevArrow:
'',
nextArrow:
'',
responsive: [
{
breakpoint: 1200,
settings: {
slidesToShow: 4,
slidesToScroll: 4,
}
},
{
breakpoint: 767,
settings: {
slidesToShow: 3,
slidesToScroll: 3,
}
},
{
breakpoint: 575,
settings: {
slidesToShow: 2,
slidesToScroll: 1,
variableWidth: true,
arrows: false,
}
},
]
});
hideSlickArrow();
$(".designer-content h3").hover(
function () {
$(this).parent().prev().children().children('.img-border').css('opacity', '1');
}, function () {
$(this).parent().prev().children().children('.img-border').css('opacity', '0');
}
);
}
});
}
function renderTabContent(data) {
data.map(list => {
if (list._comment === "tab區塊-最夯設計, 影音實錄, 專欄文章") {
list.data.map(item => {
if (item.tab === "編輯精選") {
let randomData = randomArr(item.data);
let str = "";
let tagList = [];
for (let i = 0; i < randomData.length; i++) {
const item = randomData[i];
str += `
`;
tagList.push(item.ctag);
}
$('.featured-slider').html(str);
// 輪播設定
$('.featured-slider').slick({
infinite: false,
slidesToShow: 4,
slidesToScroll: 4,
variableWidth: false,
prevArrow:
'',
nextArrow:
'',
responsive: [
{
breakpoint: 991,
settings: {
slidesToShow: 2,
slidesToScroll: 2,
}
},
{
breakpoint: 767,
settings: {
slidesToShow: 2,
slidesToScroll: 2,
// variableWidth: true,
// arrows: false,
}
},
{
breakpoint: 575,
settings: {
slidesToShow: 2,
slidesToScroll: 2,
variableWidth: true,
arrows: false,
}
},
{
breakpoint: 415,
settings: {
slidesToShow: 1,
slidesToScroll: 1,
variableWidth: true,
arrows: false,
}
}
]
});
hideSlickArrow(); // 判斷輪播按鈕顯示
randomTag(randomData, tagList, "featured-content"); // 渲染標籤
} else if (item.tab === "最夯設計") {
let randomData = randomArr(item.data);
let str = "";
let tagList = [];
for (let i = 0; i < randomData.length; i++) {
const item = randomData[i];
str += `
`;
tagList.push(item.ctag);
}
$('.popular-slider').html(str);
// 輪播設定
$('.popular-slider').slick({
infinite: false,
slidesToShow: 4,
slidesToScroll: 4,
variableWidth: false,
prevArrow:
'',
nextArrow:
'',
responsive: [
{
breakpoint: 991,
settings: {
slidesToShow: 2,
slidesToScroll: 2,
}
},
{
breakpoint: 767,
settings: {
slidesToShow: 2,
slidesToScroll: 2,
// variableWidth: true,
// arrows: false,
}
},
{
breakpoint: 575,
settings: {
slidesToShow: 2,
slidesToScroll: 2,
variableWidth: true,
arrows: false,
}
},
{
breakpoint: 415,
settings: {
slidesToShow: 1,
slidesToScroll: 1,
variableWidth: true,
arrows: false,
}
},
]
});
hideSlickArrow(); // 判斷輪播按鈕顯示
randomTag(randomData, tagList, "popular-content"); // 渲染標籤
} else if (item.tab === "最新影音實錄") {
let randomData = randomArr(item.data);
let str = "";
for (let i = 0; i < randomData.length; i++) {
const item = randomData[i];
//
//
//
str += `
`;
}
$('.video-slider').html(str);
// 輪播設定
$('.video-slider').slick({
infinite: false,
slidesToShow: 4,
slidesToScroll: 4,
variableWidth: false,
prevArrow:
'',
nextArrow:
'',
responsive: [
{
breakpoint: 991,
settings: {
slidesToShow: 2,
slidesToScroll: 2,
}
},
{
breakpoint: 767,
settings: {
slidesToShow: 2,
slidesToScroll: 2,
}
},
{
breakpoint: 575,
settings: {
slidesToShow: 2,
slidesToScroll: 1,
variableWidth: true,
arrows: false,
}
},
{
breakpoint: 415,
settings: {
slidesToShow: 1,
slidesToScroll: 1,
variableWidth: true,
arrows: false,
}
}
]
});
hideSlickArrow(); // 判斷輪播按鈕顯示
}
})
}
})
// hover 事件
$(".main-content h3").hover(
function () {
$(this).parent().parent().addClass('img-scale');
}, function () {
$(this).parent().parent().removeClass('img-scale');
}
);
$(".main-content .slide-img").hover(
function () {
$(this).parent().parent().find('h3').css('color', '#ee751b');
}, function () {
;
$(this).parent().parent().find('h3').css('color', '#727272');
}
);
}
// 參數需帶入 (隨機排序清單, 標籤陣列, 外層 className)
function randomTag(randomData, tagList, content) {
let tagLink;
if (content === "featured-content") {
// 編輯精選
tagLink = "column";
} else {
// 最夯設計
tagLink = "case";
}
for (let index = 0; index < tagList.length; index++) {
const element = tagList[index];
randomData.map((e, i) => {
if (i === index) {
let list = [];
for (let i = 0; i < element.length; i++) {
const item = element[i];
if (item !== "") {
let tag = `
${item}
`;
list.push(tag);
}
}
$(`.${content} .tag-list-${index}`).html(list);
}
})
}
}
function hideSlickArrow() {
// 隱藏輪播 disabled 按鈕,後續改為點擊判斷
$('.slick-arrow.slick-disabled').css('display', 'none');
$('.slick-arrow').click(function () {
$('.slick-arrow').css('display', 'block');
$('.slick-arrow.slick-disabled').css('display', 'none');
});
}
// 影音實錄 Modal
function videoSet(src, title) {
let url = new URL(src);
let id = url.searchParams.get('v');
$("#video").attr('src', `https://www.youtube-nocookie.com/embed/${id}`);
$("#youtubeModal h2").text(`${title}`);
}
// Back to top
$(window).scroll(function () {
if ($(this).scrollTop()) {
$('.btn-box').fadeIn();
} else {
$('.btn-box').fadeOut();
}
});
// 上方輪播
$.ajax({
method: "get",
url: "./json/data_index.json",
// url: "https://m3.hhh.com.tw:18689/genjson_new?filename=realtime.json",
dataType: "json",
}).done((data) => {
result = [...data];
renderTopCarousel(result);
console.log('result', result);
}).fail((error) => {
console.log('genjson_new error', error);
});
// 渲染頂部輪播
function renderTopCarousel(data) {
let temp = data[0]["data"];
console.log('temp', temp);
renderBullet(temp);
renderBannerStr("slider-content", temp);
let randomInt = getRandomInt(7);
let adTopup_count = []
// 新刊頭 Banner ga4 (一開始進來先送,剩下輪播送)
setTimeout(() => {
let list_Topup_Banner = document.querySelectorAll('.slider-content .slide-item');
let ad_first;
try {
ad_first = list_Topup_Banner[randomInt].getAttribute('data_id');
} catch (e) {
ad_first = '加載問題,請無視';
console.log(ad_first);
}
dataLayer.push({
'event': 'Banner_Impression',
'ad_name': ad_first,
'ad_location': '新刊頭Banner'
});
adTopup_count.push(ad_first)
}, 1000);
$(".slider-content").slick({
dots: false,
infinite: true,
speed: 500,
autoplay: true,
autoplaySpeed: 3000,
slidesToScroll: 1,
arrows: true,
initialSlide: randomInt, // 起始順序
prevArrow:
'',
nextArrow:
'',
});
$(".bullet").removeClass("bullet-active");
$(".bullet")
.eq($(".slick-active").data("slick-index"))
.addClass("bullet-active");
$(".slider-content").on("afterChange", function (event, slick, currentSlide) {
// 輪播
$(".bullet").removeClass("bullet-active");
$(`.bullet.item-${currentSlide}`).addClass("bullet-active");
});
}
function renderBannerStr(sec, data) {
let adNamesTop = [];
let str = "";
for (let i = 0; i < data.length; i++) {
let adNameTop = `${data[i]["id"]}${data[i]["alt"]}`;
adNamesTop.push(adNameTop);
if (data[i]["Dwebp"]) {
str += `
`;
} else {
str += `
`;
}
}
$(`.${sec}`).html(str);
// ga4-banners
adNamesTop.forEach((adNameTop) => {
document.querySelectorAll(`a[data-ga4="${adNameTop}"]`).forEach((element) => {
element.addEventListener('click', function () {
dataLayer.push({
'event': 'Banner_Click',
'ad_name': adNameTop,
'ad_location': '新刊頭'
});
});
});
});
}
function renderBullet(data) {
let str = "";
for (let i = 0; i < data.length; i++) {
str += ``;
}
$(".bullet-list").html(str);
}
// 範圍內取隨機整數 (0-8)
function getRandomInt(max) {
return Math.floor(Math.random() * max);
}
$(".top-carousel .close-btn").click(function () {
$(this).css("display", "none");
$(".top-carousel").addClass("banner-close");
sticky = 0;
});
// 右下按鈕
$(".gotop-btn").click(() => {
$("html, body").animate(
{
scrollTop: 0,
}, 0
);
});
// 右下按鈕滑入顯示
$(".calculator-btn").hover(function () {
$(".calculator-btn").addClass("show");
}, function () {
$(".calculator-btn").removeClass("show");
});
$(".shop-btn").hover(function () {
$(".shop-btn").addClass("show");
}, function () {
$(".shop-btn").removeClass("show");
});
// 判斷按鈕顯示 or 隱藏
$(window).scroll(function () {
if ($(this).scrollTop()) {
$('#btn-box').fadeIn();
} else {
$('#btn-box').fadeOut();
}
});
document.querySelector('button[data-ga="Go_To_Calculator"]').addEventListener('click', function () {
dataLayer.push({
'event': 'Go_To_Calculator',
'btn_location': 'FixedBTN'
});
});
document.querySelector('button[data-ga="Go_To_Shop"]').addEventListener('click', function () {
dataLayer.push({
'event': 'Go_To_Shop',
'btn_location': 'FixedBTN'
});
});
// Footer
$(".follow-list a").on({
mouseenter: function () {
// $(this).find(".media-item.before").hide();
// $(this).find(".media-item.after").show();
$(this).find(".media-item.before").css("opacity", "0");
$(this).find(".media-item.after").css("opacity", "1");
},
mouseleave: function () {
// $(this).find(".media-item.before").show();
// $(this).find(".media-item.after").hide();
$(this).find(".media-item.before").css("opacity", "1");
$(this).find(".media-item.after").css("opacity", "0");
}
});
let formData = {
email: ""
};
// 訂閱
$('.subscriber-btn, .subscriber-mb-btn').on('click', function () {
let parent = $(this).closest('.subscriber-item'); // 對應父元素
parent.find('.spinner-border').addClass('show');
let mail = parent.find('input').val();
console.log("Input value:", mail);
let regex = /^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/i;
let validate = regex.test(mail); // 判斷 mail 格式
if (!validate) {
parent.addClass('input-error');
parent.find('.spinner-border').removeClass('show');
parent.find('button p').text('email 格式錯誤');
} else {
parent.removeClass('input-error');
let formData = { email: mail };
let email = JSON.stringify(formData);
$.ajax({
method: "post",
url: "https://hhh.com.tw/adapter/index?http_method=POST&api_url=/third/v1/edm/subscriber",
contentType: "application/json",
data: email
}).done((data) => {
parent.find('.spinner-border').removeClass('show');
parent.find('button p').text('已完成訂閱!');
}).fail((error) => {
parent.find('.spinner-border').removeClass('show');
parent.find('button p').text('訂閱失敗,請稍後再試');
});
}
});
$('.subscriber-item input').on('focusin', function () {
console.log('focusin');
let parent = $(this).closest('.subscriber-item');
parent.addClass('input-focus');
let buttonText = parent.find('button p').text();
if (buttonText !== "訂閱") {
parent.find('button p').text('訂閱');
parent.removeClass('input-error');
}
}).on('focusout', function () {
$(this).closest('.subscriber-item').removeClass('input-focus');
});