// 第一次播放音乐
var anzhiyu_musicFirst = false;
// 快捷键
var anzhiyu_keyboard = null;
// 音乐播放状态
var anzhiyu_musicPlaying = false;
var $bodyWrap = document.getElementById("body-wrap");
var anzhiyu_intype = false;
var anzhiyu_keyUpEvent_timeoutId = null;
var anzhiyu_keyUpShiftDelayEvent_timeoutId = null;
// 右键菜单对象
var rm = null;
var popupWindowTimer = null;
var adjectives = [
"美丽的",
"英俊的",
"聪明的",
"勇敢的",
"可爱的",
"慷慨的",
"善良的",
"可靠的",
"开朗的",
"成熟的",
"稳重的",
"真诚的",
"幽默的",
"豁达的",
"有趣的",
"活泼的",
"优雅的",
"敏捷的",
"温柔的",
"温暖的",
"敬业的",
"细心的",
"耐心的",
"深沉的",
"朴素的",
"含蓄的",
"率直的",
"开放的",
"务实的",
"坚强的",
"自信的",
"谦虚的",
"文静的",
"深刻的",
"纯真的",
"朝气蓬勃的",
"慎重的",
"大方的",
"顽强的",
"迷人的",
"机智的",
"善解人意的",
"富有想象力的",
"有魅力的",
"独立的",
"好奇的",
"干净的",
"宽容的",
"尊重他人的",
"体贴的",
"守信的",
"有耐性的",
"有责任心的",
"有担当的",
"有远见的",
"有智慧的",
"有眼光的",
"有冒险精神的",
"有爱心的",
"有同情心的",
"喜欢思考的",
"喜欢学习的",
"具有批判性思维的",
"善于表达的",
"善于沟通的",
"善于合作的",
"善于领导的",
"有激情的",
"有幽默感的",
"有思想的",
"有个性的",
"有正义感的",
"有责任感的",
"有创造力的",
"有想象力的",
"有艺术细胞的",
"有团队精神的",
"有协调能力的",
"有决策能力的",
"有组织能力的",
"有学习能力的",
"有执行能力的",
"有分析能力的",
"有逻辑思维的",
"有创新能力的",
"有专业素养的",
"有商业头脑的",
];
var vegetablesAndFruits = [
"萝卜",
"白菜",
"芹菜",
"生菜",
"青椒",
"辣椒",
"茄子",
"豆角",
"黄瓜",
"西红柿",
"洋葱",
"大蒜",
"土豆",
"南瓜",
"豆腐",
"韭菜",
"花菜",
"西兰花",
"蘑菇",
"金针菇",
"苹果",
"香蕉",
"橙子",
"柠檬",
"猕猴桃",
"草莓",
"葡萄",
"桃子",
"杏子",
"李子",
"石榴",
"西瓜",
"哈密瓜",
"蜜瓜",
"樱桃",
"蓝莓",
"柿子",
"橄榄",
"柚子",
"火龙果",
];
// 已随机的歌曲
var selectRandomSong = [];
// 音乐默认声音大小
var musicVolume = 0.8;
// 是否切换了周杰伦音乐列表
var changeMusicListFlag = false;
// 当前默认播放列表
var defaultPlayMusicList = [];
var themeColorMeta, pageHeaderEl, navMusicEl, consoleEl;
document.addEventListener("DOMContentLoaded", function () {
let headerContentWidth, $nav, $rightMenu;
let mobileSidebarOpen = false;
const adjustMenu = init => {
const getAllWidth = ele => {
return Array.from(ele).reduce((width, i) => width + i.offsetWidth, 0);
};
if (init) {
const blogInfoWidth = getAllWidth(document.querySelector("#blog_name > a").children);
const menusWidth = getAllWidth(document.getElementById("menus").children);
headerContentWidth = blogInfoWidth + menusWidth;
$nav = document.getElementById("nav");
}
const hideMenuIndex = window.innerWidth <= 768 || headerContentWidth > $nav.offsetWidth - 120;
$nav.classList.toggle("hide-menu", hideMenuIndex);
};
// 初始化header
const initAdjust = () => {
adjustMenu(true);
$nav.classList.add("show");
};
// sidebar menus
const sidebarFn = {
open: () => {
anzhiyu.sidebarPaddingR();
anzhiyu.animateIn(document.getElementById("menu-mask"), "to_show 0.5s");
document.getElementById("sidebar-menus").classList.add("open");
mobileSidebarOpen = true;
},
close: () => {
const $body = document.body;
$body.style.paddingRight = "";
anzhiyu.animateOut(document.getElementById("menu-mask"), "to_hide 0.5s");
document.getElementById("sidebar-menus").classList.remove("open");
mobileSidebarOpen = false;
},
};
/**
* 首頁top_img底下的箭頭
*/
const scrollDownInIndex = () => {
const handleScrollToDest = () => {
const bbTimeList = document.getElementById("bbTimeList");
if (bbTimeList) {
anzhiyu.scrollToDest(bbTimeList.offsetTop - 62, 300);
} else {
anzhiyu.scrollToDest(document.getElementById("home_top").offsetTop - 60, 300);
}
};
const $scrollDownEle = document.getElementById("scroll-down");
$scrollDownEle && anzhiyu.addEventListenerPjax($scrollDownEle, "click", handleScrollToDest);
};
/**
* 代码
* 只适用于Hexo默认的代码渲染
*/
const addHighlightTool = function () {
const highLight = GLOBAL_CONFIG.highlight;
if (!highLight) return;
const { highlightCopy, highlightLang, highlightHeightLimit, plugin } = highLight;
const isHighlightShrink = GLOBAL_CONFIG_SITE.isHighlightShrink;
const isShowTool = highlightCopy || highlightLang || isHighlightShrink !== undefined;
const $figureHighlight =
plugin === "highlight.js"
? document.querySelectorAll("figure.highlight")
: document.querySelectorAll('pre[class*="language-"]');
if (!((isShowTool || highlightHeightLimit) && $figureHighlight.length)) return;
const isPrismjs = plugin === "prismjs";
const highlightShrinkClass = isHighlightShrink === true ? "closed" : "";
const highlightShrinkEle =
isHighlightShrink !== undefined
? ''
: "";
const highlightCopyEle = highlightCopy
? '
'
: "";
const alertInfo = (ele, text) => {
if (GLOBAL_CONFIG.Snackbar !== undefined) {
anzhiyu.snackbarShow(text);
} else {
const prevEle = ele.previousElementSibling;
prevEle.textContent = text;
prevEle.style.opacity = 1;
setTimeout(() => {
prevEle.style.opacity = 0;
}, 800);
}
};
const copy = ctx => {
if (document.queryCommandSupported && document.queryCommandSupported("copy")) {
document.execCommand("copy");
alertInfo(ctx, GLOBAL_CONFIG.copy.success);
} else {
alertInfo(ctx, GLOBAL_CONFIG.copy.noSupport);
}
};
// click events
const highlightCopyFn = ele => {
const $buttonParent = ele.parentNode;
$buttonParent.classList.add("copy-true");
const selection = window.getSelection();
const range = document.createRange();
const preCodeSelector = isPrismjs ? "pre code" : "table .code pre";
range.selectNodeContents($buttonParent.querySelectorAll(`${preCodeSelector}`)[0]);
selection.removeAllRanges();
selection.addRange(range);
copy(ele.lastChild);
selection.removeAllRanges();
$buttonParent.classList.remove("copy-true");
};
const highlightShrinkFn = ele => {
ele.classList.toggle("closed");
};
const highlightToolsFn = function (e) {
const $target = e.target.classList;
if ($target.contains("expand")) highlightShrinkFn(this);
else if ($target.contains("copy-button")) highlightCopyFn(this);
};
const expandCode = function () {
this.classList.toggle("expand-done");
};
const createEle = (lang, item, service) => {
const fragment = document.createDocumentFragment();
if (isShowTool) {
const hlTools = document.createElement("div");
hlTools.className = `highlight-tools ${highlightShrinkClass}`;
hlTools.innerHTML = highlightShrinkEle + lang + highlightCopyEle;
anzhiyu.addEventListenerPjax(hlTools, "click", highlightToolsFn);
fragment.appendChild(hlTools);
}
if (highlightHeightLimit && item.offsetHeight > highlightHeightLimit + 30) {
const ele = document.createElement("div");
ele.className = "code-expand-btn";
ele.innerHTML = '';
anzhiyu.addEventListenerPjax(ele, "click", expandCode);
fragment.appendChild(ele);
}
if (service === "hl") {
item.insertBefore(fragment, item.firstChild);
} else {
item.parentNode.insertBefore(fragment, item);
}
};
if (isPrismjs) {
$figureHighlight.forEach(item => {
if (highlightLang) {
const langName = item.getAttribute("data-language") || "Code";
const highlightLangEle = `${langName}
`;
anzhiyu.wrap(item, "figure", { class: "highlight" });
createEle(highlightLangEle, item);
} else {
anzhiyu.wrap(item, "figure", { class: "highlight" });
createEle("", item);
}
});
} else {
$figureHighlight.forEach(item => {
if (highlightLang) {
let langName = item.getAttribute("class").split(" ")[1];
if (langName === "plain" || langName === undefined) langName = "Code";
const highlightLangEle = `${langName}
`;
createEle(highlightLangEle, item, "hl");
} else {
createEle("", item, "hl");
}
});
}
};
/**
* PhotoFigcaption
*/
function addPhotoFigcaption() {
document.querySelectorAll("#article-container img").forEach(function (item) {
const parentEle = item.parentNode;
const altValue = item.title || item.alt;
if (altValue && !parentEle.parentNode.classList.contains("justified-gallery")) {
const ele = document.createElement("div");
ele.className = "img-alt is-center";
ele.textContent = altValue;
parentEle.insertBefore(ele, item.nextSibling);
}
});
}
/**
* Lightbox
*/
const runLightbox = () => {
anzhiyu.loadLightbox(document.querySelectorAll("#article-container img:not(.no-lightbox)"));
};
/**
* justified-gallery 圖庫排版
*/
const runJustifiedGallery = function (ele) {
const htmlStr = arr => {
let str = "";
const replaceDq = str => str.replace(/"/g, """); // replace double quotes to "
arr.forEach(i => {
const alt = i.alt ? `alt="${replaceDq(i.alt)}"` : "";
const title = i.title ? `title="${replaceDq(i.title)}"` : "";
const address = i.address ? i.address : "";
const galleryItem = `
${address ? `
${address}
` : ""}
`;
str += galleryItem;
});
return str;
};
const lazyloadFn = (i, arr, limit) => {
const loadItem = Number(limit);
const arrLength = arr.length;
if (arrLength > loadItem) i.insertAdjacentHTML("beforeend", htmlStr(arr.splice(0, loadItem)));
else {
i.insertAdjacentHTML("beforeend", htmlStr(arr));
i.classList.remove("lazyload");
}
window.lazyLoadInstance && window.lazyLoadInstance.update();
return arrLength > loadItem ? loadItem : arrLength;
};
const fetchUrl = async url => {
const response = await fetch(url);
return await response.json();
};
const runJustifiedGallery = (item, arr) => {
const limit = item.getAttribute("data-limit") ?? arr.length;
if (!item.classList.contains("lazyload") || arr.length < limit) {
// 不懒加载
item.innerHTML = htmlStr(arr);
item.nextElementSibling.style.display = "none";
} else {
if (!item.classList.contains("btn_album_detail_lazyload") || item.classList.contains("page_img_lazyload")) {
// 滚动懒加载
lazyloadFn(item, arr, limit);
const clickBtnFn = () => {
const lastItemLength = lazyloadFn(item, arr, limit);
fjGallery(
item,
"appendImages",
item.querySelectorAll(`.fj-gallery-item:nth-last-child(-n+${lastItemLength})`)
);
anzhiyu.loadLightbox(item.querySelectorAll("img"));
if (lastItemLength < Number(limit)) {
observer.unobserve(item.nextElementSibling);
}
};
// 创建IntersectionObserver实例
const observer = new IntersectionObserver((entries, observer) => {
entries.forEach(entry => {
// 如果元素进入视口
if (entry.isIntersecting) {
// 执行clickBtnFn函数
setTimeout(clickBtnFn(), 100);
}
});
});
observer.observe(item.nextElementSibling);
} else {
// 相册详情 按钮懒加载
lazyloadFn(item, arr, limit);
const clickBtnFn = () => {
const lastItemLength = lazyloadFn(item, arr, limit);
fjGallery(
item,
"appendImages",
item.querySelectorAll(`.fj-gallery-item:nth-last-child(-n+${lastItemLength})`)
);
anzhiyu.loadLightbox(item.querySelectorAll("img"));
lastItemLength < limit && item.nextElementSibling.removeEventListener("click", clickBtnFn);
};
item.nextElementSibling.addEventListener("click", clickBtnFn);
}
}
anzhiyu.initJustifiedGallery(item);
anzhiyu.loadLightbox(item.querySelectorAll("img"));
window.lazyLoadInstance && window.lazyLoadInstance.update();
};
const addJustifiedGallery = () => {
ele.forEach(item => {
item.classList.contains("url")
? fetchUrl(item.textContent).then(res => {
runJustifiedGallery(item, res);
})
: runJustifiedGallery(item, JSON.parse(item.textContent));
});
};
if (window.fjGallery) {
addJustifiedGallery();
return;
}
getCSS(`${GLOBAL_CONFIG.source.justifiedGallery.css}`);
getScript(`${GLOBAL_CONFIG.source.justifiedGallery.js}`).then(addJustifiedGallery);
};
/**
* 滚动处理
*/
const scrollFn = function () {
const $rightside = document.getElementById("rightside");
const innerHeight = window.innerHeight + 56;
let lastScrollTop = 0;
if (document.body.scrollHeight <= innerHeight) {
$rightside.style.cssText = "opacity: 1; transform: translateX(-58px)";
}
// find the scroll direction
function scrollDirection(currentTop) {
const result = currentTop > initTop; // true is down & false is up
initTop = currentTop;
return result;
}
let initTop = 0;
let isChatShow = true;
const $header = document.getElementById("page-header");
const $popupWindow = document.getElementById("popup-window");
const isChatBtnHide = typeof chatBtnHide === "function";
const isChatBtnShow = typeof chatBtnShow === "function";
// 第一次滑动到底部的标识符
let scrollBottomFirstFlag = false;
// 缓存常用dom元素
const musicDom = document.getElementById("nav-music"),
footerDom = document.getElementById("footer"),
waterfallDom = document.getElementById("waterfall"),
$percentBtn = document.getElementById("percent"),
$navTotop = document.getElementById("nav-totop"),
$bodyWrap = document.getElementById("body-wrap");
// 页面底部Dom是否存在
let pageBottomDomFlag = document.getElementById("post-comment") || document.getElementById("footer");
function percentageScrollFn(currentTop) {
// 处理滚动百分比
let docHeight = $bodyWrap.clientHeight;
const winHeight = document.documentElement.clientHeight;
const contentMath =
docHeight > winHeight ? docHeight - winHeight : document.documentElement.scrollHeight - winHeight;
const scrollPercent = currentTop / contentMath;
const scrollPercentRounded = Math.round(scrollPercent * 100);
const percentage = scrollPercentRounded > 100 ? 100 : scrollPercentRounded <= 0 ? 1 : scrollPercentRounded;
$percentBtn.textContent = percentage;
function isInViewPortOfOneNoDis(el) {
if (!el) return;
const elDisplay = window.getComputedStyle(el).getPropertyValue("display");
if (elDisplay == "none") {
return;
}
const viewPortHeight =
window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight;
const offsetTop = el.offsetTop;
const scrollTop = document.documentElement.scrollTop;
const top = offsetTop - scrollTop;
return top <= viewPortHeight;
}
if (isInViewPortOfOneNoDis(pageBottomDomFlag || percentage > 90) && currentTop > 20) {
$navTotop.classList.add("long");
$percentBtn.textContent = "返回顶部";
} else {
$navTotop.classList.remove("long");
$percentBtn.textContent = percentage;
}
// 如果当前页面需要瀑布流,就处理瀑布流
if (waterfallDom) {
const waterfallResult = currentTop % document.documentElement.clientHeight; // 卷去一个视口
if (!scrollBottomFirstFlag && waterfallResult + 100 >= document.documentElement.clientHeight) {
console.info(waterfallResult, document.documentElement.clientHeight);
setTimeout(() => {
waterfall("#waterfall");
}, 500);
} else {
setTimeout(() => {
waterfallDom && waterfall("#waterfall");
}, 500);
}
}
}
const scrollTask = anzhiyu.throttle(() => {
const currentTop = window.scrollY || document.documentElement.scrollTop;
const isDown = scrollDirection(currentTop);
const delta = Math.abs(lastScrollTop - currentTop);
if (currentTop > 60 && delta < 20 && delta != 0) {
// ignore small scrolls
return;
}
if (
$popupWindow &&
$popupWindow.classList.contains("show-popup-window") &&
currentTop > 60 &&
delta > 20 &&
lastScrollTop != 0
) {
// 滚动后延迟1s关闭弹窗
anzhiyu.throttle(() => {
if (popupWindowTimer) clearTimeout(popupWindowTimer);
popupWindowTimer = setTimeout(() => {
if (!$popupWindow.classList.contains("popup-hide")) {
$popupWindow.classList.add("popup-hide");
}
setTimeout(() => {
$popupWindow.classList.remove("popup-hide");
$popupWindow.classList.remove("show-popup-window");
}, 1000);
}, 1000);
}, 1000)();
}
lastScrollTop = currentTop;
if (currentTop > 26) {
if (isDown) {
if ($header.classList.contains("nav-visible")) $header.classList.remove("nav-visible");
if (isChatBtnShow && isChatShow === true) {
chatBtnHide();
isChatShow = false;
}
} else {
if (!$header.classList.contains("nav-visible")) $header.classList.add("nav-visible");
if (isChatBtnHide && isChatShow === false) {
chatBtnShow();
isChatShow = true;
}
}
requestAnimationFrame(() => {
anzhiyu.initThemeColor();
$header.classList.add("nav-fixed");
});
if (window.getComputedStyle($rightside).getPropertyValue("opacity") === "0") {
$rightside.style.cssText = "opacity: 0.8; transform: translateX(-58px)";
}
} else {
if (currentTop <= 5) {
requestAnimationFrame(() => {
$header.classList.remove("nav-fixed");
$header.classList.remove("nav-visible");
// 修改顶栏颜色
anzhiyu.initThemeColor();
});
}
$rightside.style.cssText = "opacity: ''; transform: ''";
}
if (document.body.scrollHeight <= innerHeight) {
$rightside.style.cssText = "opacity: 0.8; transform: translateX(-58px)";
}
percentageScrollFn(currentTop);
}, 96);
// 进入footer隐藏音乐
if (footerDom) {
anzhiyu
.intersectionObserver(
() => {
if (footerDom && musicDom && 768 < document.body.clientWidth) {
musicDom.style.bottom = "-10px";
musicDom.style.opacity = "0";
}
scrollBottomFirstFlag = true;
},
() => {
if (footerDom && musicDom && 768 < document.body.clientWidth) {
musicDom.style.bottom = "20px";
musicDom.style.opacity = "1";
}
}
)()
.observe(footerDom);
}
scrollTask();
anzhiyu.addEventListenerPjax(window, "scroll", scrollTask, { passive: true });
};
/**
* toc,anchor
*/
const scrollFnToDo = function () {
const isToc = GLOBAL_CONFIG_SITE.isToc;
const isAnchor = GLOBAL_CONFIG.isAnchor;
const $article = document.getElementById("article-container");
if (!($article && (isToc || isAnchor))) return;
let $tocLink, $cardToc, autoScrollToc, isExpand;
if (isToc) {
const $cardTocLayout = document.getElementById("card-toc");
$cardToc = $cardTocLayout.querySelector(".toc-content");
$tocLink = $cardToc.querySelectorAll(".toc-link");
isExpand = $cardToc.classList.contains("is-expand");
// toc元素點擊
const tocItemClickFn = e => {
const target = e.target.closest(".toc-link");
if (!target) return;
e.preventDefault();
anzhiyu.scrollToDest(
anzhiyu.getEleTop(document.getElementById(decodeURI(target.getAttribute("href")).replace("#", ""))) - 60,
300
);
if (window.innerWidth < 900) {
$cardTocLayout.classList.remove("open");
}
};
anzhiyu.addEventListenerPjax($cardToc, "click", tocItemClickFn);
autoScrollToc = item => {
const activePosition = item.getBoundingClientRect().top;
const sidebarScrollTop = $cardToc.scrollTop;
if (activePosition > document.documentElement.clientHeight - 100) {
$cardToc.scrollTop = sidebarScrollTop + 150;
}
if (activePosition < 100) {
$cardToc.scrollTop = sidebarScrollTop - 150;
}
};
}
// find head position & add active class
const list = $article.querySelectorAll("h1,h2,h3,h4,h5,h6");
const filteredHeadings = Array.from(list).filter(heading => heading.id !== "CrawlerTitle");
let detectItem = "";
const findHeadPosition = function (top) {
if (top === 0) {
return false;
}
let currentId = "";
let currentIndex = "";
filteredHeadings.forEach(function (ele, index) {
if (top > anzhiyu.getEleTop(ele) - 80) {
const id = ele.id;
currentId = id ? "#" + encodeURI(id) : "";
currentIndex = index;
}
});
if (detectItem === currentIndex) return;
if (isAnchor) anzhiyu.updateAnchor(currentId);
detectItem = currentIndex;
if (isToc) {
$cardToc.querySelectorAll(".active").forEach(i => {
i.classList.remove("active");
});
if (currentId === "") {
return;
}
const currentActive = $tocLink[currentIndex];
currentActive.classList.add("active");
setTimeout(() => {
autoScrollToc(currentActive);
}, 0);
if (isExpand) return;
let parent = currentActive.parentNode;
for (; !parent.matches(".toc"); parent = parent.parentNode) {
if (parent.matches("li")) parent.classList.add("active");
}
}
};
// main of scroll
const tocScrollFn = anzhiyu.throttle(() => {
const currentTop = window.scrollY || document.documentElement.scrollTop;
findHeadPosition(currentTop);
}, 100);
anzhiyu.addEventListenerPjax(window, "scroll", tocScrollFn, { passive: true });
};
const handleThemeChange = mode => {
const globalFn = window.globalFn || {};
const themeChange = globalFn.themeChange || {};
if (!themeChange) {
return;
}
Object.keys(themeChange).forEach(key => {
const themeChangeFn = themeChange[key];
themeChangeFn(mode);
});
rm && rm.hideRightMenu();
const menuDarkmodeText = $rightMenu.querySelector(".menu-darkmode-text");
if (mode === "light") {
menuDarkmodeText.textContent = "深色模式";
} else {
menuDarkmodeText.textContent = "浅色模式";
}
if (!GLOBAL_CONFIG_SITE.isPost) {
const root = document.querySelector(":root");
root.style.setProperty("--anzhiyu-bar-background", "var(--anzhiyu-meta-theme-color)");
requestAnimationFrame(() => {
anzhiyu.initThemeColor();
});
// 要改回来默认主色;
document.documentElement.style.setProperty(
"--anzhiyu-main",
getComputedStyle(document.documentElement).getPropertyValue("--anzhiyu-theme")
);
document.documentElement.style.setProperty(
"--anzhiyu-theme-op",
getComputedStyle(document.documentElement).getPropertyValue("--anzhiyu-main") + "23"
);
document.documentElement.style.setProperty(
"--anzhiyu-theme-op-deep",
getComputedStyle(document.documentElement).getPropertyValue("--anzhiyu-main") + "dd"
);
}
};
/**
* Rightside
*/
const rightSideFn = {
readmode: () => {
// read mode
const $body = document.body;
$body.classList.add("read-mode");
const newEle = document.createElement("button");
newEle.type = "button";
newEle.className = "anzhiyufont anzhiyu-icon-xmark exit-readmode";
$body.appendChild(newEle);
const clickFn = () => {
$body.classList.remove("read-mode");
newEle.remove();
newEle.removeEventListener("click", clickFn);
};
newEle.addEventListener("click", clickFn);
},
darkmode: () => {
// switch between light and dark mode
const willChangeMode = document.documentElement.getAttribute("data-theme") === "dark" ? "light" : "dark";
if (willChangeMode === "dark") {
activateDarkMode();
GLOBAL_CONFIG.Snackbar !== undefined && anzhiyu.snackbarShow(GLOBAL_CONFIG.Snackbar.day_to_night);
} else {
activateLightMode();
GLOBAL_CONFIG.Snackbar !== undefined && anzhiyu.snackbarShow(GLOBAL_CONFIG.Snackbar.night_to_day);
}
saveToLocal.set("theme", willChangeMode, 2);
handleThemeChange(willChangeMode);
},
"rightside-config": item => {
// Show or hide rightside-hide-btn
const hideLayout = item.firstElementChild;
if (hideLayout.classList.contains("show")) {
hideLayout.classList.add("status");
setTimeout(() => {
hideLayout.classList.remove("status");
}, 300);
}
hideLayout.classList.toggle("show");
},
"go-up": () => {
// Back to top
anzhiyu.scrollToDest(0, 500);
},
"hide-aside-btn": () => {
// Hide aside
const $htmlDom = document.documentElement.classList;
const saveStatus = $htmlDom.contains("hide-aside") ? "show" : "hide";
saveToLocal.set("aside-status", saveStatus, 2);
$htmlDom.toggle("hide-aside");
},
"mobile-toc-button": item => {
// Show mobile toc
const tocEle = document.getElementById("card-toc");
tocEle.style.transformOrigin = `right ${item.getBoundingClientRect().top + 17}px`;
tocEle.style.transition = "transform 0.3s ease-in-out";
tocEle.classList.toggle("open");
tocEle.addEventListener(
"transitionend",
() => {
tocEle.style.transition = "";
tocEle.style.transformOrigin = "";
},
{ once: true }
);
},
"chat-btn": () => {
// Show chat
window.chatBtnFn();
},
translateLink: () => {
// switch between traditional and simplified chinese
window.translateFn.translatePage();
},
};
document.getElementById("rightside").addEventListener("click", function (e) {
const $target = e.target.closest("[id]");
if ($target && rightSideFn[$target.id]) {
rightSideFn[$target.id](this);
}
});
//监听蒙版关闭
document.addEventListener(
"touchstart",
e => {
anzhiyu.removeRewardMask();
},
{ passive: true }
);
/**
* menu
* 側邊欄sub-menu 展開/收縮
*/
const clickFnOfSubMenu = () => {
const handleClickOfSubMenu = e => {
const target = e.target.closest(".site-page.group");
if (!target) return;
target.classList.toggle("hide");
};
document.querySelector("#sidebar-menus .menus_items") &&
document.querySelector("#sidebar-menus .menus_items").addEventListener("click", handleClickOfSubMenu);
};
/**
* 手机端目录点击
*/
const openMobileMenu = () => {
const handleClick = () => {
sidebarFn.open();
};
anzhiyu.addEventListenerPjax(document.getElementById("toggle-menu"), "click", handleClick);
};
/**
* 複製時加上版權信息
*/
const addCopyright = () => {
const { limitCount, languages, copy, copyrightEbable } = GLOBAL_CONFIG.copyright;
const handleCopy = e => {
if (copy) {
anzhiyu.snackbarShow(languages.copySuccess);
}
if (copyrightEbable) {
e.preventDefault();
const copyFont = window.getSelection(0).toString();
let textFont = copyFont;
if (copyFont.length > limitCount) {
textFont = `${copyFont}\n\n\n${languages.author}\n${languages.link}${window.location.href}\n${languages.source}\n${languages.info}`;
}
if (e.clipboardData) {
return e.clipboardData.setData("text", textFont);
} else {
return window.clipboardData.setData("text", textFont);
}
}
};
document.body.addEventListener("copy", handleCopy);
};
/**
* 網頁運行時間
*/
const addRuntime = () => {
const $runtimeCount = document.getElementById("runtimeshow");
if ($runtimeCount) {
const publishDate = $runtimeCount.getAttribute("data-publishDate");
$runtimeCount.textContent = `${anzhiyu.diffDate(publishDate)} ${GLOBAL_CONFIG.runtime}`;
}
};
/**
* 最後一次更新時間
*/
const addLastPushDate = () => {
const $lastPushDateItem = document.getElementById("last-push-date");
if ($lastPushDateItem) {
const lastPushDate = $lastPushDateItem.getAttribute("data-lastPushDate");
$lastPushDateItem.textContent = anzhiyu.diffDate(lastPushDate, true);
}
};
/**
* table overflow
*/
const addTableWrap = () => {
const $table = document.querySelectorAll("#article-container table");
if (!$table.length) return;
$table.forEach(item => {
if (!item.closest(".highlight")) {
anzhiyu.wrap(item, "div", { class: "table-wrap" });
}
});
};
/**
* tag-hide
*/
const clickFnOfTagHide = () => {
const hideButtons = document.querySelectorAll("#article-container .hide-button");
if (!hideButtons.length) return;
const handleClick = function (e) {
const $this = this;
$this.classList.add("open");
const $fjGallery = $this.nextElementSibling.querySelectorAll(".gallery-container");
$fjGallery.length && addJustifiedGallery($fjGallery);
};
hideButtons.forEach(item => {
item.addEventListener("click", handleClick, { once: true });
});
};
const tabsFn = () => {
const navTabsElement = document.querySelectorAll("#article-container .tabs");
if (!navTabsElement.length) return;
const removeAndAddActiveClass = (elements, detect) => {
Array.from(elements).forEach(element => {
element.classList.remove("active");
if (element === detect || element.id === detect) {
element.classList.add("active");
}
});
};
const addTabNavEventListener = (item, isJustifiedGallery) => {
const navClickHandler = function (e) {
const target = e.target.closest("button");
if (target.classList.contains("active")) return;
removeAndAddActiveClass(this.children, target);
this.classList.remove("no-default");
const tabId = target.getAttribute("data-href");
const tabContent = this.nextElementSibling;
removeAndAddActiveClass(tabContent.children, tabId);
if (isJustifiedGallery) {
const $isTabJustifiedGallery = tabContent.querySelectorAll(`#${tabId} .fj-gallery`);
if ($isTabJustifiedGallery.length > 0) {
anzhiyu.initJustifiedGallery($isTabJustifiedGallery);
}
}
};
anzhiyu.addEventListenerPjax(item.firstElementChild, "click", navClickHandler);
};
const addTabToTopEventListener = item => {
const btnClickHandler = e => {
const target = e.target.closest("button");
if (!target) return;
anzhiyu.scrollToDest(anzhiyu.getEleTop(item), 300);
};
anzhiyu.addEventListenerPjax(item.lastElementChild, "click", btnClickHandler);
};
navTabsElement.forEach(item => {
const isJustifiedGallery = !!item.querySelectorAll(".gallery-container");
addTabNavEventListener(item, isJustifiedGallery);
addTabToTopEventListener(item);
});
};
const toggleCardCategory = () => {
const cardCategory = document.querySelector("#aside-cat-list.expandBtn");
if (!cardCategory) return;
const handleToggleBtn = e => {
const target = e.target;
if (target.nodeName === "I") {
e.preventDefault();
target.parentNode.classList.toggle("expand");
}
};
anzhiyu.addEventListenerPjax(cardCategory, "click", handleToggleBtn, true);
};
const switchComments = () => {
const switchBtn = document.getElementById("switch-btn");
if (!switchBtn) return;
let switchDone = false;
const commentContainer = document.getElementById("post-comment");
const handleSwitchBtn = () => {
commentContainer.classList.toggle("move");
if (!switchDone && typeof loadOtherComment === "function") {
switchDone = true;
loadOtherComment();
}
};
anzhiyu.addEventListenerPjax(switchBtn, "click", handleSwitchBtn);
};
const addPostOutdateNotice = function () {
const data = GLOBAL_CONFIG.noticeOutdate;
const diffDay = anzhiyu.diffDate(GLOBAL_CONFIG_SITE.postUpdate);
if (diffDay >= data.limitDay) {
const ele = document.createElement("div");
ele.className = "post-outdate-notice";
ele.textContent = data.messagePrev + " " + diffDay + " " + data.messageNext;
const $targetEle = document.getElementById("article-container");
if (data.position === "top") {
$targetEle.insertBefore(ele, $targetEle.firstChild);
} else {
$targetEle.appendChild(ele);
}
}
};
const lazyloadImg = () => {
window.lazyLoadInstance = new LazyLoad({
elements_selector: "img",
threshold: 0,
data_src: "lazy-src",
});
};
const relativeDate = function (selector) {
selector.forEach(item => {
const timeVal = item.getAttribute("datetime");
item.textContent = anzhiyu.diffDate(timeVal, true);
item.style.display = "inline";
});
};
const mouseleaveHomeCard = function () {
const topGroup = document.querySelector(".topGroup");
if (!topGroup) return;
//首页大卡片恢复显示
topGroup.addEventListener("mouseleave", function () {
document.getElementById("todayCard").classList.remove("hide");
document.getElementById("todayCard").style.zIndex = 1;
});
};
// 表情放大
const owoBig = function () {
let flag = 1, // 设置节流阀
owo_time = "", // 设置计时器
m = 3; // 设置放大倍数
// 创建盒子
let div = document.createElement("div");
// 设置ID
div.id = "owo-big";
// 插入盒子
let body = document.querySelector("body");
body.appendChild(div);
// 监听 post-comment 元素的子元素添加事件
const observer = new MutationObserver(mutations => {
mutations.forEach(mutation => {
const addedNodes = mutation.addedNodes;
// 判断新增的节点中是否包含 OwO-body 类名的元素
for (let i = 0; i < addedNodes.length; i++) {
const node = addedNodes[i];
if (
node.nodeType === Node.ELEMENT_NODE &&
node.classList.contains("OwO-body") &&
!node.classList.contains("comment-barrage")
) {
const owo_body = node;
// 禁用右键(手机端长按会出现右键菜单,为了体验给禁用掉)
owo_body.addEventListener("contextmenu", e => e.preventDefault());
// 鼠标移入
owo_body.addEventListener("mouseover", handleMouseOver);
// 鼠标移出
owo_body.addEventListener("mouseout", handleMouseOut);
}
}
});
});
// 配置 MutationObserver 选项
const config = { childList: true, subtree: true };
// 开始监听
observer.observe(document.getElementById("post-comment"), config);
function handleMouseOver(e) {
if (e.target.tagName == "IMG" && flag) {
flag = 0;
// 移入100毫秒后显示盒子
owo_time = setTimeout(() => {
let height = e.target.clientHeight * m; // 盒子高
let width = e.target.clientWidth * m; // 盒子宽
let left = e.x - e.offsetX - (width - e.target.clientWidth) / 2; // 盒子与屏幕左边距离
if (left + width > body.clientWidth) {
left -= left + width - body.clientWidth + 10;
} // 右边缘检测,防止超出屏幕
if (left < 0) left = 10; // 左边缘检测,防止超出屏幕
let top = e.y - e.offsetY; // 盒子与屏幕顶部距离
// 设置盒子样式
div.style.height = height + "px";
div.style.width = width + "px";
div.style.left = left + "px";
div.style.top = top + "px";
div.style.display = "flex";
// 在盒子中插入图片
div.innerHTML = `
`;
}, 100);
}
}
function handleMouseOut(e) {
// 隐藏盒子
div.style.display = "none";
flag = 1;
clearTimeout(owo_time);
}
};
//封面纯色
const coverColor = async () => {
const root = document.querySelector(":root");
const path = document.getElementById("post-top-bg")?.src;
if (!path) {
// 非文章情况,直接设置不需要请求了
root.style.setProperty("--anzhiyu-bar-background", "var(--anzhiyu-meta-theme-color)");
requestAnimationFrame(() => {
anzhiyu.initThemeColor();
});
// 要改回来默认主色
document.documentElement.style.setProperty(
"--anzhiyu-main",
getComputedStyle(document.documentElement).getPropertyValue("--anzhiyu-theme")
);
document.documentElement.style.setProperty(
"--anzhiyu-theme-op",
getComputedStyle(document.documentElement).getPropertyValue("--anzhiyu-main") + "23"
);
document.documentElement.style.setProperty(
"--anzhiyu-theme-op-deep",
getComputedStyle(document.documentElement).getPropertyValue("--anzhiyu-main") + "dd"
);
return;
}
// 文章内
if (GLOBAL_CONFIG.mainTone) {
if (GLOBAL_CONFIG_SITE.postMainColor) {
let value = GLOBAL_CONFIG_SITE.postMainColor;
if (getContrastYIQ(value) === "light") {
value = LightenDarkenColor(colorHex(value), -40);
}
root.style.setProperty("--anzhiyu-bar-background", value);
requestAnimationFrame(() => {
anzhiyu.initThemeColor();
});
if (GLOBAL_CONFIG.mainTone.cover_change) {
document.documentElement.style.setProperty("--anzhiyu-main", value);
document.documentElement.style.setProperty(
"--anzhiyu-theme-op",
getComputedStyle(document.documentElement).getPropertyValue("--anzhiyu-main") + "23"
);
document.documentElement.style.setProperty(
"--anzhiyu-theme-op-deep",
getComputedStyle(document.documentElement).getPropertyValue("--anzhiyu-main") + "dd"
);
}
} else {
const fallbackValue = "var(--anzhiyu-theme)";
let fetchPath = "";
if (GLOBAL_CONFIG.mainTone.mode == "cdn" || GLOBAL_CONFIG.mainTone.mode == "both") {
fetchPath = path + "?imageAve";
} else if (GLOBAL_CONFIG.mainTone.mode == "api") {
fetchPath = GLOBAL_CONFIG.mainTone.api + path;
}
// cdn/api模式请求
try {
const response = await fetch(fetchPath);
if (response.ok && response.headers.get("content-type")?.includes("application/json")) {
const obj = await response.json();
let value =
GLOBAL_CONFIG.mainTone.mode == "cdn" || GLOBAL_CONFIG.mainTone.mode == "both"
? "#" + obj.RGB.slice(2)
: obj.RGB;
if (getContrastYIQ(value) === "light") {
value = LightenDarkenColor(colorHex(value), -40);
}
root.style.setProperty("--anzhiyu-bar-background", value);
requestAnimationFrame(() => {
anzhiyu.initThemeColor();
});
if (GLOBAL_CONFIG.mainTone.cover_change) {
document.documentElement.style.setProperty("--anzhiyu-main", value);
document.documentElement.style.setProperty(
"--anzhiyu-theme-op",
getComputedStyle(document.documentElement).getPropertyValue("--anzhiyu-main") + "23"
);
document.documentElement.style.setProperty(
"--anzhiyu-theme-op-deep",
getComputedStyle(document.documentElement).getPropertyValue("--anzhiyu-main") + "dd"
);
}
} else {
if (GLOBAL_CONFIG.mainTone.mode == "both") {
// both继续请求
try {
const response = await fetch(GLOBAL_CONFIG.mainTone.api + path);
if (response.ok && response.headers.get("content-type")?.includes("application/json")) {
const obj = await response.json();
let value = obj.RGB;
if (getContrastYIQ(value) === "light") {
value = LightenDarkenColor(colorHex(value), -40);
}
root.style.setProperty("--anzhiyu-bar-background", value);
requestAnimationFrame(() => {
anzhiyu.initThemeColor();
});
if (GLOBAL_CONFIG.mainTone.cover_change) {
document.documentElement.style.setProperty("--anzhiyu-main", value);
document.documentElement.style.setProperty(
"--anzhiyu-theme-op",
getComputedStyle(document.documentElement).getPropertyValue("--anzhiyu-main") + "23"
);
document.documentElement.style.setProperty(
"--anzhiyu-theme-op-deep",
getComputedStyle(document.documentElement).getPropertyValue("--anzhiyu-main") + "dd"
);
}
} else {
root.style.setProperty("--anzhiyu-bar-background", fallbackValue);
requestAnimationFrame(() => {
anzhiyu.initThemeColor();
});
document.documentElement.style.setProperty("--anzhiyu-main", fallbackValue);
}
} catch {
root.style.setProperty("--anzhiyu-bar-background", fallbackValue);
requestAnimationFrame(() => {
anzhiyu.initThemeColor();
});
document.documentElement.style.setProperty("--anzhiyu-main", fallbackValue);
}
} else {
root.style.setProperty("--anzhiyu-bar-background", fallbackValue);
requestAnimationFrame(() => {
anzhiyu.initThemeColor();
});
document.documentElement.style.setProperty("--anzhiyu-main", fallbackValue);
}
}
} catch (err) {
console.error("Error fetching data:", err);
root.style.setProperty("--anzhiyu-bar-background", fallbackValue);
requestAnimationFrame(() => {
anzhiyu.initThemeColor();
});
document.documentElement.style.setProperty("--anzhiyu-main", fallbackValue);
}
}
}
};
//RGB颜色转化为16进制颜色
const colorHex = str => {
const hexRegex = /^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/;
if (/^(rgb|RGB)/.test(str)) {
const aColor = str.replace(/(?:\(|\)|rgb|RGB)*/g, "").split(",");
return aColor.reduce((acc, val) => {
const hex = Number(val).toString(16).padStart(2, "0");
return acc + hex;
}, "#");
}
if (hexRegex.test(str)) {
if (str.length === 4) {
return Array.from(str.slice(1)).reduce((acc, val) => acc + val + val, "#");
}
return str;
}
return str;
};
// Lighten or darken a color
const LightenDarkenColor = (col, amt) => {
const usePound = col.startsWith("#");
if (usePound) {
col = col.slice(1);
}
let num = parseInt(col, 16);
const processColor = (colorValue, amount) => {
colorValue += amount;
return colorValue > 255 ? 255 : colorValue < 0 ? 0 : colorValue;
};
const r = processColor(num >> 16, amt);
const b = processColor((num >> 8) & 0x00ff, amt);
const g = processColor(num & 0x0000ff, amt);
return (usePound ? "#" : "") + String("000000" + (g | (b << 8) | (r << 16)).toString(16)).slice(-6);
};
// Determine whether a color is light or dark
const getContrastYIQ = hexcolor => {
const colorRgb = color => {
const shorthandRegex = /^#?([a-f\d])([a-f\d])([a-f\d])$/i;
color = color.replace(shorthandRegex, (m, r, g, b) => r + r + g + g + b + b);
const result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(color);
return result ? `rgb(${parseInt(result[1], 16)}, ${parseInt(result[2], 16)}, ${parseInt(result[3], 16)})` : null;
};
const colorrgb = colorRgb(hexcolor);
const colors = colorrgb.match(/^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/);
const [_, red, green, blue] = colors;
const brightness = (red * 299 + green * 587 + blue * 114) / 255000;
return brightness >= 0.5 ? "light" : "dark";
};
//监听跳转页面输入框是否按下回车
const listenToPageInputPress = function () {
var input = document.getElementById("toPageText");
if (input) {
input.addEventListener("keydown", event => {
if (event.keyCode === 13) {
// 如果按下的是回车键,则执行特定的函数
anzhiyu.toPage();
var link = document.getElementById("toPageButton");
var href = link.href;
pjax.loadUrl(href);
}
});
}
};
// 监听nav是否被其他音频暂停⏸️
const listenNavMusicPause = function () {
const timer = setInterval(() => {
if (navMusicEl && navMusicEl.querySelector("#nav-music meting-js").aplayer) {
clearInterval(timer);
let msgPlay = '播放音乐';
let msgPause = '暂停音乐';
navMusicEl.querySelector("#nav-music meting-js").aplayer.on("pause", function () {
navMusicEl.classList.remove("playing");
document.getElementById("menu-music-toggle").innerHTML = msgPlay;
document.getElementById("nav-music-hoverTips").innerHTML = "音乐已暂停";
document.querySelector("#consoleMusic").classList.remove("on");
anzhiyu_musicPlaying = false;
navMusicEl.classList.remove("stretch");
});
navMusicEl.querySelector("#nav-music meting-js").aplayer.on("play", function () {
navMusicEl.classList.add("playing");
document.getElementById("menu-music-toggle").innerHTML = msgPause;
document.querySelector("#consoleMusic").classList.add("on");
anzhiyu_musicPlaying = true;
// navMusicEl.classList.add("stretch");
});
}
}, 16);
};
// 开发者工具键盘监听
window.onkeydown = function (e) {
123 === e.keyCode && anzhiyu.snackbarShow("开发者模式已打开,请遵循GPL协议", !1);
};
// 欢迎语
function greetingInit() {
const greetingBoxInfo = GLOBAL_CONFIG.greetingBox.list;
const greetingBoxDefault = GLOBAL_CONFIG.greetingBox.default;
//- 创建盒子
let div = document.createElement("div");
//- 设置ID
div.id = "greeting";
//- 设置class
setTimeout(() => {
div.classList.add("shown");
}, 1000);
//- 插入盒子
let greetingBox = document.getElementById("greetingBox");
if (!greetingBox) return;
greetingBox.appendChild(div);
const nowTime = new Date().getHours();
let greetings = greetingBoxDefault;
for (let i = 0; i < greetingBoxInfo.length; i++) {
if (nowTime >= greetingBoxInfo[i].startTime && nowTime <= greetingBoxInfo[i].endTime) {
greetings = greetingBoxInfo[i].greeting;
break;
}
}
div.innerHTML = greetings;
setTimeout(() => {
div.classList.remove("shown");
setTimeout(() => {
greetingBox.remove();
}, 500);
}, 3000);
}
function statistics51aInit() {
const loadScript = (url, charset = "UTF-8", crossorigin, id) => {
return new Promise((resolve, reject) => {
const script = document.createElement("script");
script.src = url;
script.async = true;
if (id) {
script.setAttribute("id", id);
}
if (charset) {
script.setAttribute("charset", charset);
}
if (crossorigin) {
script.setAttribute("crossorigin", crossorigin);
}
script.onerror = reject;
script.onload = script.onreadystatechange = function () {
const loadState = this.readyState;
if (loadState && loadState !== "loaded" && loadState !== "complete") return;
script.onload = script.onreadystatechange = null;
resolve();
};
document.head.appendChild(script);
});
};
const scriptUrls = [
{ url: "https://sdk.51.la/js-sdk-pro.min.js", charset: "UTF-8", crossorigin: false, id: "LA_COLLECT" },
{ url: "https://sdk.51.la/perf/js-sdk-perf.min.js", crossorigin: "anonymous" },
];
Promise.all(scriptUrls.map(({ url, charset, crossorigin, id }) => loadScript(url, charset, crossorigin, id)))
.then(() => {
LA.init({ id: GLOBAL_CONFIG.LA51.ck, ck: GLOBAL_CONFIG.LA51.ck });
new LingQue.Monitor().init({ id: GLOBAL_CONFIG.LA51.LingQueMonitorID, sendSuspicious: true });
})
.catch(error => {
console.error("加载51a统计异常,本地加载403是正常情况:", error);
});
}
function setInputFocusListener() {
const inputs = document.querySelectorAll("input, textarea");
const filteredinputs = Array.from(inputs).filter(heading => {
if (heading.id !== "center-console" || heading.id !== "page-type") {
return;
}
});
filteredinputs.forEach(input => {
input.addEventListener("focus", () => {
anzhiyu_intype = true;
});
input.addEventListener("blur", () => {
anzhiyu_intype = false;
});
});
}
// 是否开启快捷键
function executeShortcutKeyFunction() {
// 是否开启快捷键
anzhiyu_keyboard = localStorage.getItem("keyboardToggle") ? localStorage.getItem("keyboardToggle") : false;
function addKeyShotListener() {
const windowObject = window;
windowObject.removeEventListener("keydown", keyDownEvent);
windowObject.removeEventListener("keyup", keyUpEvent);
windowObject.addEventListener("keydown", keyDownEvent);
windowObject.addEventListener("keyup", keyUpEvent);
}
function keyDownEvent(event) {
const isEscapeKeyPressed = event.keyCode === 27;
const isShiftKeyPressed = event.shiftKey;
const isKeyboardEnabled = anzhiyu_keyboard;
const isInInputField = anzhiyu_intype;
if (isEscapeKeyPressed) {
anzhiyu.hideLoading();
anzhiyu.hideConsole();
rm && rm.hideRightMenu();
}
const shortcutKeyDelay = GLOBAL_CONFIG.shortcutKey.delay ? GLOBAL_CONFIG.shortcutKey.delay : 100;
const shortcutKeyShiftDelay = GLOBAL_CONFIG.shortcutKey.shiftDelay ? GLOBAL_CONFIG.shortcutKey.shiftDelay : 200;
if (isKeyboardEnabled && isShiftKeyPressed && !isInInputField) {
anzhiyu_keyUpShiftDelayEvent_timeoutId = setTimeout(() => {
switch (event.keyCode) {
case 16:
anzhiyu_keyUpEvent_timeoutId = setTimeout(() => {
document.querySelector("#keyboard-tips").classList.add("show");
}, shortcutKeyShiftDelay);
break;
case 65:
anzhiyu.switchConsole();
break;
case 77:
anzhiyu.musicToggle();
break;
case 75:
anzhiyu.keyboardToggle();
break;
case 73:
anzhiyu.rightMenuToggle();
break;
case 82:
toRandomPost();
break;
case 72:
pjax.loadUrl("/");
break;
case 68:
rightSideFn.darkmode();
break;
case 70:
pjax.loadUrl("/fcircle/");
break;
case 76:
pjax.loadUrl("/link/");
break;
case 80:
pjax.loadUrl("/about/");
break;
default:
break;
}
event.preventDefault();
}, shortcutKeyDelay);
}
}
window.onfocus = function () {
document.getElementById("keyboard-tips").classList.remove("show");
};
function keyUpEvent(event) {
anzhiyu_keyUpEvent_timeoutId && clearTimeout(anzhiyu_keyUpEvent_timeoutId);
anzhiyu_keyUpShiftDelayEvent_timeoutId && clearTimeout(anzhiyu_keyUpShiftDelayEvent_timeoutId);
if (event.keyCode === 16) {
const keyboardTips = document.querySelector("#keyboard-tips");
keyboardTips.classList.remove("show");
}
}
addKeyShotListener();
}
function changeDocumentTitle() {
let leaveTitle = GLOBAL_CONFIG.diytitle.leaveTitle;
let backTitle = GLOBAL_CONFIG.diytitle.backTitle;
let OriginTitile = document.title;
let titleTime;
document.addEventListener("visibilitychange", function () {
if (document.hidden) {
//离开当前页面时标签显示内容
document.title = leaveTitle;
clearTimeout(titleTime);
} else {
//返回当前页面时标签显示内容
document.title = backTitle + OriginTitile;
//两秒后变回正常标题
titleTime = setTimeout(function () {
document.title = OriginTitile;
}, 2000);
}
});
}
function addDarkModeEventListener(elementId, childSelector) {
const element = document.getElementById(elementId);
if (element && childSelector) {
const childElement = element.querySelector(childSelector);
childElement && childElement.addEventListener("click", rightSideFn.darkmode);
} else if (element) {
element.addEventListener("click", rightSideFn.darkmode);
}
}
const unRefreshFn = function () {
window.addEventListener("resize", () => {
adjustMenu(false);
mobileSidebarOpen && anzhiyu.isHidden(document.getElementById("toggle-menu")) && sidebarFn.close();
});
document.getElementById("menu-mask").addEventListener("click", e => {
sidebarFn.close();
});
// 处理右键
$rightMenu = document.getElementById("rightMenu");
addDarkModeEventListener("menu-darkmode");
addDarkModeEventListener("sidebar", ".darkmode_switchbutton");
clickFnOfSubMenu();
GLOBAL_CONFIG.islazyload && lazyloadImg();
GLOBAL_CONFIG.copyright !== undefined && addCopyright();
GLOBAL_CONFIG.navMusic && listenNavMusicPause();
if (GLOBAL_CONFIG.shortcutKey && document.getElementById("consoleKeyboard")) {
localStorage.setItem("keyboardToggle", "true");
document.getElementById("consoleKeyboard").classList.add("on");
anzhiyu_keyboard = true;
executeShortcutKeyFunction();
}
if (GLOBAL_CONFIG.autoDarkmode) {
window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change", e => {
if (saveToLocal.get("theme") !== undefined) return;
e.matches ? handleThemeChange("dark") : handleThemeChange("light");
});
}
// 欢迎语
GLOBAL_CONFIG.greetingBox && greetingInit();
// 51la统计&灵雀统计
GLOBAL_CONFIG.LA51 && statistics51aInit();
};
window.refreshFn = function () {
initAdjust();
themeColorMeta = document.querySelector('meta[name="theme-color"]');
pageHeaderEl = document.getElementById("page-header");
navMusicEl = document.getElementById("nav-music");
consoleEl = document.getElementById("console");
addDarkModeEventListener("console", ".darkmode_switchbutton");
if (GLOBAL_CONFIG_SITE.isPost) {
GLOBAL_CONFIG.noticeOutdate !== undefined && addPostOutdateNotice();
GLOBAL_CONFIG.relativeDate.post && relativeDate(document.querySelectorAll("#post-meta time"));
} else {
if (GLOBAL_CONFIG.relativeDate.homepage) {
relativeDate(document.querySelectorAll("#recent-posts time"));
} else if (GLOBAL_CONFIG.relativeDate.simplehomepage) {
relativeDate(document.querySelectorAll("#recent-posts time"), true);
}
GLOBAL_CONFIG.runtime && addRuntime();
addLastPushDate();
toggleCardCategory();
}
GLOBAL_CONFIG.diytitle && changeDocumentTitle();
scrollFnToDo();
GLOBAL_CONFIG_SITE.isHome && scrollDownInIndex();
addHighlightTool();
GLOBAL_CONFIG.isPhotoFigcaption && addPhotoFigcaption();
scrollFn();
// 刷新时第一次滚动百分比
window.scrollCollect && window.scrollCollect();
const $jgEle = document.querySelectorAll("#content-inner .fj-gallery");
$jgEle.length && runJustifiedGallery($jgEle);
runLightbox();
addTableWrap();
clickFnOfTagHide();
tabsFn();
switchComments();
document.getElementById("toggle-menu").addEventListener("click", () => {
sidebarFn.open();
});
// 如果当前页有评论就执行函数
if (document.getElementById("post-comment")) owoBig();
mouseleaveHomeCard();
coverColor();
listenToPageInputPress();
openMobileMenu();
// needRefresh
// nav中间的标题变化
document.getElementById("page-name").innerText = document.title.split(` | ${GLOBAL_CONFIG_SITE.configTitle}`)[0];
anzhiyu.initIndexEssay();
anzhiyu.changeTimeInEssay();
anzhiyu.removeBodyPaceClass();
anzhiyu.qrcodeCreate();
anzhiyu.changeTimeInAlbumDetail();
anzhiyu.reflashEssayWaterFall();
anzhiyu.sayhi();
anzhiyu.stopImgRightDrag();
anzhiyu.addNavBackgroundInit();
anzhiyu.setValueToBodyType();
anzhiyu.catalogActive();
anzhiyu.tagsPageActive();
anzhiyu.categoriesBarActive();
anzhiyu.topCategoriesBarScroll();
anzhiyu.switchRightClickMenuHotReview();
anzhiyu.getCustomPlayList();
anzhiyu.addEventListenerConsoleMusicList(false);
anzhiyu.initPaginationObserver();
setTimeout(() => {
setInputFocusListener();
if (typeof addFriendLinksInFooter === "function") {
addFriendLinksInFooter();
}
}, 200);
};
refreshFn();
unRefreshFn();
});