2026-01-11 19:48:02 +08:00
|
|
|
|
/*!
|
|
|
|
|
|
* Argon 主题核心 JavaScript
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
2026-01-16 14:14:51 +08:00
|
|
|
|
// ========== 兼容性修复 ==========
|
|
|
|
|
|
// 确保 Prism 和 autoloader 存在
|
2026-01-11 19:48:02 +08:00
|
|
|
|
if (typeof window.Prism === 'undefined') {
|
|
|
|
|
|
window.Prism = {
|
|
|
|
|
|
highlightAll: function() {},
|
|
|
|
|
|
highlightElement: function() {},
|
|
|
|
|
|
plugins: {}
|
|
|
|
|
|
};
|
|
|
|
|
|
}
|
|
|
|
|
|
if (typeof window.Prism.plugins === 'undefined') {
|
|
|
|
|
|
window.Prism.plugins = {};
|
|
|
|
|
|
}
|
|
|
|
|
|
if (typeof window.Prism.plugins.autoloader === 'undefined') {
|
|
|
|
|
|
window.Prism.plugins.autoloader = {
|
|
|
|
|
|
languages_path: '',
|
|
|
|
|
|
use_minified: true
|
|
|
|
|
|
};
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-01-16 14:14:51 +08:00
|
|
|
|
// 确保 Zoomify 存在
|
2026-01-11 19:48:02 +08:00
|
|
|
|
if (typeof window.Zoomify === 'undefined') {
|
|
|
|
|
|
window.Zoomify = function() {};
|
|
|
|
|
|
window.Zoomify.DEFAULTS = {};
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-01-16 14:14:51 +08:00
|
|
|
|
// 确保 jQuery 插件存在
|
2026-01-11 19:48:02 +08:00
|
|
|
|
if (typeof jQuery !== 'undefined') {
|
|
|
|
|
|
(function($) {
|
2026-01-16 14:14:51 +08:00
|
|
|
|
// 确保 zoomify 插件存在
|
2026-01-11 19:48:02 +08:00
|
|
|
|
if (typeof $.fn.zoomify === 'undefined') {
|
|
|
|
|
|
$.fn.zoomify = function() { return this; };
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-01-16 14:14:51 +08:00
|
|
|
|
// 确保 fancybox 存在
|
2026-01-11 19:48:02 +08:00
|
|
|
|
if (typeof $.fancybox === 'undefined') {
|
|
|
|
|
|
$.fancybox = {
|
|
|
|
|
|
defaults: {
|
|
|
|
|
|
transitionEffect: 'slide',
|
|
|
|
|
|
buttons: [],
|
|
|
|
|
|
lang: 'zh_CN',
|
|
|
|
|
|
i18n: {}
|
|
|
|
|
|
},
|
|
|
|
|
|
open: function() {},
|
|
|
|
|
|
close: function() {}
|
|
|
|
|
|
};
|
|
|
|
|
|
}
|
|
|
|
|
|
if (typeof $.fancybox.defaults === 'undefined') {
|
|
|
|
|
|
$.fancybox.defaults = {
|
|
|
|
|
|
transitionEffect: 'slide',
|
|
|
|
|
|
buttons: [],
|
|
|
|
|
|
lang: 'zh_CN',
|
|
|
|
|
|
i18n: {}
|
|
|
|
|
|
};
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-01-16 14:14:51 +08:00
|
|
|
|
// 确保 pjax 存在
|
2026-01-11 19:48:02 +08:00
|
|
|
|
if (typeof $.pjax === 'undefined') {
|
|
|
|
|
|
$.pjax = function() {};
|
|
|
|
|
|
$.pjax.defaults = {
|
|
|
|
|
|
timeout: 10000,
|
|
|
|
|
|
container: [],
|
|
|
|
|
|
fragment: []
|
|
|
|
|
|
};
|
|
|
|
|
|
}
|
|
|
|
|
|
if (typeof $.pjax.defaults === 'undefined') {
|
|
|
|
|
|
$.pjax.defaults = {
|
|
|
|
|
|
timeout: 10000,
|
|
|
|
|
|
container: [],
|
|
|
|
|
|
fragment: []
|
|
|
|
|
|
};
|
|
|
|
|
|
}
|
|
|
|
|
|
})(jQuery);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-01-16 14:14:51 +08:00
|
|
|
|
// ========== 原有代码 ==========
|
|
|
|
|
|
if (typeof(argonConfig) == "undefined"){
|
2026-01-11 19:48:02 +08:00
|
|
|
|
var argonConfig = {};
|
|
|
|
|
|
}
|
2026-01-16 14:14:51 +08:00
|
|
|
|
if (typeof(argonConfig.wp_path) == "undefined"){
|
2026-01-11 19:48:02 +08:00
|
|
|
|
argonConfig.wp_path = "/";
|
|
|
|
|
|
}
|
2026-01-16 14:14:51 +08:00
|
|
|
|
/*Cookies 操作*/
|
2026-01-11 19:48:02 +08:00
|
|
|
|
function setCookie(cname, cvalue, exdays) {
|
|
|
|
|
|
let d = new Date();
|
|
|
|
|
|
d.setTime(d.getTime() + (exdays * 24 * 60 * 60 * 1000));
|
|
|
|
|
|
let expires = "expires=" + d.toUTCString();
|
|
|
|
|
|
document.cookie = cname + "=" + cvalue + ";" + expires + ";path=/";
|
|
|
|
|
|
}
|
|
|
|
|
|
function getCookie(cname) {
|
|
|
|
|
|
let name = cname + "=";
|
|
|
|
|
|
let decodedCookie = decodeURIComponent(document.cookie);
|
|
|
|
|
|
let ca = decodedCookie.split(';');
|
|
|
|
|
|
for (let i = 0; i < ca.length; i++) {
|
|
|
|
|
|
let c = ca[i];
|
2026-01-16 14:14:51 +08:00
|
|
|
|
while (c.charAt(0) == ' ') {
|
2026-01-11 19:48:02 +08:00
|
|
|
|
c = c.substring(1);
|
|
|
|
|
|
}
|
2026-01-16 14:14:51 +08:00
|
|
|
|
if (c.indexOf(name) == 0) {
|
2026-01-11 19:48:02 +08:00
|
|
|
|
return c.substring(name.length, c.length);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
return "";
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-01-16 14:14:51 +08:00
|
|
|
|
/*多语言支持*/
|
2026-01-11 19:48:02 +08:00
|
|
|
|
var translation = {};
|
|
|
|
|
|
translation['en_US'] = {
|
|
|
|
|
|
"确定": "OK",
|
|
|
|
|
|
"清除": "Clear",
|
|
|
|
|
|
"恢复博客默认": "Set To Default",
|
|
|
|
|
|
"评论内容不能为空": "Comment content cannot be empty",
|
|
|
|
|
|
"昵称不能为空": "Name cannot be empty",
|
|
|
|
|
|
"邮箱或 QQ 号格式错误": "Incorrect email or QQ format",
|
|
|
|
|
|
"邮箱格式错误": "Incorrect email format",
|
|
|
|
|
|
"网站格式错误 (不是 http(s):// 开头)": "Website URL format error",
|
|
|
|
|
|
"验证码未输入": "CAPTCHA cannot be empty",
|
|
|
|
|
|
"验证码格式错误": "Incorrect CAPTCHA format",
|
|
|
|
|
|
"请完成验证码验证": "Please complete CAPTCHA verification",
|
|
|
|
|
|
"评论格式错误": "Comment format error",
|
|
|
|
|
|
"发送中": "Sending",
|
|
|
|
|
|
"正在发送": "Sending",
|
|
|
|
|
|
"评论正在发送中...": "Comment is sending...",
|
|
|
|
|
|
"发送": "Send",
|
|
|
|
|
|
"评论发送失败": "Comment failed",
|
|
|
|
|
|
"发送成功": "Success",
|
|
|
|
|
|
"您的评论已发送": "Your comment has been sent",
|
|
|
|
|
|
"评论": "Comments",
|
|
|
|
|
|
"未知原因": "Unknown Error",
|
|
|
|
|
|
"编辑中": "Editing",
|
|
|
|
|
|
"正在编辑": "Editing",
|
|
|
|
|
|
"评论正在编辑中...": "Comment is being edited...",
|
|
|
|
|
|
"编辑": "Edit",
|
|
|
|
|
|
"评论编辑失败": "Comment editing failed",
|
|
|
|
|
|
"已编辑": "Edited",
|
|
|
|
|
|
"编辑成功": "Success",
|
|
|
|
|
|
"您的评论已编辑": "Your comment has been edited",
|
|
|
|
|
|
"评论 #": "Comment #",
|
|
|
|
|
|
"的编辑记录": "- Edit History",
|
|
|
|
|
|
"加载失败": "Failed to load",
|
|
|
|
|
|
"展开": "Show",
|
|
|
|
|
|
"没有更多了": "No more comments",
|
|
|
|
|
|
"找不到该 Repo": "Can't find the repository",
|
|
|
|
|
|
"获取 Repo 信息失败": "Failed to get repository information",
|
|
|
|
|
|
"点赞失败": "Vote failed",
|
|
|
|
|
|
"Hitokoto 获取失败": "Failed to get Hitokoto",
|
|
|
|
|
|
"复制成功": "Copied",
|
|
|
|
|
|
"代码已复制到剪贴板": "Code has been copied to the clipboard",
|
|
|
|
|
|
"复制失败": "Failed",
|
|
|
|
|
|
"请手动复制代码": "Please copy the code manually",
|
|
|
|
|
|
"刚刚": "Now",
|
|
|
|
|
|
"分钟前": "minutes ago",
|
|
|
|
|
|
"小时前": "hours ago",
|
|
|
|
|
|
"昨天": "Yesterday",
|
|
|
|
|
|
"前天": "The day before yesterday",
|
|
|
|
|
|
"天前": "days ago",
|
|
|
|
|
|
"隐藏行号": "Hide Line Numbers",
|
|
|
|
|
|
"显示行号": "Show Line Numbers",
|
|
|
|
|
|
"开启折行": "Enable Break Line",
|
|
|
|
|
|
"关闭折行": "Disable Break Line",
|
|
|
|
|
|
"复制": "Copy",
|
|
|
|
|
|
"全屏": "Fullscreen",
|
|
|
|
|
|
"退出全屏": "Exit Fullscreen",
|
|
|
|
|
|
"置顶评论": "Pin Comment",
|
|
|
|
|
|
"取消置顶评论": "Unpin Comment",
|
|
|
|
|
|
"是否要取消置顶评论 #": "Do you want to unpin the comment #",
|
|
|
|
|
|
"是否要置顶评论 #": "Do you want to pin the comment #",
|
|
|
|
|
|
"确认": "Confirm",
|
|
|
|
|
|
"取消": "取消",
|
|
|
|
|
|
"置顶": "Pin",
|
|
|
|
|
|
"取消置顶": "Unpin",
|
|
|
|
|
|
"置顶成功": "Pinned",
|
|
|
|
|
|
"取消置顶成功": "Unpinned",
|
|
|
|
|
|
"该评论已置顶": "The comment has been pinned",
|
|
|
|
|
|
"该评论已取消置顶": "The comment has been unpinned",
|
|
|
|
|
|
"置顶失败": "Failed to pin",
|
|
|
|
|
|
"取消置顶失败": "Failed to unpin",
|
|
|
|
|
|
};
|
|
|
|
|
|
translation['ru_RU'] = {
|
|
|
|
|
|
"确定": "ОК",
|
|
|
|
|
|
"清除": "Очистить",
|
|
|
|
|
|
"恢复博客默认": "Восстановить по умолчанию",
|
|
|
|
|
|
"评论内容不能为空": "Содержимое комментария не может быть пустым",
|
|
|
|
|
|
"昵称不能为空": "Имя не может быть пустым",
|
|
|
|
|
|
"邮箱或 QQ 号格式错误": "Неверный формат электронной почты или QQ",
|
|
|
|
|
|
"邮箱格式错误": "Неправильный формат электронной почты",
|
|
|
|
|
|
"网站格式错误 (不是 http(s):// 开头)": "Сайт ошибка формата URL-адреса ",
|
|
|
|
|
|
"验证码未输入": "Вы не решили капчу",
|
|
|
|
|
|
"验证码格式错误": "Ошибка проверки капчи",
|
|
|
|
|
|
"评论格式错误": "Неправильный формат комментария",
|
|
|
|
|
|
"发送中": "Отправка",
|
|
|
|
|
|
"正在发送": "Отправка",
|
|
|
|
|
|
"评论正在发送中...": "Комментарий отправляется...",
|
|
|
|
|
|
"发送": "Отправить",
|
|
|
|
|
|
"评论发送失败": "Не удалось отправить комментарий",
|
|
|
|
|
|
"发送成功": "Комментарий отправлен",
|
|
|
|
|
|
"您的评论已发送": "Ваш комментарий был отправлен",
|
|
|
|
|
|
"评论": "Комментарии",
|
|
|
|
|
|
"未知原因": "Неизвестная ошибка",
|
|
|
|
|
|
"编辑中": "Редактируется",
|
|
|
|
|
|
"正在编辑": "Редактируется",
|
|
|
|
|
|
"评论正在编辑中...": "Комментарий редактируется",
|
|
|
|
|
|
"编辑": "Редактировать",
|
|
|
|
|
|
"评论编辑失败": "Не удалось отредактировать комментарий",
|
|
|
|
|
|
"已编辑": "Изменено",
|
|
|
|
|
|
"编辑成功": "Успешно",
|
|
|
|
|
|
"您的评论已编辑": "Ваш комментарий был изменен",
|
|
|
|
|
|
"评论 #": "Комментарий #",
|
|
|
|
|
|
"的编辑记录": "- История изменений",
|
|
|
|
|
|
"加载失败": "Ошибка загрузки",
|
|
|
|
|
|
"展开": "Показать",
|
|
|
|
|
|
"没有更多了": "Комментариев больше нет",
|
|
|
|
|
|
"找不到该 Repo": "Невозможно найти репозиторий",
|
|
|
|
|
|
"获取 Repo 信息失败": "Неудалось получить информацию репозитория",
|
|
|
|
|
|
"点赞失败": "Ошибка голосования",
|
|
|
|
|
|
"Hitokoto 获取失败": "Проблемы с вызовом Hitokoto",
|
|
|
|
|
|
"复制成功": "Скопировано",
|
|
|
|
|
|
"代码已复制到剪贴板": "Код скопирован в буфер обмена",
|
|
|
|
|
|
"复制失败": "Неудалось",
|
|
|
|
|
|
"请手动复制代码": "Скопируйте код вручную",
|
|
|
|
|
|
"刚刚": "Сейчас",
|
|
|
|
|
|
"分钟前": "минут назад",
|
|
|
|
|
|
"小时前": "часов назад",
|
|
|
|
|
|
"昨天": "Вчера",
|
|
|
|
|
|
"前天": "Позавчера",
|
|
|
|
|
|
"天前": "дней назад",
|
|
|
|
|
|
"隐藏行号": "Скрыть номера строк",
|
|
|
|
|
|
"显示行号": "Показать номера строк",
|
|
|
|
|
|
"开启折行": "Включить перенос строк",
|
|
|
|
|
|
"关闭折行": "Выключить перенос строк",
|
|
|
|
|
|
"复制": "Скопировать",
|
|
|
|
|
|
"全屏": "Полноэкранный режим",
|
|
|
|
|
|
"退出全屏": "Выход из полноэкранного режима",
|
|
|
|
|
|
};
|
|
|
|
|
|
translation['zh_TW'] = {
|
|
|
|
|
|
"确定": "確定",
|
|
|
|
|
|
"清除": "清除",
|
|
|
|
|
|
"恢复博客默认": "恢復博客默認",
|
|
|
|
|
|
"评论内容不能为空": "評論內容不能為空",
|
|
|
|
|
|
"昵称不能为空": "昵稱不能為空",
|
|
|
|
|
|
"邮箱或 QQ 号格式错误": "郵箱或 QQ 號格式錯誤",
|
|
|
|
|
|
"邮箱格式错误": "郵箱格式錯誤",
|
|
|
|
|
|
"网站格式错误 (不是 http(s):// 开头)": "網站格式錯誤 (不是 http(s):// 開頭)",
|
|
|
|
|
|
"验证码未输入": "驗證碼未輸入",
|
|
|
|
|
|
"验证码格式错误": "驗證碼格式錯誤",
|
|
|
|
|
|
"评论格式错误": "評論格式錯誤",
|
|
|
|
|
|
"发送中": "發送中",
|
|
|
|
|
|
"正在发送": "正在發送",
|
|
|
|
|
|
"评论正在发送中...": "評論正在發送中...",
|
|
|
|
|
|
"发送": "發送",
|
|
|
|
|
|
"评论发送失败": "評論發送失敗",
|
|
|
|
|
|
"发送成功": "發送成功",
|
|
|
|
|
|
"您的评论已发送": "您的評論已發送",
|
|
|
|
|
|
"评论": "評論",
|
|
|
|
|
|
"未知原因": "未知原因",
|
|
|
|
|
|
"编辑中": "編輯中",
|
|
|
|
|
|
"正在编辑": "正在編輯",
|
|
|
|
|
|
"评论正在编辑中...": "評論正在編輯中...",
|
|
|
|
|
|
"编辑": "編輯",
|
|
|
|
|
|
"评论编辑失败": "評論編輯失敗",
|
|
|
|
|
|
"已编辑": "已編輯",
|
|
|
|
|
|
"编辑成功": "編輯成功",
|
|
|
|
|
|
"您的评论已编辑": "您的評論已編輯",
|
|
|
|
|
|
"评论 #": "評論 #",
|
|
|
|
|
|
"的编辑记录": "的編輯記錄",
|
|
|
|
|
|
"加载失败": "加載失敗",
|
|
|
|
|
|
"展开": "展開",
|
|
|
|
|
|
"没有更多了": "沒有更多了",
|
|
|
|
|
|
"找不到该 Repo": "找不到該 Repo",
|
|
|
|
|
|
"获取 Repo 信息失败": "獲取 Repo 信息失敗",
|
|
|
|
|
|
"点赞失败": "點贊失敗",
|
|
|
|
|
|
"Hitokoto 获取失败": "Hitokoto 獲取失敗",
|
|
|
|
|
|
"复制成功": "復制成功",
|
|
|
|
|
|
"代码已复制到剪贴板": "代碼已復制到剪貼板",
|
|
|
|
|
|
"复制失败": "復制失敗",
|
|
|
|
|
|
"请手动复制代码": "請手動復制代碼",
|
|
|
|
|
|
"刚刚": "剛剛",
|
|
|
|
|
|
"分钟前": "分鐘前",
|
|
|
|
|
|
"小时前": "小時前",
|
|
|
|
|
|
"昨天": "昨天",
|
|
|
|
|
|
"前天": "前天",
|
|
|
|
|
|
"天前": "天前",
|
|
|
|
|
|
"隐藏行号": "隱藏行號",
|
|
|
|
|
|
"显示行号": "顯示行號",
|
|
|
|
|
|
"开启折行": "開啟折行",
|
|
|
|
|
|
"关闭折行": "關閉折行",
|
|
|
|
|
|
"复制": "復制",
|
|
|
|
|
|
"全屏": "全屏",
|
|
|
|
|
|
"退出全屏": "退出全屏"
|
|
|
|
|
|
};
|
|
|
|
|
|
function __(text){
|
|
|
|
|
|
let lang = argonConfig.language;
|
2026-01-16 14:14:51 +08:00
|
|
|
|
if (typeof(translation[lang]) == "undefined"){
|
2026-01-11 19:48:02 +08:00
|
|
|
|
return text;
|
|
|
|
|
|
}
|
2026-01-16 14:14:51 +08:00
|
|
|
|
if (typeof(translation[lang][text]) == "undefined"){
|
2026-01-11 19:48:02 +08:00
|
|
|
|
return text;
|
|
|
|
|
|
}
|
|
|
|
|
|
return translation[lang][text];
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-01-16 14:14:51 +08:00
|
|
|
|
/*根据滚动高度改变顶栏透明度*/
|
2026-01-11 19:48:02 +08:00
|
|
|
|
!function(){
|
|
|
|
|
|
let toolbar = document.getElementById("navbar-main");
|
|
|
|
|
|
let $bannerContainer = $("#banner_container");
|
|
|
|
|
|
let $content = $("#content");
|
|
|
|
|
|
|
|
|
|
|
|
let startTransitionHeight;
|
|
|
|
|
|
let endTransitionHeight;
|
|
|
|
|
|
let maxOpacity = 0.85;
|
|
|
|
|
|
|
|
|
|
|
|
startTransitionHeight = $bannerContainer.offset().top - 75;
|
|
|
|
|
|
endTransitionHeight = $content.offset().top - 75;
|
|
|
|
|
|
|
|
|
|
|
|
$(window).resize(function(){
|
|
|
|
|
|
startTransitionHeight = $bannerContainer.offset().top - 75;
|
|
|
|
|
|
endTransitionHeight = $content.offset().top - 75;
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
function changeToolbarTransparency(){
|
|
|
|
|
|
let scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
|
|
|
|
|
|
if (scrollTop < startTransitionHeight){
|
|
|
|
|
|
toolbar.style.setProperty('background-color', 'rgba(var(--toolbar-color), 0)', 'important');
|
|
|
|
|
|
toolbar.style.setProperty('box-shadow', 'none');
|
|
|
|
|
|
if (argonConfig.toolbar_blur){
|
|
|
|
|
|
toolbar.style.setProperty('backdrop-filter', 'blur(0px)');
|
|
|
|
|
|
}
|
|
|
|
|
|
toolbar.classList.add("navbar-ontop");
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
if (scrollTop > endTransitionHeight){
|
|
|
|
|
|
toolbar.style.setProperty('background-color', 'rgba(var(--toolbar-color), ' + maxOpacity + ')', 'important');
|
|
|
|
|
|
toolbar.style.setProperty('box-shadow', '');
|
|
|
|
|
|
if (argonConfig.toolbar_blur){
|
|
|
|
|
|
toolbar.style.setProperty('backdrop-filter', 'blur(16px)');
|
|
|
|
|
|
}
|
|
|
|
|
|
toolbar.classList.remove("navbar-ontop");
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
let transparency = (scrollTop - startTransitionHeight) / (endTransitionHeight - startTransitionHeight) * maxOpacity;
|
|
|
|
|
|
toolbar.style.setProperty('background-color', 'rgba(var(--toolbar-color), ' + transparency, 'important');
|
|
|
|
|
|
toolbar.style.setProperty('box-shadow', '');
|
|
|
|
|
|
if (argonConfig.toolbar_blur){
|
|
|
|
|
|
if ((scrollTop - startTransitionHeight) / (endTransitionHeight - startTransitionHeight) > 0.3){
|
|
|
|
|
|
toolbar.style.setProperty('backdrop-filter', 'blur(16px)');
|
|
|
|
|
|
}else{
|
|
|
|
|
|
toolbar.style.setProperty('backdrop-filter', 'blur(0px)');
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
toolbar.classList.remove("navbar-ontop");
|
|
|
|
|
|
}
|
|
|
|
|
|
function changeToolbarOnTopClass(){
|
|
|
|
|
|
let scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
|
|
|
|
|
|
if (scrollTop < 30){
|
|
|
|
|
|
toolbar.classList.add("navbar-no-blur");
|
|
|
|
|
|
}else{
|
|
|
|
|
|
toolbar.classList.remove("navbar-no-blur");
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
if ($("html").hasClass("no-banner")) {
|
|
|
|
|
|
changeToolbarOnTopClass();
|
|
|
|
|
|
document.addEventListener("scroll", changeToolbarOnTopClass, {passive: true});
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
2026-01-16 14:14:51 +08:00
|
|
|
|
if (argonConfig.headroom == "absolute") {
|
2026-01-11 19:48:02 +08:00
|
|
|
|
toolbar.classList.add("navbar-ontop");
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
if ($("html").hasClass("toolbar-blur")) {
|
|
|
|
|
|
argonConfig.toolbar_blur = true;
|
|
|
|
|
|
maxOpacity = 0.65;
|
|
|
|
|
|
}else{
|
|
|
|
|
|
argonConfig.toolbar_blur = false;
|
|
|
|
|
|
}
|
|
|
|
|
|
changeToolbarTransparency();
|
|
|
|
|
|
document.addEventListener("scroll", changeToolbarTransparency, {passive: true});
|
|
|
|
|
|
}();
|
|
|
|
|
|
|
2026-01-16 14:14:51 +08:00
|
|
|
|
/*搜索*/
|
2026-01-11 19:48:02 +08:00
|
|
|
|
function searchPosts(word){
|
|
|
|
|
|
if ($(".search-result").length > 0){
|
|
|
|
|
|
let url = new URL(window.location.href);
|
|
|
|
|
|
url.searchParams.set("s", word);
|
|
|
|
|
|
$.pjax({
|
|
|
|
|
|
url: url.href
|
|
|
|
|
|
});
|
|
|
|
|
|
}else{
|
|
|
|
|
|
$.pjax({
|
|
|
|
|
|
url: argonConfig.wp_path + "?s=" + encodeURI(word)
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
/*顶栏搜索*/
|
|
|
|
|
|
$(document).on("click" , "#navbar_search_input_container" , function(){
|
|
|
|
|
|
$(this).addClass("open");
|
|
|
|
|
|
$("#navbar_search_input").focus();
|
|
|
|
|
|
});
|
|
|
|
|
|
$(document).on("blur" , "#navbar_search_input_container" , function(){
|
|
|
|
|
|
// 如果有文字则保持has-text类
|
|
|
|
|
|
if ($("#navbar_search_input").val().trim() !== "") {
|
|
|
|
|
|
$(this).addClass("has-text");
|
|
|
|
|
|
} else {
|
|
|
|
|
|
$(this).removeClass("has-text");
|
|
|
|
|
|
}
|
|
|
|
|
|
$(this).removeClass("open");
|
|
|
|
|
|
});
|
|
|
|
|
|
// 监听输入变化来切换has-text类
|
|
|
|
|
|
$(document).on("input" , "#navbar_search_input" , function(){
|
2026-01-16 14:14:51 +08:00
|
|
|
|
var container = $("#navbar_search_input_container");
|
2026-01-11 19:48:02 +08:00
|
|
|
|
if ($(this).val().trim() !== "") {
|
|
|
|
|
|
container.addClass("has-text");
|
|
|
|
|
|
} else {
|
|
|
|
|
|
container.removeClass("has-text");
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
$(document).on("keydown" , "#navbar_search_input_container #navbar_search_input" , function(e){
|
2026-01-16 14:14:51 +08:00
|
|
|
|
if (e.keyCode != 13){
|
2026-01-11 19:48:02 +08:00
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
let word = $(this).val();
|
2026-01-16 14:14:51 +08:00
|
|
|
|
if (word == ""){
|
2026-01-11 19:48:02 +08:00
|
|
|
|
$("#navbar_search_input_container").blur();
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
let scrolltop = $(document).scrollTop();
|
|
|
|
|
|
searchPosts(word);
|
|
|
|
|
|
});
|
|
|
|
|
|
/*顶栏搜索 (Mobile)*/
|
|
|
|
|
|
$(document).on("keydown" , "#navbar_search_input_mobile" , function(e){
|
2026-01-16 14:14:51 +08:00
|
|
|
|
if (e.keyCode != 13){
|
2026-01-11 19:48:02 +08:00
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
let word = $(this).val();
|
|
|
|
|
|
$("#navbar_global .collapse-close button").click();
|
2026-01-16 14:14:51 +08:00
|
|
|
|
if (word == ""){
|
2026-01-11 19:48:02 +08:00
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
let scrolltop = $(document).scrollTop();
|
|
|
|
|
|
searchPosts(word);
|
|
|
|
|
|
});
|
|
|
|
|
|
/*侧栏搜索*/
|
|
|
|
|
|
$(document).on("click" , "#leftbar_search_container" , function(){
|
|
|
|
|
|
$(".leftbar-search-button").addClass("open");
|
|
|
|
|
|
$("#leftbar_search_input").removeAttr("readonly").focus();
|
|
|
|
|
|
$("#leftbar_search_input").focus();
|
|
|
|
|
|
$("#leftbar_search_input").select();
|
|
|
|
|
|
return false;
|
|
|
|
|
|
});
|
|
|
|
|
|
$(document).on("blur" , "#leftbar_search_container" , function(){
|
|
|
|
|
|
$(".leftbar-search-button").removeClass("open");
|
|
|
|
|
|
$("#leftbar_search_input").attr("readonly", "readonly");
|
|
|
|
|
|
});
|
|
|
|
|
|
$(document).on("keydown" , "#leftbar_search_input" , function(e){
|
2026-01-16 14:14:51 +08:00
|
|
|
|
if (e.keyCode != 13){
|
2026-01-11 19:48:02 +08:00
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
let word = $(this).val();
|
2026-01-16 14:14:51 +08:00
|
|
|
|
if (word == ""){
|
2026-01-11 19:48:02 +08:00
|
|
|
|
$("#leftbar_search_container").blur();
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
$("html").removeClass("leftbar-opened");
|
|
|
|
|
|
searchPosts(word);
|
|
|
|
|
|
});
|
|
|
|
|
|
/*搜索过滤器*/
|
|
|
|
|
|
$(document).on("change" , ".search-filter" , function(e){
|
|
|
|
|
|
if (pjaxLoading){
|
|
|
|
|
|
$(this).prop("checked", !$(this).prop("checked"));
|
|
|
|
|
|
e.preventDefault();
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
pjaxLoading = true;
|
|
|
|
|
|
let postTypes = [];
|
|
|
|
|
|
$(".search-filter:checked").each(function(){
|
|
|
|
|
|
postTypes.push($(this).attr("name"));
|
|
|
|
|
|
});
|
2026-01-16 14:14:51 +08:00
|
|
|
|
if (postTypes.length == 0){
|
2026-01-11 19:48:02 +08:00
|
|
|
|
postTypes = ["none"];
|
|
|
|
|
|
}
|
|
|
|
|
|
let url = new URL(document.location.href);
|
|
|
|
|
|
url.searchParams.set("post_type", postTypes.join(","));
|
|
|
|
|
|
url.pathname = url.pathname.replace(/\/page\/\d+$/, '');
|
|
|
|
|
|
$.pjax({
|
|
|
|
|
|
url: url.href
|
|
|
|
|
|
});
|
|
|
|
|
|
});
|
|
|
|
|
|
|
2026-01-16 14:14:51 +08:00
|
|
|
|
/*左侧栏随页面滚动浮动*/
|
2026-01-11 19:48:02 +08:00
|
|
|
|
!function(){
|
2026-01-16 14:14:51 +08:00
|
|
|
|
if ($("#leftbar").length == 0){
|
2026-01-11 19:48:02 +08:00
|
|
|
|
let contentOffsetTop = $('#content').offset().top;
|
|
|
|
|
|
function changeLeftbarStickyStatusWithoutSidebar(){
|
|
|
|
|
|
let scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
|
|
|
|
|
|
if( contentOffsetTop - 10 - scrollTop <= 20 ){
|
|
|
|
|
|
document.body.classList.add('leftbar-can-headroom');
|
|
|
|
|
|
}else{
|
|
|
|
|
|
document.body.classList.remove('leftbar-can-headroom');
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
changeLeftbarStickyStatusWithoutSidebar();
|
|
|
|
|
|
document.addEventListener("scroll", changeLeftbarStickyStatusWithoutSidebar, {passive: true});
|
|
|
|
|
|
$(window).resize(function(){
|
|
|
|
|
|
contentOffsetTop = $('#content').offset().top;
|
|
|
|
|
|
changeLeftbarStickyStatusWithoutSidebar();
|
|
|
|
|
|
});
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
let $leftbarPart1 = $('#leftbar_part1');
|
|
|
|
|
|
let $leftbarPart2 = $('#leftbar_part2');
|
|
|
|
|
|
let leftbarPart1 = document.getElementById('leftbar_part1');
|
|
|
|
|
|
let leftbarPart2 = document.getElementById('leftbar_part2');
|
|
|
|
|
|
let leftbarPart3 = document.getElementById('leftbar_part3');
|
|
|
|
|
|
|
|
|
|
|
|
let part1OffsetTop = $('#leftbar_part1').offset().top;
|
|
|
|
|
|
let part1OuterHeight = $('#leftbar_part1').outerHeight();
|
|
|
|
|
|
|
|
|
|
|
|
function changeLeftbarStickyStatus(){
|
|
|
|
|
|
let scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
|
2026-01-16 14:14:51 +08:00
|
|
|
|
if( part1OffsetTop + part1OuterHeight + 10 - scrollTop <= (argonConfig.headroom != "absolute" ? 90 : 18) ){
|
2026-01-11 19:48:02 +08:00
|
|
|
|
//滚动条在页面中间浮动状态
|
|
|
|
|
|
leftbarPart2.classList.add('sticky');
|
|
|
|
|
|
if (leftbarPart3) {
|
|
|
|
|
|
leftbarPart3.classList.add('sticky');
|
2026-01-16 15:08:07 +08:00
|
|
|
|
// 计算可用空间并分配给 part2 和 part3
|
|
|
|
|
|
let viewportHeight = window.innerHeight;
|
|
|
|
|
|
let topOffset = argonConfig.headroom !== 'absolute' ? 90 : 20;
|
|
|
|
|
|
let availableHeight = viewportHeight - topOffset - 20; // 20px 底部边距
|
|
|
|
|
|
|
|
|
|
|
|
// 获取 part3 的自然高度(不受限制时的高度)
|
|
|
|
|
|
leftbarPart3.style.maxHeight = 'none';
|
|
|
|
|
|
let part3NaturalHeight = leftbarPart3.scrollHeight;
|
|
|
|
|
|
leftbarPart3.style.maxHeight = '';
|
|
|
|
|
|
|
|
|
|
|
|
// 最小高度限制
|
|
|
|
|
|
let minPart2Height = 150;
|
|
|
|
|
|
let minPart3Height = 100;
|
|
|
|
|
|
|
|
|
|
|
|
// 计算分配
|
|
|
|
|
|
let part2Height, part3MaxHeight;
|
|
|
|
|
|
if (part3NaturalHeight + minPart2Height <= availableHeight) {
|
|
|
|
|
|
// part3 可以完全显示
|
|
|
|
|
|
part3MaxHeight = part3NaturalHeight;
|
|
|
|
|
|
part2Height = availableHeight - part3NaturalHeight - 10;
|
|
|
|
|
|
} else {
|
|
|
|
|
|
// 需要按比例分配,part2 占 60%,part3 占 40%
|
|
|
|
|
|
part2Height = Math.max(minPart2Height, availableHeight * 0.6);
|
|
|
|
|
|
part3MaxHeight = Math.max(minPart3Height, availableHeight - part2Height - 10);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-01-11 19:48:02 +08:00
|
|
|
|
document.documentElement.style.setProperty('--leftbar-part2-height', leftbarPart2.offsetHeight + 10 + 'px');
|
2026-01-16 15:08:07 +08:00
|
|
|
|
document.documentElement.style.setProperty('--leftbar-part3-height', part3MaxHeight + 'px');
|
|
|
|
|
|
document.documentElement.style.setProperty('--leftbar-part3-max-height', part3MaxHeight + 'px');
|
2026-01-11 19:48:02 +08:00
|
|
|
|
}
|
|
|
|
|
|
}else{
|
|
|
|
|
|
//滚动条在顶部 不浮动状态
|
|
|
|
|
|
leftbarPart2.classList.remove('sticky');
|
|
|
|
|
|
if (leftbarPart3) leftbarPart3.classList.remove('sticky');
|
|
|
|
|
|
}
|
|
|
|
|
|
if( part1OffsetTop + part1OuterHeight + 10 - scrollTop <= 20 ){//侧栏下部分是否可以随 Headroom 一起向上移动
|
|
|
|
|
|
document.body.classList.add('leftbar-can-headroom');
|
|
|
|
|
|
}else{
|
|
|
|
|
|
document.body.classList.remove('leftbar-can-headroom');
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
changeLeftbarStickyStatus();
|
|
|
|
|
|
document.addEventListener("scroll", changeLeftbarStickyStatus, {passive: true});
|
|
|
|
|
|
$(window).resize(function(){
|
|
|
|
|
|
part1OffsetTop = $leftbarPart1.offset().top;
|
|
|
|
|
|
part1OuterHeight = $leftbarPart1.outerHeight();
|
|
|
|
|
|
changeLeftbarStickyStatus();
|
|
|
|
|
|
});
|
|
|
|
|
|
new MutationObserver(function(){
|
|
|
|
|
|
part1OffsetTop = $leftbarPart1.offset().top;
|
|
|
|
|
|
part1OuterHeight = $leftbarPart1.outerHeight();
|
|
|
|
|
|
changeLeftbarStickyStatus();
|
|
|
|
|
|
}).observe(leftbarPart1, {attributes: true, childList: true, subtree: true});
|
|
|
|
|
|
}();
|
|
|
|
|
|
|
|
|
|
|
|
/*Headroom*/
|
2026-01-16 14:14:51 +08:00
|
|
|
|
if (argonConfig.headroom == "true"){
|
2026-01-11 19:48:02 +08:00
|
|
|
|
var headroom = new Headroom(document.querySelector("body"),{
|
|
|
|
|
|
"tolerance" : {
|
|
|
|
|
|
up : 0,
|
|
|
|
|
|
down : 0
|
|
|
|
|
|
},
|
|
|
|
|
|
"offset": 0,
|
|
|
|
|
|
"classes": {
|
|
|
|
|
|
"initial": "with-headroom",
|
|
|
|
|
|
"pinned": "headroom---pinned",
|
|
|
|
|
|
"unpinned": "headroom---unpinned",
|
|
|
|
|
|
"top": "headroom---top",
|
|
|
|
|
|
"notTop": "headroom---not-top",
|
|
|
|
|
|
"bottom": "headroom---bottom",
|
|
|
|
|
|
"notBottom": "headroom---not-bottom",
|
|
|
|
|
|
"frozen": "headroom---frozen"
|
|
|
|
|
|
}
|
|
|
|
|
|
}).init();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-01-16 14:14:51 +08:00
|
|
|
|
/*瀑布流布局*/
|
2026-01-11 19:48:02 +08:00
|
|
|
|
function waterflowInit() {
|
2026-01-16 14:14:51 +08:00
|
|
|
|
if (argonConfig.waterflow_columns == "1") {
|
2026-01-11 19:48:02 +08:00
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
$("#main.article-list img").each(function(index, ele){
|
|
|
|
|
|
ele.onload = function(){
|
|
|
|
|
|
waterflowInit();
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
let columns;
|
2026-01-16 14:14:51 +08:00
|
|
|
|
if (argonConfig.waterflow_columns == "2and3") {
|
2026-01-11 19:48:02 +08:00
|
|
|
|
if ($("#main").outerWidth() > 1000) {
|
|
|
|
|
|
columns = 3;
|
|
|
|
|
|
} else {
|
|
|
|
|
|
columns = 2;
|
|
|
|
|
|
}
|
|
|
|
|
|
}else{
|
|
|
|
|
|
columns = parseInt(argonConfig.waterflow_columns);
|
|
|
|
|
|
}
|
2026-01-16 14:14:51 +08:00
|
|
|
|
if ($("#main").outerWidth() < 650 && columns == 2) {
|
2026-01-11 19:48:02 +08:00
|
|
|
|
columns = 1;
|
2026-01-16 14:14:51 +08:00
|
|
|
|
}else if ($("#main").outerWidth() < 800 && columns == 3) {
|
2026-01-11 19:48:02 +08:00
|
|
|
|
columns = 1;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
let heights = [0, 0, 0];
|
|
|
|
|
|
function getMinHeightPosition(){
|
|
|
|
|
|
let res = 0, minn = 2147483647;
|
2026-01-16 14:14:51 +08:00
|
|
|
|
for (var i = 0; i < columns; i++) {
|
2026-01-11 19:48:02 +08:00
|
|
|
|
if (heights[i] < minn) {
|
|
|
|
|
|
minn = heights[i];
|
|
|
|
|
|
res = i;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
return res;
|
|
|
|
|
|
}
|
|
|
|
|
|
function getMaxHeight(){
|
|
|
|
|
|
let res = 0;
|
|
|
|
|
|
for (let i in heights) {
|
|
|
|
|
|
res = Math.max(res, heights[i]);
|
|
|
|
|
|
}
|
|
|
|
|
|
return res;
|
|
|
|
|
|
}
|
|
|
|
|
|
$("#primary").css("transition", "none")
|
|
|
|
|
|
.addClass("waterflow");
|
|
|
|
|
|
let $container = $("#main.article-list");
|
|
|
|
|
|
if (!$container.length){
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
let $items = $container.find("article.post:not(.no-results), .shuoshuo-preview-container");
|
|
|
|
|
|
columns = Math.max(Math.min(columns, $items.length), 1);
|
2026-01-16 14:14:51 +08:00
|
|
|
|
if (columns == 1) {
|
2026-01-11 19:48:02 +08:00
|
|
|
|
$container.removeClass("waterflow");
|
|
|
|
|
|
$items.css("transition", "").css("position", "").css("width", "").css("top", "").css("left", "").css("margin", "");
|
|
|
|
|
|
$(".waterflow-placeholder").remove();
|
|
|
|
|
|
}else{
|
|
|
|
|
|
$container.addClass("waterflow");
|
|
|
|
|
|
$items.each(function(index, item) {
|
|
|
|
|
|
let $item = $(item);
|
|
|
|
|
|
$item.css("transition", "none")
|
|
|
|
|
|
.css("position", "absolute")
|
|
|
|
|
|
.css("width", "calc(" + (100 / columns) + "% - " + (10 * (columns - 1) / columns) + "px)").css("margin", 0);
|
|
|
|
|
|
let itemHeight = $item.outerHeight() + 10;
|
|
|
|
|
|
let pos = getMinHeightPosition();
|
|
|
|
|
|
$item.css("top", heights[getMinHeightPosition()] + "px")
|
|
|
|
|
|
.css("left", (pos * $item.outerWidth() + 10 * pos) + "px");
|
|
|
|
|
|
heights[pos] += itemHeight;
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
if ($(".waterflow-placeholder").length) {
|
|
|
|
|
|
$(".waterflow-placeholder").css("height", getMaxHeight() + "px");
|
|
|
|
|
|
}else{
|
|
|
|
|
|
$container.prepend("<div class='waterflow-placeholder' style='height: " + getMaxHeight() +"px;'></div>");
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
waterflowInit();
|
2026-01-16 14:14:51 +08:00
|
|
|
|
if (argonConfig.waterflow_columns != "1") {
|
2026-01-11 19:48:02 +08:00
|
|
|
|
$(window).resize(function(){
|
|
|
|
|
|
waterflowInit();
|
|
|
|
|
|
});
|
|
|
|
|
|
new MutationObserver(function(mutations, observer){
|
|
|
|
|
|
waterflowInit();
|
|
|
|
|
|
}).observe(document.querySelector("#primary"), {
|
|
|
|
|
|
'childList': true
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*移动端文章列表布局切换*/
|
|
|
|
|
|
!function(){
|
2026-01-16 14:14:51 +08:00
|
|
|
|
var mobileLayout = argonConfig.article_list_layout_mobile || "1";
|
|
|
|
|
|
var isMobile = window.innerWidth <= 900;
|
2026-01-11 19:48:02 +08:00
|
|
|
|
|
|
|
|
|
|
function applyMobileLayout() {
|
2026-01-16 14:14:51 +08:00
|
|
|
|
var nowMobile = window.innerWidth <= 900;
|
2026-01-11 19:48:02 +08:00
|
|
|
|
if (nowMobile) {
|
|
|
|
|
|
$("html").addClass("mobile-layout-" + mobileLayout);
|
|
|
|
|
|
} else {
|
|
|
|
|
|
$("html").removeClass("mobile-layout-1 mobile-layout-2 mobile-layout-3");
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
applyMobileLayout();
|
|
|
|
|
|
$(window).resize(function(){
|
|
|
|
|
|
applyMobileLayout();
|
|
|
|
|
|
});
|
|
|
|
|
|
}();
|
|
|
|
|
|
|
2026-01-16 14:14:51 +08:00
|
|
|
|
/*浮动按钮栏相关 (回顶等)*/
|
2026-01-11 19:48:02 +08:00
|
|
|
|
!function(){
|
2026-01-12 17:00:21 +08:00
|
|
|
|
// 确保 DOM 和 jQuery 已加载
|
|
|
|
|
|
if (typeof jQuery === 'undefined') {
|
|
|
|
|
|
console.warn('jQuery not loaded, retrying...');
|
|
|
|
|
|
setTimeout(arguments.callee, 50);
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-01-11 19:48:02 +08:00
|
|
|
|
let $fabtns = $('#float_action_buttons');
|
2026-01-12 17:00:21 +08:00
|
|
|
|
if ($fabtns.length === 0) {
|
|
|
|
|
|
console.warn('Float action buttons not found, retrying...');
|
|
|
|
|
|
setTimeout(arguments.callee, 50);
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-01-11 19:48:02 +08:00
|
|
|
|
let $backToTopBtn = $('#fabtn_back_to_top');
|
|
|
|
|
|
let $toggleSidesBtn = $('#fabtn_toggle_sides');
|
|
|
|
|
|
let $toggleDarkmode = $('#fabtn_toggle_darkmode');
|
|
|
|
|
|
let $toggleAmoledMode = $('#blog_setting_toggle_darkmode_and_amoledarkmode');
|
|
|
|
|
|
let $toggleBlogSettings = $('#fabtn_toggle_blog_settings_popup');
|
|
|
|
|
|
let $goToComment = $('#fabtn_go_to_comment');
|
|
|
|
|
|
|
|
|
|
|
|
let $readingProgressBtn = $('#fabtn_reading_progress');
|
|
|
|
|
|
let $readingProgressBar = $('#fabtn_reading_progress_bar');
|
|
|
|
|
|
let $readingProgressDetails = $('#fabtn_reading_progress_details');
|
|
|
|
|
|
|
|
|
|
|
|
$backToTopBtn.on("click" , function(){
|
|
|
|
|
|
$("body,html").stop().animate({
|
|
|
|
|
|
scrollTop: 0
|
2026-01-12 16:45:09 +08:00
|
|
|
|
}, 600);
|
2026-01-11 19:48:02 +08:00
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
$toggleDarkmode.on("click" , function(){
|
|
|
|
|
|
toggleDarkmode();
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
$toggleAmoledMode.on("click" , function(){
|
|
|
|
|
|
toggleAmoledDarkMode();
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
if ($("#post_comment").length > 0){
|
2026-01-12 16:56:10 +08:00
|
|
|
|
$("#fabtn_go_to_comment").removeClass("fabtn-hidden");
|
2026-01-11 19:48:02 +08:00
|
|
|
|
}else{
|
2026-01-12 16:56:10 +08:00
|
|
|
|
$("#fabtn_go_to_comment").addClass("fabtn-hidden");
|
2026-01-11 19:48:02 +08:00
|
|
|
|
}
|
|
|
|
|
|
$goToComment.on("click" , function(){
|
2026-01-16 14:14:51 +08:00
|
|
|
|
var commentsArea = $("#comments");
|
|
|
|
|
|
var postCommentArea = $("#post_comment");
|
|
|
|
|
|
var wasCollapsed = commentsArea.hasClass("comments-collapsed");
|
|
|
|
|
|
var toggleBtn = $("#comments_toggle");
|
2026-01-12 13:10:27 +08:00
|
|
|
|
|
2026-01-12 15:03:11 +08:00
|
|
|
|
if (wasCollapsed && toggleBtn.length > 0) {
|
2026-01-12 13:10:27 +08:00
|
|
|
|
// 折叠状态:先滚动到评论切换按钮位置,再展开
|
2026-01-12 15:03:11 +08:00
|
|
|
|
$("body,html").stop().animate({
|
|
|
|
|
|
scrollTop: toggleBtn.offset().top - 80
|
|
|
|
|
|
}, 600);
|
|
|
|
|
|
toggleBtn.find("i").removeClass("fa-comments").addClass("fa-comment-o");
|
|
|
|
|
|
toggleBtn.find(".btn-inner--text").text("折叠评论");
|
|
|
|
|
|
toggleBtn.addClass("expanded");
|
2026-01-12 13:10:27 +08:00
|
|
|
|
commentsArea.removeClass("comments-collapsed");
|
|
|
|
|
|
setTimeout(function() {
|
|
|
|
|
|
postCommentArea.removeClass("comments-collapsed");
|
|
|
|
|
|
$("#post_comment_content").focus();
|
|
|
|
|
|
}, 150);
|
|
|
|
|
|
} else {
|
2026-01-12 15:03:11 +08:00
|
|
|
|
// 已展开或无切换按钮:直接滚动到评论框
|
|
|
|
|
|
$("body,html").stop().animate({
|
|
|
|
|
|
scrollTop: postCommentArea.offset().top - 80
|
|
|
|
|
|
}, 600);
|
2026-01-12 13:10:27 +08:00
|
|
|
|
$("#post_comment_content").focus();
|
2026-01-11 19:48:02 +08:00
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
|
2026-01-16 14:14:51 +08:00
|
|
|
|
if (localStorage['Argon_fabs_Floating_Status'] == "left"){
|
2026-01-11 19:48:02 +08:00
|
|
|
|
$fabtns.addClass("fabtns-float-left");
|
|
|
|
|
|
}
|
|
|
|
|
|
$toggleSidesBtn.on("click" , function(){
|
|
|
|
|
|
$fabtns.addClass("fabtns-unloaded");
|
|
|
|
|
|
setTimeout(function(){
|
|
|
|
|
|
$fabtns.toggleClass("fabtns-float-left");
|
|
|
|
|
|
if ($fabtns.hasClass("fabtns-float-left")){
|
|
|
|
|
|
localStorage['Argon_fabs_Floating_Status'] = "left";
|
|
|
|
|
|
}else{
|
|
|
|
|
|
localStorage['Argon_fabs_Floating_Status'] = "right";
|
|
|
|
|
|
}
|
|
|
|
|
|
$fabtns.removeClass("fabtns-unloaded");
|
|
|
|
|
|
} , 300);
|
|
|
|
|
|
});
|
|
|
|
|
|
//博客设置
|
|
|
|
|
|
$toggleBlogSettings.on("click" , function(){
|
|
|
|
|
|
$("#float_action_buttons").toggleClass("blog_settings_opened");
|
|
|
|
|
|
});
|
|
|
|
|
|
$("#close_blog_settings").on("click" , function(){
|
|
|
|
|
|
$("#float_action_buttons").removeClass("blog_settings_opened");
|
|
|
|
|
|
});
|
|
|
|
|
|
$("#blog_setting_darkmode_switch .custom-toggle-slider").on("click" , function(){
|
|
|
|
|
|
toggleDarkmode();
|
|
|
|
|
|
});
|
|
|
|
|
|
//字体
|
|
|
|
|
|
$("#blog_setting_font_sans_serif").on("click" , function(){
|
|
|
|
|
|
$("html").removeClass("use-serif");
|
|
|
|
|
|
localStorage['Argon_Use_Serif'] = "false";
|
|
|
|
|
|
});
|
|
|
|
|
|
$("#blog_setting_font_serif").on("click" , function(){
|
|
|
|
|
|
$("html").addClass("use-serif");
|
|
|
|
|
|
localStorage['Argon_Use_Serif'] = "true";
|
|
|
|
|
|
});
|
2026-01-16 14:14:51 +08:00
|
|
|
|
if (localStorage['Argon_Use_Serif'] == "true"){
|
2026-01-11 19:48:02 +08:00
|
|
|
|
$("html").addClass("use-serif");
|
2026-01-16 14:14:51 +08:00
|
|
|
|
}else if (localStorage['Argon_Use_Serif'] == "false"){
|
2026-01-11 19:48:02 +08:00
|
|
|
|
$("html").removeClass("use-serif");
|
|
|
|
|
|
}
|
|
|
|
|
|
//阴影
|
|
|
|
|
|
$("#blog_setting_shadow_small").on("click" , function(){
|
|
|
|
|
|
$("html").removeClass("use-big-shadow");
|
|
|
|
|
|
localStorage['Argon_Use_Big_Shadow'] = "false";
|
|
|
|
|
|
});
|
|
|
|
|
|
$("#blog_setting_shadow_big").on("click" , function(){
|
|
|
|
|
|
$("html").addClass("use-big-shadow");
|
|
|
|
|
|
localStorage['Argon_Use_Big_Shadow'] = "true";
|
|
|
|
|
|
});
|
2026-01-16 14:14:51 +08:00
|
|
|
|
if (localStorage['Argon_Use_Big_Shadow'] == "true"){
|
2026-01-11 19:48:02 +08:00
|
|
|
|
$("html").addClass("use-big-shadow");
|
2026-01-16 14:14:51 +08:00
|
|
|
|
}else if (localStorage['Argon_Use_Big_Shadow'] == "false"){
|
2026-01-11 19:48:02 +08:00
|
|
|
|
$("html").removeClass("use-big-shadow");
|
|
|
|
|
|
}
|
|
|
|
|
|
//滤镜
|
|
|
|
|
|
function setBlogFilter(name){
|
2026-01-16 14:14:51 +08:00
|
|
|
|
if (name == undefined || name == ""){
|
2026-01-11 19:48:02 +08:00
|
|
|
|
name = "off";
|
|
|
|
|
|
}
|
|
|
|
|
|
if (!$("html").hasClass("filter-" + name)){
|
|
|
|
|
|
$("html").removeClass("filter-sunset filter-darkness filter-grayscale");
|
2026-01-16 14:14:51 +08:00
|
|
|
|
if (name != "off"){
|
2026-01-11 19:48:02 +08:00
|
|
|
|
$("html").addClass("filter-" + name);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
$("#blog_setting_filters .blog-setting-filter-btn").removeClass("active");
|
|
|
|
|
|
$("#blog_setting_filters .blog-setting-filter-btn[filter-name='" + name + "']").addClass("active");
|
|
|
|
|
|
localStorage['Argon_Filter'] = name;
|
|
|
|
|
|
}
|
|
|
|
|
|
setBlogFilter(localStorage['Argon_Filter']);
|
|
|
|
|
|
$(".blog-setting-filter-btn").on("click" , function(){
|
|
|
|
|
|
setBlogFilter(this.getAttribute("filter-name"));
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
//UI 样式切换 (玻璃拟态/新拟态)
|
|
|
|
|
|
function setUIStyle(style){
|
2026-01-16 14:14:51 +08:00
|
|
|
|
if (style == undefined || style == ""){
|
2026-01-11 19:48:02 +08:00
|
|
|
|
style = "default";
|
|
|
|
|
|
}
|
|
|
|
|
|
$("html").removeClass("style-glass style-neumorphism");
|
2026-01-16 14:14:51 +08:00
|
|
|
|
if (style != "default"){
|
2026-01-11 19:48:02 +08:00
|
|
|
|
$("html").addClass("style-" + style);
|
|
|
|
|
|
}
|
|
|
|
|
|
$(".blog-setting-style-btn").removeClass("active");
|
|
|
|
|
|
$(".blog-setting-style-btn[style-name='" + style + "']").addClass("active");
|
|
|
|
|
|
localStorage['Argon_UI_Style'] = style;
|
|
|
|
|
|
}
|
|
|
|
|
|
setUIStyle(localStorage['Argon_UI_Style']);
|
|
|
|
|
|
$(".blog-setting-style-btn").on("click" , function(){
|
|
|
|
|
|
setUIStyle(this.getAttribute("style-name"));
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
let $window = $(window);
|
|
|
|
|
|
|
|
|
|
|
|
function changefabtnDisplayStatus(){
|
|
|
|
|
|
//阅读进度
|
|
|
|
|
|
function hideReadingProgress(){
|
|
|
|
|
|
$readingProgressBtn.addClass("fabtn-hidden");
|
|
|
|
|
|
}
|
|
|
|
|
|
function setReadingProgress(percent){
|
|
|
|
|
|
$readingProgressBtn.removeClass("fabtn-hidden");
|
|
|
|
|
|
$readingProgressDetails.html((percent * 100).toFixed(0) + "%");
|
|
|
|
|
|
$readingProgressBar.css("width" , (percent * 100).toFixed(0) + "%");
|
|
|
|
|
|
}
|
2026-01-16 14:14:51 +08:00
|
|
|
|
if ($("article.post.post-full").length == 0){
|
2026-01-11 19:48:02 +08:00
|
|
|
|
hideReadingProgress();
|
|
|
|
|
|
}else{
|
|
|
|
|
|
let a = $window.scrollTop() - ($("article.post.post-full").offset().top - 80);
|
|
|
|
|
|
let b = $("article.post.post-full").outerHeight() + 50 - $window.height();
|
|
|
|
|
|
if (b <= 0){
|
|
|
|
|
|
hideReadingProgress();
|
|
|
|
|
|
}else{
|
|
|
|
|
|
readingProgress = a / b;
|
|
|
|
|
|
if (isNaN(readingProgress) || readingProgress < 0 || readingProgress > 1){
|
|
|
|
|
|
hideReadingProgress();
|
|
|
|
|
|
}else{
|
|
|
|
|
|
setReadingProgress(readingProgress);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
//是否显示回顶
|
|
|
|
|
|
if ($(window).scrollTop() >= 400){
|
|
|
|
|
|
$backToTopBtn.removeClass("fabtn-hidden");
|
|
|
|
|
|
}else{
|
|
|
|
|
|
$backToTopBtn.addClass("fabtn-hidden");
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
changefabtnDisplayStatus();
|
|
|
|
|
|
$(window).scroll(function(){
|
|
|
|
|
|
changefabtnDisplayStatus();
|
|
|
|
|
|
});
|
|
|
|
|
|
$(window).resize(function(){
|
|
|
|
|
|
changefabtnDisplayStatus();
|
|
|
|
|
|
});
|
|
|
|
|
|
$fabtns.removeClass("fabtns-unloaded");
|
|
|
|
|
|
}();
|
|
|
|
|
|
|
|
|
|
|
|
/*卡片圆角大小调整*/
|
|
|
|
|
|
!function(){
|
|
|
|
|
|
function setCardRadius(radius, setcookie){
|
|
|
|
|
|
document.documentElement.style.setProperty('--card-radius', radius + "px");
|
|
|
|
|
|
if (setcookie){
|
|
|
|
|
|
setCookie("argon_card_radius", radius, 365);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
let slider = document.getElementById('blog_setting_card_radius');
|
|
|
|
|
|
noUiSlider.create(slider, {
|
|
|
|
|
|
start: [$("meta[name='theme-card-radius']").attr("content")],
|
|
|
|
|
|
step: 0.5,
|
|
|
|
|
|
connect: [true, false],
|
|
|
|
|
|
range: {
|
|
|
|
|
|
'min': [0],
|
|
|
|
|
|
'max': [30]
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
slider.noUiSlider.on('update', function (values){
|
|
|
|
|
|
let value = values[0];
|
|
|
|
|
|
setCardRadius(value, false);
|
|
|
|
|
|
});
|
|
|
|
|
|
slider.noUiSlider.on('set', function (values){
|
|
|
|
|
|
let value = values[0];
|
|
|
|
|
|
setCardRadius(value, true);
|
|
|
|
|
|
});
|
|
|
|
|
|
$(document).on("click" , "#blog_setting_card_radius_to_default" , function(){
|
|
|
|
|
|
slider.noUiSlider.set($("meta[name='theme-card-radius-origin']").attr("content"));
|
|
|
|
|
|
setCardRadius($("meta[name='theme-card-radius-origin']").attr("content"), false);
|
|
|
|
|
|
setCookie("argon_card_radius", $("meta[name='theme-card-radius-origin']").attr("content"), 0);
|
|
|
|
|
|
});
|
|
|
|
|
|
}();
|
|
|
|
|
|
|
2026-01-16 14:14:51 +08:00
|
|
|
|
/*评论区 & 发送评论*/
|
2026-01-11 19:48:02 +08:00
|
|
|
|
!function(){
|
2026-01-16 14:14:51 +08:00
|
|
|
|
//回复评论
|
2026-01-11 19:48:02 +08:00
|
|
|
|
let replying = false , replyID = 0;
|
|
|
|
|
|
function reply(commentID){
|
|
|
|
|
|
cancelEdit(false);
|
|
|
|
|
|
replying = true;
|
|
|
|
|
|
replyID = commentID;
|
2026-01-16 00:03:17 +08:00
|
|
|
|
let nameEl = $("#comment-" + commentID + " .comment-item-title > .comment-name")[0];
|
|
|
|
|
|
let textEl = $("#comment-" + commentID + " .comment-item-text")[0];
|
|
|
|
|
|
let sourceEl = $("#comment-" + commentID + " .comment-item-source")[0];
|
|
|
|
|
|
if (nameEl) {
|
|
|
|
|
|
$("#post_comment_reply_name").text(nameEl.textContent);
|
2026-01-11 19:48:02 +08:00
|
|
|
|
}
|
2026-01-16 00:03:17 +08:00
|
|
|
|
let preview = textEl ? textEl.textContent : '';
|
|
|
|
|
|
if (sourceEl && sourceEl.innerHTML !== '') {
|
|
|
|
|
|
preview = sourceEl.textContent;
|
|
|
|
|
|
}
|
|
|
|
|
|
$("#post_comment_reply_preview").text(preview);
|
2026-01-11 19:48:02 +08:00
|
|
|
|
if ($("#comment-" + commentID + " .comment-item-title .badge-private-comment").length > 0){
|
|
|
|
|
|
$("#post_comment").addClass("post-comment-force-privatemode-on");
|
|
|
|
|
|
}else{
|
|
|
|
|
|
$("#post_comment").addClass("post-comment-force-privatemode-off");
|
|
|
|
|
|
}
|
|
|
|
|
|
$("body,html").animate({
|
|
|
|
|
|
scrollTop: $('#post_comment').offset().top - 100
|
2026-01-12 00:15:20 +08:00
|
|
|
|
}, 400, 'easeOutCirc');
|
|
|
|
|
|
$('#post_comment_reply_info').slideDown(350, 'easeOutCirc');
|
2026-01-11 19:48:02 +08:00
|
|
|
|
setTimeout(function(){
|
|
|
|
|
|
$("#post_comment_content").focus();
|
2026-01-12 00:15:20 +08:00
|
|
|
|
}, 350);
|
2026-01-11 19:48:02 +08:00
|
|
|
|
}
|
|
|
|
|
|
function cancelReply(){
|
|
|
|
|
|
replying = false;
|
|
|
|
|
|
replyID = 0;
|
2026-01-12 00:15:20 +08:00
|
|
|
|
$('#post_comment_reply_info').slideUp(250, 'easeOutCirc');
|
2026-01-11 19:48:02 +08:00
|
|
|
|
$("#post_comment").removeClass("post-comment-force-privatemode-on post-comment-force-privatemode-off");
|
|
|
|
|
|
}
|
|
|
|
|
|
$(document).on("click" , ".comment-reply" , function(){
|
|
|
|
|
|
reply(this.getAttribute("data-id"));
|
|
|
|
|
|
});
|
|
|
|
|
|
$(document).on("click pjax:click" , "#post_comment_reply_cancel" , function(){
|
|
|
|
|
|
cancelReply();
|
|
|
|
|
|
});
|
|
|
|
|
|
$(document).on("pjax:click" , function(){
|
|
|
|
|
|
replying = false;
|
|
|
|
|
|
replyID = 0;
|
|
|
|
|
|
$('#post_comment_reply_info').css("display", "none");
|
|
|
|
|
|
$("#post_comment").removeClass("post-comment-force-privatemode-on post-comment-force-privatemode-off");
|
|
|
|
|
|
});
|
|
|
|
|
|
//编辑评论
|
|
|
|
|
|
let editing = false , editID = 0;
|
|
|
|
|
|
function edit(commentID){
|
|
|
|
|
|
cancelReply();
|
|
|
|
|
|
editing = true;
|
|
|
|
|
|
editID = commentID;
|
|
|
|
|
|
$('#post_comment').addClass("editing");
|
|
|
|
|
|
$("#post_comment_content").val($("#comment-" + editID + " .comment-item-source").text());
|
|
|
|
|
|
$("#post_comment_content").trigger("change");
|
2026-01-16 14:14:51 +08:00
|
|
|
|
if ($("#comment-" + editID).data("use-markdown") == true && document.getElementById("comment_post_use_markdown") != null){
|
2026-01-11 19:48:02 +08:00
|
|
|
|
document.getElementById("comment_post_use_markdown").checked = true;
|
|
|
|
|
|
}else{
|
|
|
|
|
|
document.getElementById("comment_post_use_markdown").checked = false;
|
|
|
|
|
|
}
|
|
|
|
|
|
if ($("#comment-" + commentID + " .comment-item-title .badge-private-comment").length > 0){
|
|
|
|
|
|
$("#post_comment").addClass("post-comment-force-privatemode-on");
|
|
|
|
|
|
}else{
|
|
|
|
|
|
$("#post_comment").addClass("post-comment-force-privatemode-off");
|
|
|
|
|
|
}
|
|
|
|
|
|
$("body,html").animate({
|
|
|
|
|
|
scrollTop: $('#post_comment').offset().top - 100
|
2026-01-12 00:15:20 +08:00
|
|
|
|
}, 400, 'easeOutCirc');
|
2026-01-11 19:48:02 +08:00
|
|
|
|
$("#post_comment_content").focus();
|
|
|
|
|
|
}
|
|
|
|
|
|
function cancelEdit(clear){
|
|
|
|
|
|
editing = false;
|
|
|
|
|
|
editID = 0;
|
|
|
|
|
|
$("#post_comment").removeClass("post-comment-force-privatemode-on post-comment-force-privatemode-off");
|
2026-01-16 14:14:51 +08:00
|
|
|
|
if (clear == true) $("#post_comment_content").val("");
|
2026-01-11 19:48:02 +08:00
|
|
|
|
$("#post_comment_content").trigger("change");
|
|
|
|
|
|
$('#post_comment').removeClass("editing");
|
|
|
|
|
|
}
|
|
|
|
|
|
$(document).on("click", ".comment-edit", function(){
|
|
|
|
|
|
edit(this.getAttribute("data-id"));
|
|
|
|
|
|
});
|
|
|
|
|
|
$(document).on("click", "#post_comment_edit_cancel", function(){
|
|
|
|
|
|
$("body,html").animate({
|
|
|
|
|
|
scrollTop: $("#comment-" + editID).offset().top - 100
|
|
|
|
|
|
}, 400, 'easeOutCirc');
|
|
|
|
|
|
cancelEdit(true);
|
|
|
|
|
|
});
|
|
|
|
|
|
$(document).on("pjax:click", function(){
|
|
|
|
|
|
cancelEdit(true);
|
|
|
|
|
|
});
|
|
|
|
|
|
$(document).on("click", ".comment-pin, .comment-unpin", function(){
|
|
|
|
|
|
toogleCommentPin(this.getAttribute("data-id"), !this.classList.contains("comment-pin"));
|
|
|
|
|
|
});
|
|
|
|
|
|
$(document).on("mouseenter", ".comment-parent-info", function(){
|
|
|
|
|
|
$("#comment-" + this.getAttribute("data-parent-id")).addClass("highlight");
|
|
|
|
|
|
});
|
|
|
|
|
|
$(document).on("mouseleave", ".comment-parent-info", function(){
|
|
|
|
|
|
$("#comment-" + this.getAttribute("data-parent-id")).removeClass("highlight");
|
|
|
|
|
|
});
|
|
|
|
|
|
//切换评论置顶状态
|
|
|
|
|
|
function toogleCommentPin(commentID, pinned){
|
|
|
|
|
|
$("#comment_pin_comfirm_dialog .modal-title").html(pinned ? __("取消置顶评论") : __("置顶评论"));
|
|
|
|
|
|
$("#comment_pin_comfirm_dialog .modal-body").html(pinned ? __("是否要取消置顶评论 #") + commentID + "?" : __("是否要置顶评论 #") + commentID + "?");
|
|
|
|
|
|
$("#comment_pin_comfirm_dialog .btn-comfirm").html(__("确认")).attr("disabled", false);
|
|
|
|
|
|
$("#comment_pin_comfirm_dialog .btn-dismiss").html(__("取消")).attr("disabled", false);
|
|
|
|
|
|
$("#comment_pin_comfirm_dialog .btn-comfirm").off("click").on("click", function(){
|
|
|
|
|
|
$("#comment_pin_comfirm_dialog .btn-dismiss").attr("disabled", true)
|
|
|
|
|
|
$("#comment_pin_comfirm_dialog .btn-comfirm").attr("disabled", true).prepend(__(`<span class="btn-inner--icon" style="margin-right: 10px;"><i class="fa fa-spinner fa-spin"></i></span>`));
|
|
|
|
|
|
$.ajax({
|
|
|
|
|
|
type: 'POST',
|
|
|
|
|
|
url: argonConfig.wp_path + "wp-admin/admin-ajax.php",
|
|
|
|
|
|
dataType : "json",
|
|
|
|
|
|
data: {
|
|
|
|
|
|
action: "pin_comment",
|
|
|
|
|
|
id: commentID,
|
|
|
|
|
|
pinned: pinned ? "false" : "true"
|
|
|
|
|
|
},
|
|
|
|
|
|
success: function(result){
|
|
|
|
|
|
$("#comment_pin_comfirm_dialog").modal('hide');
|
2026-01-16 14:14:51 +08:00
|
|
|
|
if (result.status == "success"){
|
2026-01-11 19:48:02 +08:00
|
|
|
|
if (pinned){
|
|
|
|
|
|
$("#comment-" + commentID + " .comment-name .badge-pinned").remove();
|
|
|
|
|
|
$("#comment-" + commentID + " .comment-unpin").removeClass("comment-unpin").addClass("comment-pin").html(__("置顶"));
|
|
|
|
|
|
}else{
|
|
|
|
|
|
$("#comment-" + commentID + " .comment-name").append(`<span class="badge badge-danger badge-pinned">${__("置顶")}</span>`);
|
|
|
|
|
|
$("#comment-" + commentID + " .comment-pin").removeClass("comment-pin").addClass("comment-unpin").html(__("取消置顶"));
|
|
|
|
|
|
}
|
|
|
|
|
|
iziToast.show({
|
|
|
|
|
|
title: pinned ? __("取消置顶成功") : __("置顶成功"),
|
|
|
|
|
|
message: pinned ? __("该评论已取消置顶") : __("该评论已置顶"),
|
|
|
|
|
|
class: 'shadow-sm',
|
|
|
|
|
|
position: 'topRight',
|
|
|
|
|
|
backgroundColor: '#2dce89',
|
|
|
|
|
|
titleColor: '#ffffff',
|
|
|
|
|
|
messageColor: '#ffffff',
|
|
|
|
|
|
iconColor: '#ffffff',
|
|
|
|
|
|
progressBarColor: '#ffffff',
|
|
|
|
|
|
icon: 'fa fa-check',
|
|
|
|
|
|
timeout: 5000
|
|
|
|
|
|
});
|
|
|
|
|
|
} else {
|
|
|
|
|
|
iziToast.show({
|
|
|
|
|
|
title: pinned ? __("取消置顶失败") : __("置顶失败"),
|
|
|
|
|
|
message: result.msg,
|
|
|
|
|
|
class: 'shadow-sm',
|
|
|
|
|
|
position: 'topRight',
|
|
|
|
|
|
backgroundColor: '#f5365c',
|
|
|
|
|
|
titleColor: '#ffffff',
|
|
|
|
|
|
messageColor: '#ffffff',
|
|
|
|
|
|
iconColor: '#ffffff',
|
|
|
|
|
|
progressBarColor: '#ffffff',
|
|
|
|
|
|
icon: 'fa fa-close',
|
|
|
|
|
|
timeout: 5000
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
error: function(result){
|
|
|
|
|
|
$("#comment_pin_comfirm_dialog").modal('hide');
|
|
|
|
|
|
iziToast.show({
|
|
|
|
|
|
title: pinned ? __("取消置顶失败") : __("置顶失败"),
|
|
|
|
|
|
message: __("未知错误"),
|
|
|
|
|
|
class: 'shadow-sm',
|
|
|
|
|
|
position: 'topRight',
|
|
|
|
|
|
backgroundColor: '#f5365c',
|
|
|
|
|
|
titleColor: '#ffffff',
|
|
|
|
|
|
messageColor: '#ffffff',
|
|
|
|
|
|
iconColor: '#ffffff',
|
|
|
|
|
|
progressBarColor: '#ffffff',
|
|
|
|
|
|
icon: 'fa fa-close',
|
|
|
|
|
|
timeout: 5000
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
});
|
|
|
|
|
|
$("#comment_pin_comfirm_dialog").modal(null);
|
|
|
|
|
|
}
|
2026-01-16 14:14:51 +08:00
|
|
|
|
|
2026-01-11 19:48:02 +08:00
|
|
|
|
|
2026-01-16 14:14:51 +08:00
|
|
|
|
//显示/隐藏额外输入框 (评论者网站)
|
2026-01-11 19:48:02 +08:00
|
|
|
|
$(document).on("click" , "#post_comment_toggle_extra_input" , function(){
|
|
|
|
|
|
$("#post_comment").toggleClass("show-extra-input");
|
|
|
|
|
|
if ($("#post_comment").hasClass("show-extra-input")){
|
2026-01-12 00:15:20 +08:00
|
|
|
|
$("#post_comment_extra_input").slideDown(250, 'easeOutCirc');
|
2026-01-11 19:48:02 +08:00
|
|
|
|
}else{
|
2026-01-12 00:15:20 +08:00
|
|
|
|
$("#post_comment_extra_input").slideUp(200, 'easeOutCirc');
|
2026-01-11 19:48:02 +08:00
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
//输入框细节
|
|
|
|
|
|
$(document).on("change input keydown keyup propertychange" , "#post_comment_content" , function(){
|
|
|
|
|
|
$("#post_comment_content_hidden")[0].innerText = $("#post_comment_content").val() + "\n";
|
|
|
|
|
|
$("#post_comment_content").css("height" , $("#post_comment_content_hidden").outerHeight());
|
|
|
|
|
|
});
|
|
|
|
|
|
$(document).on("focus" , "#post_comment_link" , function(){
|
|
|
|
|
|
$(".post-comment-link-container").addClass("active");
|
|
|
|
|
|
});
|
|
|
|
|
|
$(document).on("blur" , "#post_comment_link" , function(){
|
|
|
|
|
|
$(".post-comment-link-container").removeClass("active");
|
|
|
|
|
|
});
|
|
|
|
|
|
$(document).on("focus" , "#post_comment_captcha" , function(){
|
|
|
|
|
|
$(".post-comment-captcha-container").addClass("active");
|
|
|
|
|
|
});
|
|
|
|
|
|
$(document).on("blur" , "#post_comment_captcha" , function(){
|
|
|
|
|
|
$(".post-comment-captcha-container").removeClass("active");
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
//发送评论
|
|
|
|
|
|
window.postComment = function postComment(){
|
|
|
|
|
|
let commentContent = $("#post_comment_content").val();
|
|
|
|
|
|
let commentName = $("#post_comment_name").val();
|
|
|
|
|
|
let commentEmail = $("#post_comment_email").val();
|
|
|
|
|
|
let commentLink = $("#post_comment_link").val();
|
|
|
|
|
|
let commentCaptcha = $("#post_comment_captcha").val();
|
|
|
|
|
|
let useMarkdown = false;
|
|
|
|
|
|
let privateMode = false;
|
|
|
|
|
|
let mailNotice = false;
|
|
|
|
|
|
if ($("#comment_post_use_markdown").length > 0){
|
|
|
|
|
|
useMarkdown = $("#comment_post_use_markdown")[0].checked;
|
|
|
|
|
|
}
|
|
|
|
|
|
if ($("#comment_post_privatemode").length > 0){
|
|
|
|
|
|
privateMode = $("#comment_post_privatemode")[0].checked;
|
|
|
|
|
|
}
|
|
|
|
|
|
if ($("#comment_post_mailnotice").length > 0){
|
|
|
|
|
|
mailNotice = $("#comment_post_mailnotice")[0].checked;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
let postID = $("#post_comment_post_id").val();
|
|
|
|
|
|
let commentCaptchaSeed = $("#post_comment_captcha_seed").val();
|
|
|
|
|
|
|
|
|
|
|
|
let isError = false;
|
|
|
|
|
|
let errorMsg = "";
|
|
|
|
|
|
|
|
|
|
|
|
//检查表单合法性
|
|
|
|
|
|
if (commentContent.match(/^\s*$/)){
|
|
|
|
|
|
isError = true;
|
|
|
|
|
|
errorMsg += __("评论内容不能为空") + "</br>";
|
|
|
|
|
|
}
|
|
|
|
|
|
if (!$("#post_comment").hasClass("no-need-name-email")){
|
|
|
|
|
|
if (commentName.match(/^\s*$/)){
|
|
|
|
|
|
isError = true;
|
|
|
|
|
|
errorMsg += __("昵称不能为空") + "</br>";
|
|
|
|
|
|
}
|
|
|
|
|
|
if ($("#post_comment").hasClass("enable-qq-avatar")){
|
|
|
|
|
|
if (!(/^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/).test(commentEmail) && !(/^[1-9][0-9]{4,10}$/).test(commentEmail)){
|
|
|
|
|
|
isError = true;
|
|
|
|
|
|
errorMsg += __("邮箱或 QQ 号格式错误") + "</br>";
|
|
|
|
|
|
}
|
|
|
|
|
|
}else{
|
|
|
|
|
|
if (!(/^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/).test(commentEmail)){
|
|
|
|
|
|
isError = true;
|
|
|
|
|
|
errorMsg += __("邮箱格式错误") + "</br>";
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}else{
|
2026-01-16 14:14:51 +08:00
|
|
|
|
if (commentEmail.length || (document.getElementById("comment_post_mailnotice") != null && document.getElementById("comment_post_mailnotice").checked == true)){
|
2026-01-11 19:48:02 +08:00
|
|
|
|
if ($("#post_comment").hasClass("enable-qq-avatar")){
|
|
|
|
|
|
if (!(/^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/).test(commentEmail) && !(/^[1-9][0-9]{4,10}$/).test(commentEmail)){
|
|
|
|
|
|
isError = true;
|
|
|
|
|
|
errorMsg += __("邮箱或 QQ 号格式错误") + "</br>";
|
|
|
|
|
|
}
|
|
|
|
|
|
}else{
|
|
|
|
|
|
if (!(/^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/).test(commentEmail)){
|
|
|
|
|
|
isError = true;
|
|
|
|
|
|
errorMsg += __("邮箱格式错误") + "</br>";
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2026-01-16 14:14:51 +08:00
|
|
|
|
if (commentLink != "" && !(/https?:\/\//).test(commentLink)){
|
2026-01-11 19:48:02 +08:00
|
|
|
|
isError = true;
|
|
|
|
|
|
errorMsg += __("网站格式错误 (不是 http(s):// 开头)") + "</br>";
|
|
|
|
|
|
}
|
|
|
|
|
|
if (!$("#post_comment").hasClass("no-need-captcha")){
|
|
|
|
|
|
// 检查是否使用Geetest验证码
|
|
|
|
|
|
if ($("#geetest-captcha").length > 0) {
|
|
|
|
|
|
// 检查Geetest库是否加载成功
|
|
|
|
|
|
if (typeof window.geetestLoadFailed !== 'undefined' && window.geetestLoadFailed) {
|
|
|
|
|
|
isError = true;
|
|
|
|
|
|
errorMsg += __("验证码服务不可用,请刷新页面重试");
|
|
|
|
|
|
} else if (typeof window.geetestCaptcha === 'undefined' || !window.geetestCaptcha) {
|
|
|
|
|
|
isError = true;
|
|
|
|
|
|
errorMsg += __("验证码未初始化,请稍后重试");
|
|
|
|
|
|
} else {
|
|
|
|
|
|
// Geetest验证码检查
|
|
|
|
|
|
let lotNumber = $("#geetest_lot_number").val();
|
|
|
|
|
|
let captchaOutput = $("#geetest_captcha_output").val();
|
|
|
|
|
|
let passToken = $("#geetest_pass_token").val();
|
|
|
|
|
|
let genTime = $("#geetest_gen_time").val();
|
|
|
|
|
|
|
|
|
|
|
|
if (!lotNumber || !captchaOutput || !passToken || !genTime) {
|
|
|
|
|
|
isError = true;
|
|
|
|
|
|
errorMsg += __("请完成验证码验证");
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
} else {
|
|
|
|
|
|
// 原有的数学验证码检查
|
2026-01-16 14:14:51 +08:00
|
|
|
|
if (commentCaptcha == ""){
|
2026-01-11 19:48:02 +08:00
|
|
|
|
isError = true;
|
|
|
|
|
|
errorMsg += __("验证码未输入");
|
|
|
|
|
|
}
|
2026-01-16 14:14:51 +08:00
|
|
|
|
if (commentCaptcha != "" && !(/^[0-9]+$/).test(commentCaptcha)){
|
2026-01-11 19:48:02 +08:00
|
|
|
|
isError = true;
|
|
|
|
|
|
errorMsg += __("验证码格式错误");
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
if (isError){
|
|
|
|
|
|
// 确保按钮和表单元素处于可用状态
|
|
|
|
|
|
$("#post_comment_send").removeAttr("disabled");
|
|
|
|
|
|
$("#post_comment_content").removeAttr("disabled");
|
|
|
|
|
|
$("#post_comment_name").removeAttr("disabled");
|
|
|
|
|
|
$("#post_comment_email").removeAttr("disabled");
|
|
|
|
|
|
$("#post_comment_link").removeAttr("disabled");
|
|
|
|
|
|
$("#post_comment_captcha").removeAttr("disabled");
|
|
|
|
|
|
$("#post_comment_reply_cancel").removeAttr("disabled");
|
|
|
|
|
|
$("#post_comment").removeClass("sending");
|
|
|
|
|
|
$("#post_comment_send .btn-inner--icon.hide-on-comment-editing").html("<i class='fa fa-send'></i>");
|
|
|
|
|
|
$("#post_comment_send .btn-inner--text.hide-on-comment-editing").html(__("发送"));
|
|
|
|
|
|
|
|
|
|
|
|
iziToast.show({
|
|
|
|
|
|
title: __("评论格式错误"),
|
|
|
|
|
|
message: errorMsg,
|
|
|
|
|
|
class: 'shadow-sm',
|
|
|
|
|
|
position: 'topRight',
|
|
|
|
|
|
backgroundColor: '#f5365c',
|
|
|
|
|
|
titleColor: '#ffffff',
|
|
|
|
|
|
messageColor: '#ffffff',
|
|
|
|
|
|
iconColor: '#ffffff',
|
|
|
|
|
|
progressBarColor: '#ffffff',
|
|
|
|
|
|
icon: 'fa fa-close',
|
|
|
|
|
|
timeout: 5000
|
|
|
|
|
|
});
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//增加 disabled 属性和其他的表单提示
|
|
|
|
|
|
$("#post_comment").addClass("sending");
|
|
|
|
|
|
$("#post_comment_content").attr("disabled","disabled");
|
|
|
|
|
|
$("#post_comment_name").attr("disabled","disabled");
|
|
|
|
|
|
$("#post_comment_email").attr("disabled","disabled");
|
|
|
|
|
|
$("#post_comment_captcha").attr("disabled","disabled");
|
|
|
|
|
|
$("#post_comment_link").attr("disabled","disabled");
|
|
|
|
|
|
$("#post_comment_send").attr("disabled","disabled");
|
|
|
|
|
|
$("#post_comment_reply_cancel").attr("disabled","disabled");
|
|
|
|
|
|
$("#post_comment_send .btn-inner--icon.hide-on-comment-editing").html("<i class='fa fa-spinner fa-spin'></i>");
|
|
|
|
|
|
$("#post_comment_send .btn-inner--text.hide-on-comment-editing").html(__("发送中"));
|
|
|
|
|
|
|
|
|
|
|
|
iziToast.show({
|
|
|
|
|
|
title: __("正在发送"),
|
|
|
|
|
|
message: __("评论正在发送中..."),
|
|
|
|
|
|
class: 'shadow-sm iziToast-noprogressbar',
|
|
|
|
|
|
position: 'topRight',
|
|
|
|
|
|
backgroundColor: 'var(--themecolor)',
|
|
|
|
|
|
titleColor: '#ffffff',
|
|
|
|
|
|
messageColor: '#ffffff',
|
|
|
|
|
|
iconColor: '#ffffff',
|
|
|
|
|
|
progressBarColor: '#ffffff',
|
|
|
|
|
|
icon: 'fa fa-spinner fa-spin',
|
|
|
|
|
|
close: false,
|
|
|
|
|
|
timeout: 999999999
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
// 准备数据
|
2026-01-16 14:14:51 +08:00
|
|
|
|
var ajaxData = {
|
2026-01-11 19:48:02 +08:00
|
|
|
|
action: "ajax_post_comment",
|
|
|
|
|
|
comment: commentContent,
|
|
|
|
|
|
author: commentName,
|
|
|
|
|
|
email: commentEmail,
|
|
|
|
|
|
url: commentLink,
|
|
|
|
|
|
comment_post_ID: postID,
|
|
|
|
|
|
comment_parent: replyID,
|
|
|
|
|
|
"wp-comment-cookies-consent": "yes",
|
|
|
|
|
|
use_markdown: useMarkdown,
|
|
|
|
|
|
private_mode: privateMode,
|
|
|
|
|
|
enable_mailnotice: mailNotice,
|
|
|
|
|
|
argon_nonce: $("#argon_comment_nonce").val()
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
// 根据验证码类型添加相应参数
|
|
|
|
|
|
if ($("#geetest-captcha").length > 0) {
|
|
|
|
|
|
// 检查Geetest库加载状态
|
|
|
|
|
|
if (typeof window.geetestLoadFailed !== 'undefined' && window.geetestLoadFailed) {
|
|
|
|
|
|
// 重新启用按钮和表单元素
|
|
|
|
|
|
$("#post_comment").removeClass("sending");
|
|
|
|
|
|
$("#post_comment_content").removeAttr("disabled");
|
|
|
|
|
|
$("#post_comment_name").removeAttr("disabled");
|
|
|
|
|
|
$("#post_comment_email").removeAttr("disabled");
|
|
|
|
|
|
$("#post_comment_captcha").removeAttr("disabled");
|
|
|
|
|
|
$("#post_comment_link").removeAttr("disabled");
|
|
|
|
|
|
$("#post_comment_send").removeAttr("disabled");
|
|
|
|
|
|
$("#post_comment_reply_cancel").removeAttr("disabled");
|
|
|
|
|
|
$("#post_comment_send .btn-inner--icon.hide-on-comment-editing").html("<i class='fa fa-send'></i>");
|
|
|
|
|
|
$("#post_comment_send .btn-inner--text.hide-on-comment-editing").html(__("发送"));
|
|
|
|
|
|
|
|
|
|
|
|
setTimeout(function() {
|
|
|
|
|
|
try {
|
|
|
|
|
|
iziToast.destroy();
|
|
|
|
|
|
iziToast.error({
|
|
|
|
|
|
title: __('评论发送失败'),
|
|
|
|
|
|
message: __('验证码服务不可用,请刷新页面重试'),
|
|
|
|
|
|
position: 'topRight'
|
|
|
|
|
|
});
|
|
|
|
|
|
} catch (e) {
|
|
|
|
|
|
console.warn('iziToast error:', e);
|
|
|
|
|
|
}
|
|
|
|
|
|
}, 0);
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Geetest验证码参数 - 使用后端期望的参数名
|
|
|
|
|
|
ajaxData.lot_number = $("#geetest_lot_number").val();
|
|
|
|
|
|
ajaxData.captcha_output = $("#geetest_captcha_output").val();
|
|
|
|
|
|
ajaxData.pass_token = $("#geetest_pass_token").val();
|
|
|
|
|
|
ajaxData.gen_time = $("#geetest_gen_time").val();
|
|
|
|
|
|
|
|
|
|
|
|
// 验证Geetest参数是否完整
|
|
|
|
|
|
if (!ajaxData.lot_number || !ajaxData.captcha_output || !ajaxData.pass_token || !ajaxData.gen_time) {
|
|
|
|
|
|
// 重新启用按钮和表单元素
|
|
|
|
|
|
$("#post_comment").removeClass("sending");
|
|
|
|
|
|
$("#post_comment_content").removeAttr("disabled");
|
|
|
|
|
|
$("#post_comment_name").removeAttr("disabled");
|
|
|
|
|
|
$("#post_comment_email").removeAttr("disabled");
|
|
|
|
|
|
$("#post_comment_captcha").removeAttr("disabled");
|
|
|
|
|
|
$("#post_comment_link").removeAttr("disabled");
|
|
|
|
|
|
$("#post_comment_send").removeAttr("disabled");
|
|
|
|
|
|
$("#post_comment_reply_cancel").removeAttr("disabled");
|
|
|
|
|
|
$("#post_comment_send .btn-inner--icon.hide-on-comment-editing").html("<i class='fa fa-send'></i>");
|
|
|
|
|
|
$("#post_comment_send .btn-inner--text.hide-on-comment-editing").html(__("发送"));
|
|
|
|
|
|
|
|
|
|
|
|
// 使用 setTimeout 确保 iziToast 操作在下一个事件循环中执行
|
|
|
|
|
|
setTimeout(function() {
|
|
|
|
|
|
try {
|
|
|
|
|
|
iziToast.destroy();
|
|
|
|
|
|
iziToast.error({
|
|
|
|
|
|
title: __('评论发送失败'),
|
|
|
|
|
|
message: __('请完成验证码验证'),
|
|
|
|
|
|
position: 'topRight'
|
|
|
|
|
|
});
|
|
|
|
|
|
} catch (e) {
|
|
|
|
|
|
console.warn('iziToast error:', e);
|
|
|
|
|
|
}
|
|
|
|
|
|
}, 0);
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
} else {
|
|
|
|
|
|
// 原有数学验证码参数
|
|
|
|
|
|
ajaxData.comment_captcha_seed = commentCaptchaSeed;
|
|
|
|
|
|
ajaxData.comment_captcha = commentCaptcha;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
$.ajax({
|
|
|
|
|
|
type: 'POST',
|
|
|
|
|
|
url: argonConfig.wp_path + "wp-admin/admin-ajax.php",
|
|
|
|
|
|
dataType : "json",
|
|
|
|
|
|
data: ajaxData,
|
|
|
|
|
|
success: function(result){
|
|
|
|
|
|
$("#post_comment").removeClass("sending");
|
|
|
|
|
|
$("#post_comment_content").removeAttr("disabled");
|
|
|
|
|
|
$("#post_comment_name").removeAttr("disabled");
|
|
|
|
|
|
$("#post_comment_email").removeAttr("disabled");
|
|
|
|
|
|
$("#post_comment_link").removeAttr("disabled");
|
|
|
|
|
|
$("#post_comment_send").removeAttr("disabled");
|
|
|
|
|
|
$("#post_comment_reply_cancel").removeAttr("disabled");
|
|
|
|
|
|
$("#post_comment_send .btn-inner--icon.hide-on-comment-editing").html("<i class='fa fa-send'></i>");
|
|
|
|
|
|
$("#post_comment_send .btn-inner--text.hide-on-comment-editing").html(__("发送"));
|
|
|
|
|
|
$("#post_comment").removeClass("show-extra-input post-comment-force-privatemode-on post-comment-force-privatemode-off");
|
|
|
|
|
|
if (!result.isAdmin){
|
|
|
|
|
|
$("#post_comment_captcha").removeAttr("disabled");
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//判断是否有错误
|
2026-01-16 14:14:51 +08:00
|
|
|
|
if (result.status == "failed"){
|
2026-01-11 19:48:02 +08:00
|
|
|
|
// 使用 setTimeout 确保 iziToast 操作在下一个事件循环中执行
|
|
|
|
|
|
setTimeout(function() {
|
|
|
|
|
|
try {
|
|
|
|
|
|
iziToast.destroy();
|
|
|
|
|
|
iziToast.show({
|
|
|
|
|
|
title: __("评论发送失败"),
|
|
|
|
|
|
message: result.msg,
|
|
|
|
|
|
class: 'shadow-sm',
|
|
|
|
|
|
position: 'topRight',
|
|
|
|
|
|
backgroundColor: '#f5365c',
|
|
|
|
|
|
titleColor: '#ffffff',
|
|
|
|
|
|
messageColor: '#ffffff',
|
|
|
|
|
|
iconColor: '#ffffff',
|
|
|
|
|
|
progressBarColor: '#ffffff',
|
|
|
|
|
|
icon: 'fa fa-close',
|
|
|
|
|
|
timeout: 5000
|
|
|
|
|
|
});
|
|
|
|
|
|
} catch (e) {
|
|
|
|
|
|
console.warn('iziToast error:', e);
|
|
|
|
|
|
}
|
|
|
|
|
|
}, 0);
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//发送成功
|
|
|
|
|
|
// 使用 setTimeout 确保 iziToast 操作在下一个事件循环中执行
|
|
|
|
|
|
setTimeout(function() {
|
|
|
|
|
|
try {
|
|
|
|
|
|
iziToast.destroy();
|
|
|
|
|
|
iziToast.show({
|
|
|
|
|
|
title: __("发送成功"),
|
|
|
|
|
|
message: __("您的评论已发送"),
|
|
|
|
|
|
class: 'shadow-sm',
|
|
|
|
|
|
position: 'topRight',
|
|
|
|
|
|
backgroundColor: '#2dce89',
|
|
|
|
|
|
titleColor: '#ffffff',
|
|
|
|
|
|
messageColor: '#ffffff',
|
|
|
|
|
|
iconColor: '#ffffff',
|
|
|
|
|
|
progressBarColor: '#ffffff',
|
|
|
|
|
|
icon: 'fa fa-check',
|
|
|
|
|
|
timeout: 5000
|
|
|
|
|
|
});
|
|
|
|
|
|
//插入新评论
|
2026-01-12 15:17:52 +08:00
|
|
|
|
result.html = result.html.replace(/<(\/).noscript>/g, "");
|
2026-01-11 19:48:02 +08:00
|
|
|
|
let parentID = result.parentID;
|
2026-01-16 14:14:51 +08:00
|
|
|
|
if (parentID == "" || parentID == null){
|
2026-01-11 19:48:02 +08:00
|
|
|
|
parentID = 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
parentID = parseInt(parentID);
|
2026-01-16 14:14:51 +08:00
|
|
|
|
if (parentID == 0){
|
|
|
|
|
|
if ($("#comments > .card-body > ol.comment-list").length == 0){
|
2026-01-11 19:48:02 +08:00
|
|
|
|
$("#comments > .card-body").html("<h2 class='comments-title'><i class='fa fa-comments'></i> " + __("评论") + "</h2><ol class='comment-list'></ol>");
|
|
|
|
|
|
}
|
2026-01-16 14:14:51 +08:00
|
|
|
|
if (result.commentOrder == "asc"){
|
2026-01-11 19:48:02 +08:00
|
|
|
|
$("#comments > .card-body > ol.comment-list").append(result.html);
|
|
|
|
|
|
}else{
|
|
|
|
|
|
$("#comments > .card-body > ol.comment-list").prepend(result.html);
|
|
|
|
|
|
}
|
|
|
|
|
|
}else{
|
|
|
|
|
|
if ($("#comment-" + parentID + " + .comment-divider + li > ul.children").length > 0){
|
|
|
|
|
|
$("#comment-" + parentID + " + .comment-divider + li > ul.children").append(result.html);
|
|
|
|
|
|
}else{
|
|
|
|
|
|
$("#comment-" + parentID + " + .comment-divider").after("<li><ul class='children'>" + result.html + "</ul></li>");
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
calcHumanTimesOnPage();
|
|
|
|
|
|
//复位评论表单
|
|
|
|
|
|
cancelReply();
|
|
|
|
|
|
$("#post_comment_content").val("");
|
|
|
|
|
|
$("#post_comment_captcha_seed").val(result.newCaptchaSeed);
|
|
|
|
|
|
$("#post_comment_captcha + style").html(".post-comment-captcha-container:before{content: '" + result.newCaptcha + "';}");
|
|
|
|
|
|
$("#post_comment_captcha").val(result.newCaptchaAnswer);
|
|
|
|
|
|
|
|
|
|
|
|
// 清空Geetest验证码隐藏字段
|
|
|
|
|
|
if ($("#geetest-captcha").length > 0) {
|
|
|
|
|
|
$("#geetest_lot_number").val("");
|
|
|
|
|
|
$("#geetest_captcha_output").val("");
|
|
|
|
|
|
$("#geetest_pass_token").val("");
|
|
|
|
|
|
$("#geetest_gen_time").val("");
|
|
|
|
|
|
// 重置验证状态标志位
|
|
|
|
|
|
window.geetestVerified = false;
|
|
|
|
|
|
// 重置自动提交标记
|
|
|
|
|
|
window.geetestAutoSubmitting = false;
|
|
|
|
|
|
}
|
|
|
|
|
|
$("body,html").animate({
|
|
|
|
|
|
scrollTop: $("#comment-" + result.id).offset().top - 100
|
|
|
|
|
|
}, 500, 'easeOutExpo');
|
|
|
|
|
|
} catch (e) {
|
|
|
|
|
|
console.warn('Comment insertion error:', e);
|
|
|
|
|
|
}
|
|
|
|
|
|
}, 0);
|
|
|
|
|
|
},
|
|
|
|
|
|
error: function(result){
|
|
|
|
|
|
$("#post_comment").removeClass("sending");
|
|
|
|
|
|
$("#post_comment_content").removeAttr("disabled");
|
|
|
|
|
|
$("#post_comment_name").removeAttr("disabled");
|
|
|
|
|
|
$("#post_comment_email").removeAttr("disabled");
|
|
|
|
|
|
$("#post_comment_link").removeAttr("disabled");
|
|
|
|
|
|
$("#post_comment_send").removeAttr("disabled");
|
|
|
|
|
|
$("#post_comment_reply_cancel").removeAttr("disabled");
|
|
|
|
|
|
$("#post_comment_send .btn-inner--icon.hide-on-comment-editing").html("<i class='fa fa-send'></i>");
|
|
|
|
|
|
$("#post_comment_send .btn-inner--text.hide-on-comment-editing").html(__("发送"));
|
|
|
|
|
|
$("#post_comment").removeClass("show-extra-input post-comment-force-privatemode-on post-comment-force-privatemode-off");
|
|
|
|
|
|
if (!result.isAdmin){
|
|
|
|
|
|
$("#post_comment_captcha").removeAttr("disabled");
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 重置Geetest验证状态
|
|
|
|
|
|
window.geetestVerified = false;
|
|
|
|
|
|
// 重置自动提交标记
|
|
|
|
|
|
window.geetestAutoSubmitting = false;
|
|
|
|
|
|
$("#geetest_lot_number").val("");
|
|
|
|
|
|
$("#geetest_captcha_output").val("");
|
|
|
|
|
|
$("#geetest_pass_token").val("");
|
|
|
|
|
|
$("#geetest_gen_time").val("");
|
|
|
|
|
|
// 重置 Geetest 实例,确保下一次生成新的 pass_token
|
|
|
|
|
|
if (window.geetestCaptcha) {
|
|
|
|
|
|
try { window.geetestCaptcha.reset(); } catch (e) {}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 安全地处理 iziToast 操作,防止 time 属性错误
|
|
|
|
|
|
setTimeout(function() {
|
|
|
|
|
|
try {
|
|
|
|
|
|
iziToast.destroy();
|
|
|
|
|
|
iziToast.show({
|
|
|
|
|
|
title: __("评论发送失败"),
|
|
|
|
|
|
message: __("未知原因"),
|
|
|
|
|
|
class: 'shadow-sm',
|
|
|
|
|
|
position: 'topRight',
|
|
|
|
|
|
backgroundColor: '#f5365c',
|
|
|
|
|
|
titleColor: '#ffffff',
|
|
|
|
|
|
messageColor: '#ffffff',
|
|
|
|
|
|
iconColor: '#ffffff',
|
|
|
|
|
|
progressBarColor: '#ffffff',
|
|
|
|
|
|
icon: 'fa fa-close',
|
|
|
|
|
|
timeout: 5000
|
|
|
|
|
|
});
|
|
|
|
|
|
} catch (e) {
|
|
|
|
|
|
console.warn('iziToast operation error:', e);
|
|
|
|
|
|
}
|
|
|
|
|
|
}, 10);
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
//编辑评论
|
|
|
|
|
|
function editComment(){
|
|
|
|
|
|
let commentContent = $("#post_comment_content").val();
|
|
|
|
|
|
let isError = false;
|
|
|
|
|
|
let errorMsg = "";
|
|
|
|
|
|
if (commentContent.match(/^\s*$/)){
|
|
|
|
|
|
isError = true;
|
|
|
|
|
|
errorMsg += __("评论内容不能为空") + "</br>";
|
|
|
|
|
|
}
|
|
|
|
|
|
if (isError){
|
|
|
|
|
|
iziToast.show({
|
|
|
|
|
|
title: __("评论格式错误"),
|
|
|
|
|
|
message: errorMsg,
|
|
|
|
|
|
class: 'shadow-sm',
|
|
|
|
|
|
position: 'topRight',
|
|
|
|
|
|
backgroundColor: '#f5365c',
|
|
|
|
|
|
titleColor: '#ffffff',
|
|
|
|
|
|
messageColor: '#ffffff',
|
|
|
|
|
|
iconColor: '#ffffff',
|
|
|
|
|
|
progressBarColor: '#ffffff',
|
|
|
|
|
|
icon: 'fa fa-close',
|
|
|
|
|
|
timeout: 5000
|
|
|
|
|
|
});
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//增加 disabled 属性和其他的表单提示
|
|
|
|
|
|
$("#post_comment_content").attr("disabled","disabled");
|
|
|
|
|
|
$("#post_comment_send").attr("disabled","disabled");
|
|
|
|
|
|
$("#post_comment_edit_cancel").attr("disabled","disabled");
|
|
|
|
|
|
$("#post_comment_send .btn-inner--icon.hide-on-comment-not-editing").html("<i class='fa fa-spinner fa-spin'></i>");
|
|
|
|
|
|
$("#post_comment_send .btn-inner--text.hide-on-comment-not-editing").html(__("编辑中"));
|
|
|
|
|
|
|
|
|
|
|
|
iziToast.show({
|
|
|
|
|
|
title: __("正在编辑"),
|
|
|
|
|
|
message: __("评论正在编辑中..."),
|
|
|
|
|
|
class: 'shadow-sm iziToast-noprogressbar',
|
|
|
|
|
|
position: 'topRight',
|
|
|
|
|
|
backgroundColor: 'var(--themecolor)',
|
|
|
|
|
|
titleColor: '#ffffff',
|
|
|
|
|
|
messageColor: '#ffffff',
|
|
|
|
|
|
iconColor: '#ffffff',
|
|
|
|
|
|
progressBarColor: '#ffffff',
|
|
|
|
|
|
icon: 'fa fa-spinner fa-spin',
|
|
|
|
|
|
close: false,
|
|
|
|
|
|
timeout: 999999999
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
$.ajax({
|
|
|
|
|
|
type: 'POST',
|
|
|
|
|
|
url: argonConfig.wp_path + "wp-admin/admin-ajax.php",
|
|
|
|
|
|
dataType : "json",
|
|
|
|
|
|
data: {
|
|
|
|
|
|
action: "user_edit_comment",
|
|
|
|
|
|
comment: commentContent,
|
|
|
|
|
|
id: editID
|
|
|
|
|
|
},
|
|
|
|
|
|
success: function(result){
|
|
|
|
|
|
$("#post_comment_content").removeAttr("disabled");
|
|
|
|
|
|
$("#post_comment_send").removeAttr("disabled");
|
|
|
|
|
|
$("#post_comment_edit_cancel").removeAttr("disabled");
|
|
|
|
|
|
$("#post_comment_send .btn-inner--icon.hide-on-comment-not-editing").html("<i class='fa fa-pencil'></i>");
|
|
|
|
|
|
$("#post_comment_send .btn-inner--text.hide-on-comment-not-editing").html(__("编辑"));
|
|
|
|
|
|
|
|
|
|
|
|
//判断是否有错误
|
2026-01-16 14:14:51 +08:00
|
|
|
|
if (result.status == "failed"){
|
2026-01-11 19:48:02 +08:00
|
|
|
|
iziToast.destroy();
|
|
|
|
|
|
iziToast.show({
|
|
|
|
|
|
title: __("评论编辑失败"),
|
|
|
|
|
|
message: result.msg,
|
|
|
|
|
|
class: 'shadow-sm',
|
|
|
|
|
|
position: 'topRight',
|
|
|
|
|
|
backgroundColor: '#f5365c',
|
|
|
|
|
|
titleColor: '#ffffff',
|
|
|
|
|
|
messageColor: '#ffffff',
|
|
|
|
|
|
iconColor: '#ffffff',
|
|
|
|
|
|
progressBarColor: '#ffffff',
|
|
|
|
|
|
icon: 'fa fa-close',
|
|
|
|
|
|
timeout: 5000
|
|
|
|
|
|
});
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//发送成功,替换原评论
|
2026-01-12 15:17:52 +08:00
|
|
|
|
result.new_comment = result.new_comment.replace(/<(\/).noscript>/g, "");
|
2026-01-11 19:48:02 +08:00
|
|
|
|
$("#comment-" + editID + " .comment-item-text").html(result.new_comment);
|
|
|
|
|
|
$("#comment-" + editID + " .comment-item-source").html(result.new_comment_source);
|
2026-01-16 14:14:51 +08:00
|
|
|
|
if ($("#comment-" + editID + " .comment-info .comment-edited").length == 0){
|
2026-01-11 19:48:02 +08:00
|
|
|
|
$("#comment-" + editID + " .comment-info").prepend("<div class='comment-edited'><i class='fa fa-pencil' aria-hidden='true'></i>" + __("已编辑") + "</div>")
|
|
|
|
|
|
}
|
|
|
|
|
|
if (result.can_visit_edit_history){
|
|
|
|
|
|
$("#comment-" + editID + " .comment-info .comment-edited").addClass("comment-edithistory-accessible");
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
iziToast.destroy();
|
|
|
|
|
|
iziToast.show({
|
|
|
|
|
|
title: __("编辑成功"),
|
|
|
|
|
|
message: __("您的评论已编辑"),
|
|
|
|
|
|
class: 'shadow-sm',
|
|
|
|
|
|
position: 'topRight',
|
|
|
|
|
|
backgroundColor: '#2dce89',
|
|
|
|
|
|
titleColor: '#ffffff',
|
|
|
|
|
|
messageColor: '#ffffff',
|
|
|
|
|
|
iconColor: '#ffffff',
|
|
|
|
|
|
progressBarColor: '#ffffff',
|
|
|
|
|
|
icon: 'fa fa-check',
|
|
|
|
|
|
timeout: 5000
|
|
|
|
|
|
});
|
|
|
|
|
|
$("body,html").animate({
|
|
|
|
|
|
scrollTop: $("#comment-" + editID).offset().top - 100
|
|
|
|
|
|
}, 500, 'easeOutExpo');
|
|
|
|
|
|
editing = false;
|
|
|
|
|
|
editID = 0;
|
|
|
|
|
|
$("#post_comment_content").val("");
|
|
|
|
|
|
$('#post_comment').removeClass("editing post-comment-force-privatemode-on post-comment-force-privatemode-off");
|
|
|
|
|
|
$("#post_comment_content").trigger("change");
|
|
|
|
|
|
},
|
|
|
|
|
|
error: function(result){
|
|
|
|
|
|
$("#post_comment_content").removeAttr("disabled");
|
|
|
|
|
|
$("#post_comment_send").removeAttr("disabled");
|
|
|
|
|
|
$("#post_comment_edit_cancel").removeAttr("disabled");
|
|
|
|
|
|
$("#post_comment_send .btn-inner--icon.hide-on-comment-not-editing").html("<i class='fa fa-pencil'></i>");
|
|
|
|
|
|
$("#post_comment_send .btn-inner--text.hide-on-comment-not-editing").html(__("编辑"));
|
2026-01-16 14:14:51 +08:00
|
|
|
|
if (result.readyState != 4 || result.status == 0){
|
2026-01-11 19:48:02 +08:00
|
|
|
|
iziToast.destroy();
|
|
|
|
|
|
iziToast.show({
|
|
|
|
|
|
title: __("评论编辑失败"),
|
|
|
|
|
|
message: __("未知原因"),
|
|
|
|
|
|
class: 'shadow-sm',
|
|
|
|
|
|
position: 'topRight',
|
|
|
|
|
|
backgroundColor: '#f5365c',
|
|
|
|
|
|
titleColor: '#ffffff',
|
|
|
|
|
|
messageColor: '#ffffff',
|
|
|
|
|
|
iconColor: '#ffffff',
|
|
|
|
|
|
progressBarColor: '#ffffff',
|
|
|
|
|
|
icon: 'fa fa-close',
|
|
|
|
|
|
timeout: 5000
|
|
|
|
|
|
});
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
$(document).on("click" , "#post_comment_send" , function(){
|
|
|
|
|
|
if ($("#post_comment").hasClass("editing")){
|
|
|
|
|
|
editComment();
|
|
|
|
|
|
}else{
|
|
|
|
|
|
// 首先进行基本的表单验证
|
|
|
|
|
|
let commentContent = $("#post_comment_content").val();
|
|
|
|
|
|
let commentName = $("#post_comment_name").val();
|
|
|
|
|
|
let commentEmail = $("#post_comment_email").val();
|
|
|
|
|
|
let commentLink = $("#post_comment_link").val();
|
|
|
|
|
|
|
|
|
|
|
|
let isError = false;
|
|
|
|
|
|
let errorMsg = "";
|
|
|
|
|
|
|
|
|
|
|
|
// 检查表单合法性
|
|
|
|
|
|
if (commentContent.match(/^\s*$/)){
|
|
|
|
|
|
isError = true;
|
|
|
|
|
|
errorMsg += __("评论内容不能为空") + "</br>";
|
|
|
|
|
|
}
|
|
|
|
|
|
if (!$("#post_comment").hasClass("no-need-name-email")){
|
|
|
|
|
|
if (commentName.match(/^\s*$/)){
|
|
|
|
|
|
isError = true;
|
|
|
|
|
|
errorMsg += __("昵称不能为空") + "</br>";
|
|
|
|
|
|
}
|
|
|
|
|
|
if ($("#post_comment").hasClass("enable-qq-avatar")){
|
|
|
|
|
|
if (!(/^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/).test(commentEmail) && !(/^[1-9][0-9]{4,10}$/).test(commentEmail)){
|
|
|
|
|
|
isError = true;
|
|
|
|
|
|
errorMsg += __("邮箱或 QQ 号格式错误") + "</br>";
|
|
|
|
|
|
}
|
|
|
|
|
|
}else{
|
|
|
|
|
|
if (!(/^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/).test(commentEmail)){
|
|
|
|
|
|
isError = true;
|
|
|
|
|
|
errorMsg += __("邮箱格式错误") + "</br>";
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}else{
|
2026-01-16 14:14:51 +08:00
|
|
|
|
if (commentEmail.length || (document.getElementById("comment_post_mailnotice") != null && document.getElementById("comment_post_mailnotice").checked == true)){
|
2026-01-11 19:48:02 +08:00
|
|
|
|
if ($("#post_comment").hasClass("enable-qq-avatar")){
|
|
|
|
|
|
if (!(/^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/).test(commentEmail) && !(/^[1-9][0-9]{4,10}$/).test(commentEmail)){
|
|
|
|
|
|
isError = true;
|
|
|
|
|
|
errorMsg += __("邮箱或 QQ 号格式错误") + "</br>";
|
|
|
|
|
|
}
|
|
|
|
|
|
}else{
|
|
|
|
|
|
if (!(/^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/).test(commentEmail)){
|
|
|
|
|
|
isError = true;
|
|
|
|
|
|
errorMsg += __("邮箱格式错误") + "</br>";
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2026-01-16 14:14:51 +08:00
|
|
|
|
if (commentLink != "" && !(/https?:\/\//).test(commentLink)){
|
2026-01-11 19:48:02 +08:00
|
|
|
|
isError = true;
|
|
|
|
|
|
errorMsg += __("网站格式错误 (不是 http(s):// 开头)") + "</br>";
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 如果基本表单验证失败,显示错误信息并返回
|
|
|
|
|
|
if (isError){
|
|
|
|
|
|
// 确保按钮和表单元素处于可用状态
|
|
|
|
|
|
$("#post_comment_send").removeAttr("disabled");
|
|
|
|
|
|
$("#post_comment_content").removeAttr("disabled");
|
|
|
|
|
|
$("#post_comment_name").removeAttr("disabled");
|
|
|
|
|
|
$("#post_comment_email").removeAttr("disabled");
|
|
|
|
|
|
$("#post_comment_link").removeAttr("disabled");
|
|
|
|
|
|
$("#post_comment_captcha").removeAttr("disabled");
|
|
|
|
|
|
$("#post_comment_reply_cancel").removeAttr("disabled");
|
|
|
|
|
|
$("#post_comment").removeClass("sending");
|
|
|
|
|
|
$("#post_comment_send .btn-inner--icon.hide-on-comment-editing").html("<i class='fa fa-send'></i>");
|
|
|
|
|
|
$("#post_comment_send .btn-inner--text.hide-on-comment-editing").html(__("发送"));
|
|
|
|
|
|
|
|
|
|
|
|
iziToast.show({
|
|
|
|
|
|
title: __("评论格式错误"),
|
|
|
|
|
|
message: errorMsg,
|
|
|
|
|
|
class: 'shadow-sm',
|
|
|
|
|
|
position: 'topRight',
|
|
|
|
|
|
backgroundColor: '#f5365c',
|
|
|
|
|
|
titleColor: '#ffffff',
|
|
|
|
|
|
messageColor: '#ffffff',
|
|
|
|
|
|
iconColor: '#ffffff',
|
|
|
|
|
|
progressBarColor: '#ffffff',
|
|
|
|
|
|
icon: 'fa fa-close',
|
|
|
|
|
|
timeout: 5000
|
|
|
|
|
|
});
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 基本验证通过后,检查验证码
|
|
|
|
|
|
if ($("#geetest-captcha").length > 0) {
|
|
|
|
|
|
// 检查 Geetest 库是否加载失败
|
|
|
|
|
|
if (window.geetestLoadFailed) {
|
|
|
|
|
|
if (typeof loadGeetestScript === 'function' && typeof initGeetestCaptchaCore === 'function') {
|
|
|
|
|
|
try {
|
|
|
|
|
|
loadGeetestScript(function(){
|
|
|
|
|
|
initGeetestCaptchaCore();
|
|
|
|
|
|
setTimeout(function(){
|
|
|
|
|
|
if (window.geetestCaptcha) { try { window.geetestCaptcha.showBox(); } catch(e){} }
|
|
|
|
|
|
}, 0);
|
|
|
|
|
|
});
|
|
|
|
|
|
} catch(e) {}
|
|
|
|
|
|
}
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 如果正在自动提交中,防止重复点击
|
|
|
|
|
|
if (window.geetestAutoSubmitting) {
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 如果使用Geetest,检查验证码是否已完成
|
|
|
|
|
|
if (!window.geetestVerified) {
|
|
|
|
|
|
// 验证码未完成,触发验证码显示
|
|
|
|
|
|
if (window.geetestCaptcha) {
|
|
|
|
|
|
// 重置验证码状态
|
|
|
|
|
|
window.geetestCaptcha.reset();
|
|
|
|
|
|
// 然后显示验证码
|
|
|
|
|
|
window.geetestCaptcha.showBox();
|
|
|
|
|
|
} else {
|
|
|
|
|
|
if (typeof loadGeetestScript === 'function' && typeof initGeetestCaptchaCore === 'function') {
|
|
|
|
|
|
try {
|
|
|
|
|
|
loadGeetestScript(function(){
|
|
|
|
|
|
initGeetestCaptchaCore();
|
|
|
|
|
|
setTimeout(function(){
|
|
|
|
|
|
if (window.geetestCaptcha) { try { window.geetestCaptcha.showBox(); } catch(e){} }
|
|
|
|
|
|
}, 0);
|
|
|
|
|
|
});
|
|
|
|
|
|
} catch(e) {}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
// 验证码已完成或不需要验证码,直接提交评论
|
|
|
|
|
|
postComment();
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
}();
|
|
|
|
|
|
/*评论点赞*/
|
|
|
|
|
|
$(document).on("click" , ".comment-upvote" , function(){
|
|
|
|
|
|
$this = $(this);
|
|
|
|
|
|
ID = $this.attr("data-id");
|
|
|
|
|
|
$this.addClass("comment-upvoting");
|
|
|
|
|
|
$.ajax({
|
|
|
|
|
|
url : argonConfig.wp_path + "wp-admin/admin-ajax.php",
|
|
|
|
|
|
type : "POST",
|
|
|
|
|
|
dataType : "json",
|
|
|
|
|
|
data : {
|
|
|
|
|
|
action: "upvote_comment",
|
|
|
|
|
|
comment_id : ID,
|
|
|
|
|
|
},
|
|
|
|
|
|
success : function(result){
|
|
|
|
|
|
$this.removeClass("comment-upvoting");
|
2026-01-16 14:14:51 +08:00
|
|
|
|
if (result.status == "success"){
|
2026-01-11 19:48:02 +08:00
|
|
|
|
$(".comment-upvote-num" , $this).html(result.total_upvote);
|
|
|
|
|
|
$this.addClass("upvoted");
|
|
|
|
|
|
}else{
|
|
|
|
|
|
$(".comment-upvote-num" , $this).html(result.total_upvote);
|
|
|
|
|
|
iziToast.show({
|
|
|
|
|
|
title: result.msg,
|
|
|
|
|
|
class: 'shadow-sm',
|
|
|
|
|
|
position: 'topRight',
|
|
|
|
|
|
backgroundColor: '#f5365c',
|
|
|
|
|
|
titleColor: '#ffffff',
|
|
|
|
|
|
messageColor: '#ffffff',
|
|
|
|
|
|
iconColor: '#ffffff',
|
|
|
|
|
|
progressBarColor: '#ffffff',
|
|
|
|
|
|
icon: 'fa fa-close',
|
|
|
|
|
|
timeout: 5000
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
error : function(xhr){
|
|
|
|
|
|
$this.removeClass("comment-upvoting");
|
|
|
|
|
|
iziToast.show({
|
|
|
|
|
|
title: __("点赞失败"),
|
|
|
|
|
|
class: 'shadow-sm',
|
|
|
|
|
|
position: 'topRight',
|
|
|
|
|
|
backgroundColor: '#f5365c',
|
|
|
|
|
|
titleColor: '#ffffff',
|
|
|
|
|
|
messageColor: '#ffffff',
|
|
|
|
|
|
iconColor: '#ffffff',
|
|
|
|
|
|
progressBarColor: '#ffffff',
|
|
|
|
|
|
icon: 'fa fa-close',
|
|
|
|
|
|
timeout: 5000
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
});
|
|
|
|
|
|
/*评论表情面板*/
|
|
|
|
|
|
function lazyloadStickers(){
|
2026-01-12 15:17:52 +08:00
|
|
|
|
// 原生懒加载无需额外处理
|
2026-01-11 19:48:02 +08:00
|
|
|
|
}
|
|
|
|
|
|
$(document).on("click" , "#comment_emotion_btn" , function(){
|
|
|
|
|
|
$("#comment_emotion_btn").toggleClass("comment-emotion-keyboard-open");
|
|
|
|
|
|
});
|
|
|
|
|
|
$(document).on("click" , ".emotion-keyboard .emotion-group-name" , function(){
|
|
|
|
|
|
$(".emotion-keyboard .emotion-group-name.active").removeClass("active");
|
|
|
|
|
|
$(this).addClass("active");
|
|
|
|
|
|
$(".emotion-keyboard .emotion-group:not(d-none)").addClass("d-none");
|
|
|
|
|
|
$(".emotion-keyboard .emotion-group[index='" + $(this).attr("index") + "']").removeClass("d-none");
|
|
|
|
|
|
});
|
|
|
|
|
|
function inputInsertText(text, input){
|
|
|
|
|
|
$(input).focus();
|
|
|
|
|
|
let isSuccess = document.execCommand("insertText", false, text);
|
|
|
|
|
|
if (!isSuccess) { //FF
|
|
|
|
|
|
if (typeof input.setRangeText === "function"){
|
|
|
|
|
|
const start = input.selectionStart;
|
|
|
|
|
|
input.setRangeText(text);
|
|
|
|
|
|
input.selectionStart = input.selectionEnd = start + input.length;
|
|
|
|
|
|
const e = document.createEvent("UIEvent");
|
|
|
|
|
|
e.initEvent("input", true, false);
|
|
|
|
|
|
input.dispatchEvent(e);
|
|
|
|
|
|
}else{
|
|
|
|
|
|
let value = $(input).val();
|
|
|
|
|
|
let startPos = input.selectionStart, endPos = input.selectionEnd;
|
|
|
|
|
|
$(input).val(value.substring(0, startPos) + text + value.substring(endPos));
|
|
|
|
|
|
input.selectionStart = startPos + text.length;
|
|
|
|
|
|
input.selectionEnd = startPos + text.length;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
$(input).focus();
|
|
|
|
|
|
}
|
|
|
|
|
|
$(document).on("click" , ".emotion-keyboard .emotion-item" , function(){
|
|
|
|
|
|
$("#comment_emotion_btn").removeClass("comment-emotion-keyboard-open");
|
|
|
|
|
|
if ($(this).hasClass("emotion-item-sticker")){
|
|
|
|
|
|
inputInsertText(" :" + $(this).attr("code") + ": ", document.getElementById("post_comment_content"));
|
|
|
|
|
|
}else{
|
|
|
|
|
|
inputInsertText($(this).attr("text"), document.getElementById("post_comment_content"));
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
$(document).on("dragstart" , ".emotion-keyboard .emotion-item > img, .comment-sticker" , function(e){
|
|
|
|
|
|
e.preventDefault();
|
|
|
|
|
|
});
|
|
|
|
|
|
document.addEventListener('click', (e) => {
|
2026-01-16 14:14:51 +08:00
|
|
|
|
if (document.getElementById("comment_emotion_btn") == null){
|
2026-01-11 19:48:02 +08:00
|
|
|
|
return;
|
|
|
|
|
|
}
|
2026-01-16 14:14:51 +08:00
|
|
|
|
if(e.target.id != "comment_emotion_btn" && e.target.id != "emotion_keyboard" && !document.getElementById("comment_emotion_btn").contains(e.target) && !document.getElementById("emotion_keyboard").contains(e.target)){
|
2026-01-11 19:48:02 +08:00
|
|
|
|
$("#comment_emotion_btn").removeClass("comment-emotion-keyboard-open");
|
|
|
|
|
|
}
|
|
|
|
|
|
})
|
|
|
|
|
|
/*查看评论编辑记录*/
|
|
|
|
|
|
function showCommentEditHistory(id){
|
|
|
|
|
|
let requestID = parseInt(new Date().getTime());
|
|
|
|
|
|
$("#comment_edit_history").data("request-id", requestID);
|
|
|
|
|
|
$("#comment_edit_history .modal-title").html(__("评论 #") + id + " " + __("的编辑记录"));
|
|
|
|
|
|
$("#comment_edit_history .modal-body").html("<div class='comment-history-loading'><span class='spinner-border text-primary'></span><span style='display: inline-block;transform: translateY(-4px);margin-left: 15px;font-size: 18px;'>加载中</span></div>");
|
|
|
|
|
|
$("#comment_edit_history").modal(null);
|
|
|
|
|
|
$.ajax({
|
|
|
|
|
|
type: 'POST',
|
|
|
|
|
|
url: argonConfig.wp_path + "wp-admin/admin-ajax.php",
|
|
|
|
|
|
dataType : "json",
|
|
|
|
|
|
data: {
|
|
|
|
|
|
action: "get_comment_edit_history",
|
|
|
|
|
|
id: id
|
|
|
|
|
|
},
|
|
|
|
|
|
success: function(result){
|
2026-01-16 14:14:51 +08:00
|
|
|
|
if ($("#comment_edit_history").data("request-id") != requestID){
|
2026-01-11 19:48:02 +08:00
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
$("#comment_edit_history .modal-body").hide();
|
|
|
|
|
|
$("#comment_edit_history .modal-body").html(result.history);
|
|
|
|
|
|
$("#comment_edit_history .modal-body").fadeIn(300);
|
|
|
|
|
|
},
|
|
|
|
|
|
error: function(result){
|
2026-01-16 14:14:51 +08:00
|
|
|
|
if ($("#comment_edit_history").data("request-id") != requestID){
|
2026-01-11 19:48:02 +08:00
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
$("#comment_edit_history .modal-body").hide();
|
|
|
|
|
|
$("#comment_edit_history .modal-body").html(__("加载失败"));
|
|
|
|
|
|
$("#comment_edit_history .modal-body").fadeIn(300);
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
$(document).on("click" , ".comment-edited.comment-edithistory-accessible" , function(){
|
|
|
|
|
|
showCommentEditHistory($(this).parent().parent().parent().parent().data("id"));
|
|
|
|
|
|
});
|
|
|
|
|
|
/*过长评论折叠*/
|
|
|
|
|
|
function foldLongComments(){
|
2026-01-16 14:14:51 +08:00
|
|
|
|
if (argonConfig.fold_long_comments == false){
|
2026-01-11 19:48:02 +08:00
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
$(".comment-item-inner").each(function(){
|
|
|
|
|
|
if ($(this).hasClass("comment-unfolded")){
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
if (this.clientHeight > 800){
|
|
|
|
|
|
$(this).addClass("comment-folded");
|
|
|
|
|
|
$(this).append("<div class='show-full-comment'><button><i class='fa fa-angle-down' aria-hidden='true'></i> " + __("展开") + "</button></div>");
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
foldLongComments();
|
|
|
|
|
|
$(document).on("click" , ".show-full-comment" , function(){
|
|
|
|
|
|
$(this).parent().removeClass("comment-folded").addClass("comment-unfolded");
|
|
|
|
|
|
});
|
|
|
|
|
|
/*评论文字头像*/
|
|
|
|
|
|
function generateCommentTextAvatar(img){
|
|
|
|
|
|
let emailHash = '';
|
|
|
|
|
|
try{
|
|
|
|
|
|
emailHash = img.attr("src").match(/([a-f\d]{32}|[A-F\d]{32})/)[0];
|
|
|
|
|
|
}catch{
|
|
|
|
|
|
emailHash = img.parent().parent().parent().find(".comment-name").text().trim();
|
2026-01-16 14:14:51 +08:00
|
|
|
|
if (emailHash == '' || emailHash == undefined){
|
2026-01-11 19:48:02 +08:00
|
|
|
|
emailHash = img.parent().find("*[class*='comment-author']").text().trim();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
let hash = 0;
|
|
|
|
|
|
for (i in emailHash){
|
|
|
|
|
|
hash = (hash * 233 + emailHash.charCodeAt(i)) % 16;
|
|
|
|
|
|
}
|
|
|
|
|
|
let colors = ['#e25f50', '#f25e90', '#bc67cb', '#9672cf', '#7984ce', '#5c96fa', '#7bdeeb', '#45d0e2', '#48b7ad', '#52bc89', '#9ace5f', '#d4e34a', '#f9d715', '#fac400', '#ffaa00', '#ff8b61', '#c2c2c2', '#8ea3af', '#a1877d', '#a3a3a3', '#b0b6e3', '#b49cde', '#c2c2c2', '#7bdeeb', '#bcaaa4', '#aed77f'];
|
|
|
|
|
|
let text = $(".comment-name", img.parent().parent().parent()).text().trim()[0];
|
2026-01-16 14:14:51 +08:00
|
|
|
|
if (text == '' || text == undefined){
|
2026-01-11 19:48:02 +08:00
|
|
|
|
text = img.parent().find("*[class*='comment-author']").text().trim()[0];
|
|
|
|
|
|
}
|
|
|
|
|
|
let classList = img.attr('class') + " text-avatar";
|
|
|
|
|
|
img.prop('outerHTML', '<div class="' + classList + '" style="background-color: ' + colors[hash] + ';">' + text + '</div>');
|
|
|
|
|
|
}
|
|
|
|
|
|
document.addEventListener("error", function(e){
|
|
|
|
|
|
let img = $(e.target);
|
|
|
|
|
|
if (!img.hasClass("avatar")){
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
generateCommentTextAvatar(img);
|
|
|
|
|
|
}, true);
|
|
|
|
|
|
function refreshCommentTextAvatar(){
|
|
|
|
|
|
$(".comment-item-avatar > img.avatar").each(function(index, img){
|
|
|
|
|
|
if (!img.complete){
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
if (img.naturalWidth !== 0){
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
generateCommentTextAvatar($(img));
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
refreshCommentTextAvatar();
|
|
|
|
|
|
$(window).on("load", function(){
|
|
|
|
|
|
refreshCommentTextAvatar();
|
|
|
|
|
|
});
|
|
|
|
|
|
/*需要密码的文章加载*/
|
|
|
|
|
|
$(document).on("submit" , ".post-password-form" , function(){
|
|
|
|
|
|
$("input[type='submit']", this).attr("disabled", "disabled");
|
|
|
|
|
|
let url = $(this).attr("action");
|
|
|
|
|
|
$.pjax.form(this, {
|
|
|
|
|
|
push: false,
|
|
|
|
|
|
replace: false
|
|
|
|
|
|
});
|
|
|
|
|
|
return false;
|
|
|
|
|
|
});
|
|
|
|
|
|
/*评论分页加载*/
|
|
|
|
|
|
!function(){
|
|
|
|
|
|
$(document).on("click" , "#comments_navigation .page-item > div" , function(){
|
|
|
|
|
|
$("#comments").addClass("comments-loading");
|
|
|
|
|
|
NProgress.set(0.618);
|
|
|
|
|
|
url = $(this).attr("href");
|
|
|
|
|
|
$.ajax({
|
|
|
|
|
|
type: 'POST',
|
|
|
|
|
|
url: url,
|
|
|
|
|
|
dataType : "html",
|
|
|
|
|
|
success : function(result){
|
|
|
|
|
|
NProgress.done();
|
|
|
|
|
|
$vdom = $(result);
|
|
|
|
|
|
$("#comments").html($("#comments", $vdom).html());
|
|
|
|
|
|
$("#comments").removeClass("comments-loading");
|
|
|
|
|
|
$("body,html").animate({
|
|
|
|
|
|
scrollTop: $("#comments").offset().top - 100
|
|
|
|
|
|
}, 500, 'easeOutExpo');
|
|
|
|
|
|
foldLongComments();
|
|
|
|
|
|
calcHumanTimesOnPage();
|
|
|
|
|
|
panguInit();
|
|
|
|
|
|
},
|
|
|
|
|
|
error : function(){
|
|
|
|
|
|
window.location.href = url;
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
});
|
|
|
|
|
|
$(document).on("click" , "#comments_more" , function(){
|
|
|
|
|
|
$("#comments_more").attr("disabled", "disabled");
|
|
|
|
|
|
NProgress.set(0.618);
|
|
|
|
|
|
url = $(this).attr("href");
|
|
|
|
|
|
$.ajax({
|
|
|
|
|
|
type: 'POST',
|
|
|
|
|
|
url: url,
|
|
|
|
|
|
data: {
|
|
|
|
|
|
no_post_view: 'true'
|
|
|
|
|
|
},
|
|
|
|
|
|
dataType : "html",
|
|
|
|
|
|
success : function(result){
|
|
|
|
|
|
NProgress.done();
|
|
|
|
|
|
$vdom = $(result);
|
|
|
|
|
|
$("#comments > .card-body > ol.comment-list").append($("#comments > .card-body > ol.comment-list", $vdom).html());
|
2026-01-16 14:14:51 +08:00
|
|
|
|
if ($("#comments_more", $vdom).length == 0){
|
2026-01-11 19:48:02 +08:00
|
|
|
|
$("#comments_more").remove();
|
|
|
|
|
|
$(".comments-navigation-more").html("<div class='comments-navigation-nomore'>" + __("没有更多了") + "</div>");
|
|
|
|
|
|
}else{
|
|
|
|
|
|
$("#comments_more").attr("href", $("#comments_more", $vdom).attr("href"));
|
|
|
|
|
|
$("#comments_more").removeAttr("disabled");
|
|
|
|
|
|
}
|
|
|
|
|
|
foldLongComments();
|
|
|
|
|
|
calcHumanTimesOnPage();
|
|
|
|
|
|
panguInit();
|
|
|
|
|
|
},
|
|
|
|
|
|
error : function(){
|
|
|
|
|
|
window.location.href = url;
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
});
|
|
|
|
|
|
}();
|
|
|
|
|
|
|
|
|
|
|
|
/*URL 中 # 根据 ID 定位*/
|
|
|
|
|
|
function gotoHash(hash, durtion, easing = 'easeOutExpo'){
|
2026-01-16 14:14:51 +08:00
|
|
|
|
if (hash.length == 0){
|
2026-01-11 19:48:02 +08:00
|
|
|
|
return;
|
|
|
|
|
|
}
|
2026-01-16 14:14:51 +08:00
|
|
|
|
if ($(hash).length == 0){
|
2026-01-11 19:48:02 +08:00
|
|
|
|
return;
|
|
|
|
|
|
}
|
2026-01-16 14:14:51 +08:00
|
|
|
|
if (durtion == null){
|
2026-01-11 19:48:02 +08:00
|
|
|
|
durtion = 200;
|
|
|
|
|
|
}
|
|
|
|
|
|
$("body,html").stop().animate({
|
|
|
|
|
|
scrollTop: $(hash).offset().top - 80
|
|
|
|
|
|
}, durtion, easing);
|
|
|
|
|
|
}
|
|
|
|
|
|
function getHash(url){
|
|
|
|
|
|
return url.substring(url.indexOf('#'));
|
|
|
|
|
|
}
|
|
|
|
|
|
!function(){
|
|
|
|
|
|
$(window).on("hashchange" , function(){
|
|
|
|
|
|
gotoHash(window.location.hash);
|
|
|
|
|
|
});
|
|
|
|
|
|
$(window).trigger("hashchange");
|
|
|
|
|
|
}();
|
|
|
|
|
|
|
|
|
|
|
|
/*显示文章过时信息 Toast*/
|
|
|
|
|
|
function showPostOutdateToast(){
|
|
|
|
|
|
if ($("#primary #post_outdate_toast").length > 0){
|
|
|
|
|
|
iziToast.show({
|
|
|
|
|
|
title: '',
|
|
|
|
|
|
message: $("#primary #post_outdate_toast").data("text"),
|
|
|
|
|
|
class: 'shadow-sm',
|
|
|
|
|
|
position: 'topRight',
|
|
|
|
|
|
backgroundColor: 'var(--themecolor)',
|
|
|
|
|
|
titleColor: '#ffffff',
|
|
|
|
|
|
messageColor: '#ffffff',
|
|
|
|
|
|
iconColor: '#ffffff',
|
|
|
|
|
|
progressBarColor: '#ffffff',
|
|
|
|
|
|
icon: 'fa fa-info',
|
|
|
|
|
|
close: false,
|
|
|
|
|
|
timeout: 8000
|
|
|
|
|
|
});
|
|
|
|
|
|
$("#primary #post_outdate_toast").remove();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
showPostOutdateToast();
|
|
|
|
|
|
|
|
|
|
|
|
/*Zoomify*/
|
|
|
|
|
|
function zoomifyInit(){
|
2026-01-16 14:14:51 +08:00
|
|
|
|
if (argonConfig.zoomify == false){
|
2026-01-11 19:48:02 +08:00
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
if (typeof $.fn.zoomify === 'function') {
|
|
|
|
|
|
$("article img").zoomify(argonConfig.zoomify);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
zoomifyInit();
|
|
|
|
|
|
|
|
|
|
|
|
/*Fancybox*/
|
|
|
|
|
|
$.fancybox.defaults.transitionEffect = "slide";
|
|
|
|
|
|
$.fancybox.defaults.buttons = ["zoom", "fullScreen", "thumbs", "close"];
|
|
|
|
|
|
$.fancybox.defaults.lang = argonConfig.language;
|
|
|
|
|
|
$.fancybox.defaults.i18n = {
|
|
|
|
|
|
en_US: {
|
|
|
|
|
|
CLOSE: "Close",
|
|
|
|
|
|
NEXT: "Next",
|
|
|
|
|
|
PREV: "Previous",
|
|
|
|
|
|
ERROR: "The requested content cannot be loaded. <br/> Please try again later.",
|
|
|
|
|
|
PLAY_START: "Start slideshow",
|
|
|
|
|
|
PLAY_STOP: "Pause slideshow",
|
|
|
|
|
|
FULL_SCREEN: "Full screen",
|
|
|
|
|
|
THUMBS: "Thumbnails",
|
|
|
|
|
|
DOWNLOAD: "Download",
|
|
|
|
|
|
SHARE: "Share",
|
|
|
|
|
|
ZOOM: "Zoom"
|
|
|
|
|
|
},
|
|
|
|
|
|
zh_CN: {
|
|
|
|
|
|
CLOSE: "关闭",
|
|
|
|
|
|
NEXT: "下一张",
|
|
|
|
|
|
PREV: "上一张",
|
|
|
|
|
|
ERROR: "图片加载失败",
|
|
|
|
|
|
PLAY_START: "开始幻灯片展示",
|
|
|
|
|
|
PLAY_STOP: "暂停幻灯片展示",
|
|
|
|
|
|
FULL_SCREEN: "全屏",
|
|
|
|
|
|
THUMBS: "缩略图",
|
|
|
|
|
|
DOWNLOAD: "下载",
|
|
|
|
|
|
SHARE: "分享",
|
|
|
|
|
|
ZOOM: "缩放"
|
|
|
|
|
|
}
|
|
|
|
|
|
};
|
|
|
|
|
|
|
2026-01-12 15:17:52 +08:00
|
|
|
|
/*Lazyload - 已改用浏览器原生 loading="lazy"*/
|
2026-01-11 19:48:02 +08:00
|
|
|
|
function lazyloadInit(){
|
2026-01-12 15:17:52 +08:00
|
|
|
|
// 原生懒加载无需 JS 初始化
|
|
|
|
|
|
// 保留此函数以兼容可能的外部调用
|
2026-01-11 19:48:02 +08:00
|
|
|
|
}
|
|
|
|
|
|
lazyloadInit();
|
|
|
|
|
|
|
|
|
|
|
|
/*Pangu.js*/
|
|
|
|
|
|
function panguInit(){
|
|
|
|
|
|
if (argonConfig.pangu.indexOf("article") >= 0){
|
|
|
|
|
|
pangu.spacingElementByClassName('post-content');
|
|
|
|
|
|
}
|
|
|
|
|
|
if (argonConfig.pangu.indexOf("comment") >= 0){
|
|
|
|
|
|
pangu.spacingElementById('comments');
|
|
|
|
|
|
}
|
|
|
|
|
|
if (argonConfig.pangu.indexOf("shuoshuo") >= 0){
|
|
|
|
|
|
pangu.spacingElementByClassName('shuoshuo-content');
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
panguInit();
|
|
|
|
|
|
|
|
|
|
|
|
/*Clamp.js*/
|
|
|
|
|
|
function clampInit(){
|
|
|
|
|
|
$(".clamp").each(function(index, dom) {
|
|
|
|
|
|
$clamp(dom, {clamp: dom.getAttribute("clamp-line")});
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
clampInit();
|
|
|
|
|
|
|
|
|
|
|
|
/*Tippy.js*/
|
|
|
|
|
|
function tippyInit(){
|
|
|
|
|
|
//Reference Popover
|
|
|
|
|
|
tippy('sup.reference[data-content]:not(.tippy-initialized)', {
|
|
|
|
|
|
content: (reference) => reference.getAttribute('data-content'),
|
|
|
|
|
|
allowHTML: true,
|
|
|
|
|
|
interactive: true,theme: 'light scroll-y',
|
|
|
|
|
|
delay: [100, 250],
|
|
|
|
|
|
animation: 'fade'
|
|
|
|
|
|
});
|
|
|
|
|
|
$("sup.reference[data-content]:not(.tippy-initialized)").addClass("tippy-initialized");
|
|
|
|
|
|
}
|
|
|
|
|
|
tippyInit();
|
|
|
|
|
|
|
|
|
|
|
|
/*Banner 全屏封面相关*/
|
|
|
|
|
|
if ($("html").hasClass("banner-as-cover")){
|
|
|
|
|
|
function classInit(){
|
|
|
|
|
|
if ($("#main").hasClass("article-list-home")){
|
|
|
|
|
|
if (!$("html").hasClass("is-home")){
|
|
|
|
|
|
$("html").addClass("is-home");
|
|
|
|
|
|
$("html").trigger("resize");
|
|
|
|
|
|
}
|
|
|
|
|
|
}else{
|
|
|
|
|
|
if ($("html").hasClass("is-home")){
|
|
|
|
|
|
$("html").removeClass("is-home");
|
|
|
|
|
|
$("html").trigger("resize");
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
classInit();
|
|
|
|
|
|
new MutationObserver(function(mutations, observer){
|
|
|
|
|
|
classInit();
|
|
|
|
|
|
}).observe(document.querySelector("#primary"), {
|
|
|
|
|
|
'childList': true
|
|
|
|
|
|
});
|
|
|
|
|
|
$(".cover-scroll-down").on("click" , function(){
|
|
|
|
|
|
gotoHash("#content", 600, 'easeOutCirc');
|
|
|
|
|
|
$("#content").focus();
|
|
|
|
|
|
});
|
|
|
|
|
|
$fabs = $("#float_action_buttons");
|
|
|
|
|
|
$coverScrollDownBtn = $(".cover-scroll-down");
|
|
|
|
|
|
function changeWidgetsDisplayStatus(){
|
|
|
|
|
|
let scrollTop = $(window).scrollTop();
|
|
|
|
|
|
if (scrollTop >= window.outerHeight * 0.2){
|
|
|
|
|
|
$fabs.removeClass("hidden");
|
|
|
|
|
|
}else{
|
|
|
|
|
|
$fabs.addClass("hidden");
|
|
|
|
|
|
}
|
|
|
|
|
|
if (scrollTop >= window.outerHeight * 0.6){
|
|
|
|
|
|
$coverScrollDownBtn.addClass("hidden");
|
|
|
|
|
|
}else{
|
|
|
|
|
|
$coverScrollDownBtn.removeClass("hidden");
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
changeWidgetsDisplayStatus();
|
|
|
|
|
|
$(window).scroll(function(){
|
|
|
|
|
|
changeWidgetsDisplayStatus();
|
|
|
|
|
|
});
|
|
|
|
|
|
$(window).resize(function(){
|
|
|
|
|
|
changeWidgetsDisplayStatus();
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-01-16 14:14:51 +08:00
|
|
|
|
/*Pjax*/
|
|
|
|
|
|
var pjaxScrollTop = 0, pjaxLoading = false;
|
2026-01-11 19:48:02 +08:00
|
|
|
|
$.pjax.defaults.timeout = 10000;
|
|
|
|
|
|
$.pjax.defaults.container = ['#primary', '#leftbar_part1_menu', '#leftbar_part2_inner', '.page-information-card-container', '#rightbar', '#wpadminbar'];
|
|
|
|
|
|
$.pjax.defaults.fragment = ['#primary', '#leftbar_part1_menu', '#leftbar_part2_inner', '.page-information-card-container', '#rightbar', '#wpadminbar'];
|
|
|
|
|
|
$(document).pjax("a[href]:not([no-pjax]):not(.no-pjax):not([target='_blank']):not([download]):not(.reference-link):not(.reference-list-backlink)")
|
|
|
|
|
|
.on('pjax:click', function(e, f, g){
|
2026-01-16 14:14:51 +08:00
|
|
|
|
if (argonConfig.disable_pjax == true){
|
2026-01-11 19:48:02 +08:00
|
|
|
|
e.preventDefault();
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
NProgress.remove();
|
|
|
|
|
|
NProgress.start();
|
|
|
|
|
|
pjaxLoading = true;
|
|
|
|
|
|
}).on('pjax:afterGetContainers', function(e, f, g) {
|
|
|
|
|
|
if (g.is("#main article.post-preview a.post-title")){
|
|
|
|
|
|
let $card = $(g.parents("article.post-preview")[0]);
|
|
|
|
|
|
let waterflowOn = false;
|
|
|
|
|
|
if ($("#main").hasClass("waterflow")){
|
|
|
|
|
|
waterflowOn = true;
|
|
|
|
|
|
$card.css("transition", "all .5s ease");
|
|
|
|
|
|
}
|
|
|
|
|
|
$card.append("<div class='loading-css-animation'><div class='loading-dot loading-dot-1' ></div><div class='loading-dot loading-dot-2' ></div><div class='loading-dot loading-dot-3' ></div><div class='loading-dot loading-dot-4' ></div><div class='loading-dot loading-dot-5' ></div><div class='loading-dot loading-dot-6' ></div><div class='loading-dot loading-dot-7' ></div><div class='loading-dot loading-dot-8' ></div></div></div>");
|
|
|
|
|
|
$card.addClass("post-pjax-loading");
|
|
|
|
|
|
$("#main").addClass("post-list-pjax-loading");
|
|
|
|
|
|
let offsetTop = $($card).offset().top - $("#main").offset().top;
|
|
|
|
|
|
if ($("html").hasClass("is-home") && $("html").hasClass("banner-as-cover")){
|
|
|
|
|
|
offsetTop = $($card).offset().top - window.outerHeight * 0.418;
|
|
|
|
|
|
}
|
|
|
|
|
|
$card.css("transform" , "translateY(-" + offsetTop + "px)");
|
|
|
|
|
|
if (waterflowOn){
|
|
|
|
|
|
$card.css("left", "10px");
|
|
|
|
|
|
$card.css("width", "calc(100% - 20px)");
|
|
|
|
|
|
}
|
|
|
|
|
|
$("body,html").animate({
|
|
|
|
|
|
scrollTop: 0
|
|
|
|
|
|
}, 450);
|
|
|
|
|
|
}
|
|
|
|
|
|
pjaxScrollTop = 0;
|
|
|
|
|
|
if ($("html").hasClass("banner-as-cover")){
|
|
|
|
|
|
if (g.is(".page-link")){
|
|
|
|
|
|
pjaxScrollTop = $("#content").offset().top - 80;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}).on('pjax:send', function() {
|
|
|
|
|
|
NProgress.set(0.618);
|
|
|
|
|
|
}).on('pjax:beforeReplace', function(e, dom) {
|
|
|
|
|
|
if ($("#post_comment", dom[0]).length > 0){
|
|
|
|
|
|
$("#fabtn_go_to_comment").removeClass("d-none");
|
|
|
|
|
|
}else{
|
|
|
|
|
|
$("#fabtn_go_to_comment").addClass("d-none");
|
|
|
|
|
|
}
|
|
|
|
|
|
if ($("html").hasClass("banner-as-cover")){
|
|
|
|
|
|
if (!$("#main").hasClass("article-list-home")){
|
|
|
|
|
|
pjaxScrollTop = 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}).on('pjax:complete', function() {
|
|
|
|
|
|
pjaxLoading = false;
|
|
|
|
|
|
NProgress.inc();
|
|
|
|
|
|
try{
|
2026-01-16 14:14:51 +08:00
|
|
|
|
if (MathJax != undefined){
|
|
|
|
|
|
if (MathJax.Hub != undefined){
|
2026-01-11 19:48:02 +08:00
|
|
|
|
MathJax.Hub.Typeset();
|
|
|
|
|
|
}else{
|
|
|
|
|
|
MathJax.typeset();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}catch (err){}
|
|
|
|
|
|
try{
|
2026-01-16 14:14:51 +08:00
|
|
|
|
if (renderMathInElement != undefined){
|
2026-01-11 19:48:02 +08:00
|
|
|
|
renderMathInElement(document.body,{
|
|
|
|
|
|
delimiters: [
|
|
|
|
|
|
{left: "$$", right: "$$", display: true},
|
|
|
|
|
|
{left: "$", right: "$", display: false},
|
|
|
|
|
|
{left: "\\(", right: "\\)", display: false}
|
|
|
|
|
|
]
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
}catch (err){}
|
|
|
|
|
|
|
|
|
|
|
|
waterflowInit();
|
|
|
|
|
|
lazyloadInit();
|
|
|
|
|
|
zoomifyInit();
|
|
|
|
|
|
highlightJsRender();
|
|
|
|
|
|
panguInit();
|
|
|
|
|
|
clampInit();
|
|
|
|
|
|
tippyInit();
|
|
|
|
|
|
getGithubInfoCardContent();
|
|
|
|
|
|
showPostOutdateToast();
|
|
|
|
|
|
calcHumanTimesOnPage();
|
|
|
|
|
|
foldLongComments();
|
|
|
|
|
|
foldLongShuoshuo();
|
|
|
|
|
|
$("html").trigger("resize");
|
|
|
|
|
|
|
2026-01-16 14:14:51 +08:00
|
|
|
|
if (typeof(window.pjaxLoaded) == "function"){
|
2026-01-11 19:48:02 +08:00
|
|
|
|
try{
|
|
|
|
|
|
window.pjaxLoaded();
|
|
|
|
|
|
}catch (err){
|
|
|
|
|
|
console.error(err);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
NProgress.done();
|
|
|
|
|
|
}).on('pjax:end', function() {
|
|
|
|
|
|
waterflowInit();
|
|
|
|
|
|
lazyloadInit();
|
2026-01-11 22:43:57 +08:00
|
|
|
|
// 重置移动端目录状态
|
|
|
|
|
|
if (typeof window.resetMobileCatalog === 'function') {
|
|
|
|
|
|
window.resetMobileCatalog();
|
|
|
|
|
|
}
|
2026-01-11 19:48:02 +08:00
|
|
|
|
// GT4: PJAX 后确保评论页验证码已初始化
|
|
|
|
|
|
try {
|
|
|
|
|
|
if ($('#geetest-captcha').length > 0) {
|
|
|
|
|
|
// 重置前端状态,避免重复提交阻塞
|
|
|
|
|
|
window.geetestVerified = false;
|
|
|
|
|
|
window.geetestAutoSubmitting = false;
|
|
|
|
|
|
// 清空隐藏字段,防止残留导致 pass_token 复用
|
|
|
|
|
|
$('#geetest_lot_number').val('');
|
|
|
|
|
|
$('#geetest_captcha_output').val('');
|
|
|
|
|
|
$('#geetest_pass_token').val('');
|
|
|
|
|
|
$('#geetest_gen_time').val('');
|
|
|
|
|
|
// 清空容器,防止重复 appendTo 导致多个实例
|
|
|
|
|
|
$('#geetest-captcha').empty();
|
|
|
|
|
|
// 若页面脚本已提供初始化方法,则调用以加载验证码
|
|
|
|
|
|
if (typeof initGeetestCaptcha === 'function') {
|
|
|
|
|
|
initGeetestCaptcha();
|
|
|
|
|
|
} else if (typeof loadGeetestScript === 'function' && typeof initGeetestCaptchaCore === 'function') {
|
|
|
|
|
|
loadGeetestScript(function(){ initGeetestCaptchaCore(); });
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
} catch (e) {
|
|
|
|
|
|
console.warn('Geetest init on PJAX failed:', e);
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
/*Reference 跳转*/
|
|
|
|
|
|
$(document).on("click", ".reference-link , .reference-list-backlink" , function(e){
|
|
|
|
|
|
e.preventDefault();
|
|
|
|
|
|
$target = $($(this).attr("href"));
|
|
|
|
|
|
$("body,html").animate({
|
|
|
|
|
|
scrollTop: $target.offset().top - document.body.clientHeight / 2 - 75
|
|
|
|
|
|
}, 500, 'easeOutExpo')
|
|
|
|
|
|
setTimeout(function(){
|
|
|
|
|
|
if ($target.is("li")){
|
|
|
|
|
|
$(".space", $target).focus();
|
|
|
|
|
|
}else{
|
|
|
|
|
|
$target.focus();
|
|
|
|
|
|
}
|
|
|
|
|
|
}, 1);
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
/*Tags Dialog pjax 加载后自动关闭*/
|
|
|
|
|
|
$(document).on("click" , "#blog_tags .tag" , function(){
|
|
|
|
|
|
$("#blog_tags button.close").trigger("click");
|
|
|
|
|
|
});
|
|
|
|
|
|
$(document).on("click" , "#blog_categories .tag" , function(){
|
|
|
|
|
|
$("#blog_categories button.close").trigger("click");
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
/*侧栏 & 顶栏菜单手机适配*/
|
|
|
|
|
|
!function(){
|
|
|
|
|
|
$(document).on("click" , "#fabtn_open_sidebar, #open_sidebar" , function(){
|
2026-01-15 23:41:10 +08:00
|
|
|
|
console.log('[Mobile Sidebar] Sidebar opened');
|
2026-01-11 19:48:02 +08:00
|
|
|
|
$("html").addClass("leftbar-opened");
|
|
|
|
|
|
// 侧边栏打开时初始化移动端文章目录
|
2026-01-15 23:41:10 +08:00
|
|
|
|
console.log('[Mobile Sidebar] Calling initMobileCatalog');
|
2026-01-11 19:48:02 +08:00
|
|
|
|
initMobileCatalog();
|
|
|
|
|
|
// 如果有文章目录,默认展开
|
|
|
|
|
|
setTimeout(function() {
|
2026-01-16 14:14:51 +08:00
|
|
|
|
var catalogSection = $("#mobile_catalog_toggle").closest(".leftbar-mobile-collapse-section");
|
2026-01-15 23:41:10 +08:00
|
|
|
|
console.log('[Mobile Sidebar] Catalog section found:', catalogSection.length);
|
2026-01-11 19:48:02 +08:00
|
|
|
|
if (catalogSection.length > 0 && !catalogSection.hasClass("expanded")) {
|
|
|
|
|
|
catalogSection.addClass("expanded");
|
|
|
|
|
|
initMobileCatalog();
|
|
|
|
|
|
setTimeout(scrollMobileCatalogToActive, 200);
|
|
|
|
|
|
}
|
|
|
|
|
|
}, 100);
|
|
|
|
|
|
});
|
|
|
|
|
|
$(document).on("click" , "#sidebar_mask, #leftbar_close_btn" , function(){
|
|
|
|
|
|
$("html").removeClass("leftbar-opened");
|
|
|
|
|
|
});
|
|
|
|
|
|
$(document).on("click" , "#leftbar a[href]:not([no-pjax]):not([href^='#']):not(.has-submenu)" , function(){
|
|
|
|
|
|
$("html").removeClass("leftbar-opened");
|
|
|
|
|
|
});
|
|
|
|
|
|
// 移动端子菜单展开/收起
|
|
|
|
|
|
$(document).on("click" , ".leftbar-mobile-menu-item.has-children > a.has-submenu" , function(e){
|
|
|
|
|
|
e.preventDefault();
|
|
|
|
|
|
$(this).parent().toggleClass("expanded");
|
|
|
|
|
|
});
|
|
|
|
|
|
// 移动端侧边栏搜索
|
|
|
|
|
|
$(document).on("keydown" , "#leftbar_mobile_search_input" , function(e){
|
2026-01-16 14:14:51 +08:00
|
|
|
|
if (e.keyCode != 13){
|
2026-01-11 19:48:02 +08:00
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
let word = $(this).val();
|
2026-01-16 14:14:51 +08:00
|
|
|
|
if (word == ""){
|
2026-01-11 19:48:02 +08:00
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
$("html").removeClass("leftbar-opened");
|
|
|
|
|
|
searchPosts(word);
|
|
|
|
|
|
});
|
|
|
|
|
|
$(document).on("click" , "#navbar_global.show .navbar-nav a[href]:not([no-pjax]):not([href^='#'])" , function(){
|
|
|
|
|
|
$("#navbar_global .navbar-toggler").click();
|
|
|
|
|
|
});
|
|
|
|
|
|
$(document).on("click" , "#navbar_global.show #navbar_search_btn_mobile" , function(){
|
|
|
|
|
|
$("#navbar_global .navbar-toggler").click();
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
// ========== 移动端折叠面板交互 ==========
|
|
|
|
|
|
$(document).on("click", ".leftbar-mobile-collapse-header", function(e) {
|
2026-01-16 14:14:51 +08:00
|
|
|
|
var section = $(this).closest(".leftbar-mobile-collapse-section");
|
|
|
|
|
|
var header = $(this);
|
|
|
|
|
|
var isExpanded = section.hasClass("expanded");
|
2026-01-11 19:48:02 +08:00
|
|
|
|
|
|
|
|
|
|
// 添加点击波纹效果
|
2026-01-16 14:14:51 +08:00
|
|
|
|
var ripple = $('<span class="collapse-ripple"></span>');
|
|
|
|
|
|
var rect = this.getBoundingClientRect();
|
|
|
|
|
|
var x = e.clientX - rect.left;
|
|
|
|
|
|
var y = e.clientY - rect.top;
|
2026-01-11 19:48:02 +08:00
|
|
|
|
ripple.css({
|
|
|
|
|
|
left: x + 'px',
|
|
|
|
|
|
top: y + 'px'
|
|
|
|
|
|
});
|
|
|
|
|
|
header.append(ripple);
|
|
|
|
|
|
setTimeout(function() {
|
|
|
|
|
|
ripple.remove();
|
|
|
|
|
|
}, 600);
|
|
|
|
|
|
|
|
|
|
|
|
// 切换展开状态
|
|
|
|
|
|
section.toggleClass("expanded");
|
|
|
|
|
|
|
|
|
|
|
|
// 如果是文章目录面板展开,初始化目录并滚动到当前位置
|
|
|
|
|
|
if (!isExpanded && header.attr("id") === "mobile_catalog_toggle") {
|
|
|
|
|
|
initMobileCatalog();
|
|
|
|
|
|
setTimeout(scrollMobileCatalogToActive, 100);
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
// ========== 移动端文章目录初始化 ==========
|
2026-01-11 22:43:57 +08:00
|
|
|
|
window.mobileCatalogInitialized = false;
|
2026-01-11 19:48:02 +08:00
|
|
|
|
|
|
|
|
|
|
function initMobileCatalog() {
|
2026-01-15 23:19:37 +08:00
|
|
|
|
console.log('[Mobile Catalog] initMobileCatalog called, initialized:', window.mobileCatalogInitialized);
|
2026-01-11 22:43:57 +08:00
|
|
|
|
if (window.mobileCatalogInitialized) return;
|
2026-01-16 14:14:51 +08:00
|
|
|
|
var $mobileContainer = $("#leftbar_mobile_catalog");
|
|
|
|
|
|
var $postContent = $("#post_content");
|
2026-01-15 23:19:37 +08:00
|
|
|
|
console.log('[Mobile Catalog] Container found:', $mobileContainer.length, 'PostContent found:', $postContent.length);
|
2026-01-15 23:14:03 +08:00
|
|
|
|
if ($mobileContainer.length === 0) return;
|
|
|
|
|
|
if ($postContent.length === 0) return;
|
2026-01-11 19:48:02 +08:00
|
|
|
|
|
2026-01-15 23:16:24 +08:00
|
|
|
|
// 直接生成目录,不依赖 headIndex 插件
|
2026-01-16 14:14:51 +08:00
|
|
|
|
var $headers = $postContent.find('h1, h2, h3, h4, h5, h6');
|
2026-01-15 23:19:37 +08:00
|
|
|
|
console.log('[Mobile Catalog] Headers found:', $headers.length);
|
2026-01-15 23:16:24 +08:00
|
|
|
|
if ($headers.length === 0) {
|
|
|
|
|
|
$mobileContainer.html('<div class="no-catalog">暂无目录</div>');
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 构建目录树
|
2026-01-16 14:14:51 +08:00
|
|
|
|
var toc = [];
|
|
|
|
|
|
var stack = [{ level: 0, children: toc }];
|
2026-01-15 23:16:24 +08:00
|
|
|
|
|
|
|
|
|
|
$headers.each(function(index) {
|
2026-01-16 14:14:51 +08:00
|
|
|
|
var $h = $(this);
|
|
|
|
|
|
var level = parseInt(this.tagName.charAt(1));
|
|
|
|
|
|
var text = $h.text().trim();
|
|
|
|
|
|
var id = $h.attr('id');
|
2026-01-15 23:14:03 +08:00
|
|
|
|
|
2026-01-15 23:16:24 +08:00
|
|
|
|
// 确保标题有 ID
|
|
|
|
|
|
if (!id) {
|
|
|
|
|
|
id = 'mobile-heading-' + index;
|
|
|
|
|
|
$h.attr('id', id);
|
|
|
|
|
|
}
|
2026-01-15 23:14:03 +08:00
|
|
|
|
|
2026-01-16 14:14:51 +08:00
|
|
|
|
var item = { id: id, text: text, level: level, children: [] };
|
2026-01-15 23:14:03 +08:00
|
|
|
|
|
2026-01-15 23:16:24 +08:00
|
|
|
|
// 找到合适的父级
|
|
|
|
|
|
while (stack.length > 1 && stack[stack.length - 1].level >= level) {
|
|
|
|
|
|
stack.pop();
|
|
|
|
|
|
}
|
|
|
|
|
|
stack[stack.length - 1].children.push(item);
|
|
|
|
|
|
stack.push({ level: level, children: item.children });
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
// 递归生成 HTML
|
|
|
|
|
|
function buildHtml(items, isRoot) {
|
|
|
|
|
|
if (!items || items.length === 0) return '';
|
2026-01-16 14:14:51 +08:00
|
|
|
|
var html = isRoot ? '<ul>' : '<ul class="index-subItem-box">';
|
|
|
|
|
|
for (var i = 0; i < items.length; i++) {
|
|
|
|
|
|
var item = items[i];
|
2026-01-15 23:16:24 +08:00
|
|
|
|
html += '<li class="index-item">';
|
|
|
|
|
|
html += '<a href="#' + item.id + '" class="index-link" data-target="' + item.id + '">' + item.text + '</a>';
|
|
|
|
|
|
if (item.children.length > 0) {
|
|
|
|
|
|
html += buildHtml(item.children, false);
|
|
|
|
|
|
}
|
|
|
|
|
|
html += '</li>';
|
|
|
|
|
|
}
|
|
|
|
|
|
html += '</ul>';
|
|
|
|
|
|
return html;
|
2026-01-15 23:14:03 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2026-01-15 23:16:24 +08:00
|
|
|
|
$mobileContainer.html(buildHtml(toc, true));
|
2026-01-15 23:19:37 +08:00
|
|
|
|
console.log('[Mobile Catalog] HTML generated, toc items:', toc.length);
|
2026-01-15 23:16:24 +08:00
|
|
|
|
window.mobileCatalogInitialized = true;
|
2026-01-11 19:48:02 +08:00
|
|
|
|
|
2026-01-15 23:16:24 +08:00
|
|
|
|
// 绑定点击事件
|
|
|
|
|
|
$mobileContainer.off('click.mobileCatalog').on('click.mobileCatalog', '.index-link', function(e) {
|
|
|
|
|
|
e.preventDefault();
|
2026-01-16 14:14:51 +08:00
|
|
|
|
var targetId = $(this).attr('href');
|
2026-01-15 23:16:24 +08:00
|
|
|
|
if (targetId) {
|
2026-01-16 14:14:51 +08:00
|
|
|
|
var $target = $(targetId);
|
2026-01-15 23:16:24 +08:00
|
|
|
|
if ($target.length) {
|
|
|
|
|
|
$mobileContainer.find('.index-item').removeClass('current');
|
|
|
|
|
|
$(this).closest('.index-item').addClass('current');
|
|
|
|
|
|
$('html, body').animate({
|
|
|
|
|
|
scrollTop: $target.offset().top - 80
|
|
|
|
|
|
}, 500, 'easeOutExpo');
|
|
|
|
|
|
// 点击后关闭侧边栏
|
|
|
|
|
|
setTimeout(function() {
|
|
|
|
|
|
$("html").removeClass("leftbar-opened");
|
|
|
|
|
|
}, 150);
|
2026-01-11 19:48:02 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
2026-01-15 23:16:24 +08:00
|
|
|
|
});
|
2026-01-11 19:48:02 +08:00
|
|
|
|
|
2026-01-15 23:16:24 +08:00
|
|
|
|
// 初始化高亮并启动滚动监听
|
|
|
|
|
|
updateMobileCatalogHighlight();
|
|
|
|
|
|
setTimeout(scrollMobileCatalogToActive, 150);
|
2026-01-11 19:48:02 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2026-01-15 23:16:24 +08:00
|
|
|
|
// 更新移动端目录高亮
|
|
|
|
|
|
function updateMobileCatalogHighlight() {
|
2026-01-16 14:14:51 +08:00
|
|
|
|
var $mobileContainer = $("#leftbar_mobile_catalog");
|
|
|
|
|
|
var $postContent = $("#post_content");
|
2026-01-15 23:16:24 +08:00
|
|
|
|
if ($mobileContainer.length === 0 || $postContent.length === 0) return;
|
2026-01-15 23:14:03 +08:00
|
|
|
|
|
2026-01-16 14:14:51 +08:00
|
|
|
|
var scrollTop = $(window).scrollTop();
|
|
|
|
|
|
var $headers = $postContent.find('h1, h2, h3, h4, h5, h6');
|
|
|
|
|
|
var currentId = null;
|
2026-01-15 23:14:03 +08:00
|
|
|
|
|
2026-01-15 23:16:24 +08:00
|
|
|
|
$headers.each(function() {
|
2026-01-16 14:14:51 +08:00
|
|
|
|
var $h = $(this);
|
|
|
|
|
|
var top = $h.offset().top - 100;
|
2026-01-15 23:16:24 +08:00
|
|
|
|
if (scrollTop >= top) {
|
|
|
|
|
|
currentId = $h.attr('id');
|
|
|
|
|
|
}
|
2026-01-15 23:14:03 +08:00
|
|
|
|
});
|
|
|
|
|
|
|
2026-01-15 23:16:24 +08:00
|
|
|
|
if (currentId) {
|
|
|
|
|
|
$mobileContainer.find('.index-item').removeClass('current');
|
|
|
|
|
|
$mobileContainer.find('.index-link[href="#' + currentId + '"]').closest('.index-item').addClass('current');
|
2026-01-15 23:14:03 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-01-11 22:43:57 +08:00
|
|
|
|
// 重置移动端目录状态(供 PJAX 调用)
|
|
|
|
|
|
window.resetMobileCatalog = function() {
|
|
|
|
|
|
window.mobileCatalogInitialized = false;
|
|
|
|
|
|
$("#leftbar_mobile_catalog").empty();
|
|
|
|
|
|
};
|
|
|
|
|
|
|
2026-01-11 19:48:02 +08:00
|
|
|
|
// 滚动目录到当前激活项
|
|
|
|
|
|
function scrollMobileCatalogToActive() {
|
2026-01-16 14:14:51 +08:00
|
|
|
|
var container = $("#leftbar_mobile_catalog");
|
|
|
|
|
|
var activeItem = container.find(".index-item.current");
|
2026-01-11 19:48:02 +08:00
|
|
|
|
if (activeItem.length > 0 && container.length > 0) {
|
2026-01-16 14:14:51 +08:00
|
|
|
|
var containerHeight = container.height();
|
|
|
|
|
|
var itemTop = activeItem.position().top;
|
|
|
|
|
|
var itemHeight = activeItem.outerHeight();
|
|
|
|
|
|
var scrollTop = container.scrollTop();
|
|
|
|
|
|
var targetScroll = scrollTop + itemTop - (containerHeight / 2) + (itemHeight / 2);
|
2026-01-11 19:48:02 +08:00
|
|
|
|
container.stop().animate({
|
|
|
|
|
|
scrollTop: Math.max(0, targetScroll)
|
|
|
|
|
|
}, 300, 'easeOutCubic');
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 监听页面滚动,实时更新移动端目录高亮并自动滚动
|
2026-01-16 14:14:51 +08:00
|
|
|
|
var mobileCatalogScrollTimer = null;
|
2026-01-11 19:48:02 +08:00
|
|
|
|
$(window).on("scroll.mobileCatalog", function() {
|
2026-01-11 22:43:57 +08:00
|
|
|
|
if (!window.mobileCatalogInitialized) return;
|
2026-01-11 19:48:02 +08:00
|
|
|
|
// 节流处理
|
|
|
|
|
|
if (mobileCatalogScrollTimer) return;
|
|
|
|
|
|
mobileCatalogScrollTimer = setTimeout(function() {
|
|
|
|
|
|
mobileCatalogScrollTimer = null;
|
2026-01-15 23:16:24 +08:00
|
|
|
|
// 更新高亮状态
|
|
|
|
|
|
updateMobileCatalogHighlight();
|
2026-01-11 19:48:02 +08:00
|
|
|
|
// 只在侧边栏打开且目录展开时滚动
|
|
|
|
|
|
if ($("html").hasClass("leftbar-opened") &&
|
|
|
|
|
|
$("#mobile_catalog_toggle").closest(".leftbar-mobile-collapse-section").hasClass("expanded")) {
|
|
|
|
|
|
scrollMobileCatalogToActive();
|
|
|
|
|
|
}
|
|
|
|
|
|
}, 150);
|
|
|
|
|
|
});
|
|
|
|
|
|
|
2026-01-15 23:16:24 +08:00
|
|
|
|
// 点击目录项后关闭侧边栏(已在 initMobileCatalog 中处理)
|
2026-01-11 19:48:02 +08:00
|
|
|
|
|
|
|
|
|
|
// ========== 移动端TODO交互 ==========
|
|
|
|
|
|
function updateMobileTodoCount() {
|
2026-01-16 14:14:51 +08:00
|
|
|
|
var count = $("#mobile-todo-list .mobile-todo-item:not(.todo-completed)").length;
|
2026-01-11 19:48:02 +08:00
|
|
|
|
$("#mobile_todo_count").text(count);
|
|
|
|
|
|
// 同步更新桌面端计数
|
|
|
|
|
|
$(".todo-count").text(count);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 添加TODO
|
|
|
|
|
|
$(document).on("click", "#mobile-todo-add-btn", function() {
|
|
|
|
|
|
addMobileTodo();
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
$(document).on("keypress", "#mobile-todo-input", function(e) {
|
|
|
|
|
|
if (e.key === "Enter") {
|
|
|
|
|
|
addMobileTodo();
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
function addMobileTodo() {
|
|
|
|
|
|
if (!window.mobileTodoConfig) return;
|
|
|
|
|
|
|
2026-01-16 14:14:51 +08:00
|
|
|
|
var input = $("#mobile-todo-input");
|
|
|
|
|
|
var content = input.val().trim();
|
2026-01-11 19:48:02 +08:00
|
|
|
|
if (!content) return;
|
|
|
|
|
|
|
2026-01-16 14:14:51 +08:00
|
|
|
|
var btn = $("#mobile-todo-add-btn");
|
2026-01-11 19:48:02 +08:00
|
|
|
|
btn.prop("disabled", true);
|
|
|
|
|
|
|
|
|
|
|
|
$.ajax({
|
|
|
|
|
|
url: window.mobileTodoConfig.ajaxUrl,
|
|
|
|
|
|
type: "POST",
|
|
|
|
|
|
data: {
|
|
|
|
|
|
action: "argon_add_todo",
|
|
|
|
|
|
nonce: window.mobileTodoConfig.nonce,
|
|
|
|
|
|
content: content
|
|
|
|
|
|
},
|
|
|
|
|
|
success: function(res) {
|
|
|
|
|
|
if (res.success) {
|
2026-01-16 14:14:51 +08:00
|
|
|
|
var list = $("#mobile-todo-list");
|
2026-01-11 19:48:02 +08:00
|
|
|
|
list.find(".mobile-todo-empty").remove();
|
|
|
|
|
|
|
2026-01-16 14:14:51 +08:00
|
|
|
|
var newItem = $('<li class="mobile-todo-item" data-id="' + res.data.id + '">' +
|
2026-01-11 19:48:02 +08:00
|
|
|
|
'<span class="mobile-todo-content">' + $("<div>").text(content).html() + '</span>' +
|
|
|
|
|
|
'<button class="mobile-todo-complete-btn" title="完成"><i class="fa fa-check"></i></button>' +
|
|
|
|
|
|
'</li>');
|
|
|
|
|
|
list.prepend(newItem);
|
|
|
|
|
|
|
|
|
|
|
|
input.val("");
|
|
|
|
|
|
updateMobileTodoCount();
|
|
|
|
|
|
|
|
|
|
|
|
// 同步到桌面端
|
|
|
|
|
|
syncTodoToDesktop(res.data.id, content, "add");
|
|
|
|
|
|
}
|
|
|
|
|
|
btn.prop("disabled", false);
|
|
|
|
|
|
},
|
|
|
|
|
|
error: function() {
|
|
|
|
|
|
btn.prop("disabled", false);
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-01-12 10:16:01 +08:00
|
|
|
|
// 移动端 TODO 验证码相关变量
|
2026-01-16 14:14:51 +08:00
|
|
|
|
var mobilePendingUrgeBtn = null;
|
|
|
|
|
|
var mobileGeetestCaptchaObj = null;
|
2026-01-12 10:16:01 +08:00
|
|
|
|
|
2026-01-11 19:48:02 +08:00
|
|
|
|
// 完成/删除/催促TODO
|
|
|
|
|
|
$(document).on("click", "#mobile-todo-list .mobile-todo-complete-btn, #mobile-todo-list .mobile-todo-delete-btn, #mobile-todo-list .mobile-todo-urge-btn", function() {
|
|
|
|
|
|
if (!window.mobileTodoConfig) return;
|
|
|
|
|
|
|
2026-01-16 14:14:51 +08:00
|
|
|
|
var btn = $(this);
|
|
|
|
|
|
var item = btn.closest(".mobile-todo-item");
|
|
|
|
|
|
var id = item.data("id");
|
2026-01-11 19:48:02 +08:00
|
|
|
|
|
|
|
|
|
|
if (btn.hasClass("mobile-todo-complete-btn")) {
|
|
|
|
|
|
btn.prop("disabled", true);
|
|
|
|
|
|
$.ajax({
|
|
|
|
|
|
url: window.mobileTodoConfig.ajaxUrl,
|
|
|
|
|
|
type: "POST",
|
|
|
|
|
|
data: {
|
|
|
|
|
|
action: "argon_complete_todo",
|
|
|
|
|
|
nonce: window.mobileTodoConfig.nonce,
|
|
|
|
|
|
id: id
|
|
|
|
|
|
},
|
|
|
|
|
|
success: function(res) {
|
|
|
|
|
|
if (res.success) {
|
|
|
|
|
|
item.addClass("todo-completed");
|
|
|
|
|
|
btn.replaceWith('<button class="mobile-todo-delete-btn" title="删除"><i class="fa fa-trash"></i></button>');
|
|
|
|
|
|
updateMobileTodoCount();
|
|
|
|
|
|
syncTodoToDesktop(id, "", "complete");
|
|
|
|
|
|
} else {
|
|
|
|
|
|
btn.prop("disabled", false);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
} else if (btn.hasClass("mobile-todo-delete-btn")) {
|
|
|
|
|
|
btn.prop("disabled", true);
|
|
|
|
|
|
$.ajax({
|
|
|
|
|
|
url: window.mobileTodoConfig.ajaxUrl,
|
|
|
|
|
|
type: "POST",
|
|
|
|
|
|
data: {
|
|
|
|
|
|
action: "argon_delete_todo",
|
|
|
|
|
|
nonce: window.mobileTodoConfig.nonce,
|
|
|
|
|
|
id: id
|
|
|
|
|
|
},
|
|
|
|
|
|
success: function(res) {
|
|
|
|
|
|
if (res.success) {
|
|
|
|
|
|
item.addClass("todo-completing");
|
|
|
|
|
|
setTimeout(function() {
|
|
|
|
|
|
item.remove();
|
|
|
|
|
|
updateMobileTodoCount();
|
|
|
|
|
|
if ($("#mobile-todo-list .mobile-todo-item").length === 0) {
|
|
|
|
|
|
$("#mobile-todo-list").html('<li class="mobile-todo-empty">暂无待办事项</li>');
|
|
|
|
|
|
}
|
|
|
|
|
|
}, 350);
|
|
|
|
|
|
syncTodoToDesktop(id, "", "delete");
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
} else if (btn.hasClass("mobile-todo-urge-btn") && !btn.hasClass("urged")) {
|
2026-01-12 10:16:01 +08:00
|
|
|
|
// 检查是否需要验证码
|
|
|
|
|
|
if (window.mobileTodoConfig.needCaptcha) {
|
2026-01-16 14:14:51 +08:00
|
|
|
|
var captchaContainer = $(".mobile-todo-captcha-container");
|
2026-01-12 10:16:01 +08:00
|
|
|
|
if (captchaContainer.length > 0) {
|
|
|
|
|
|
captchaContainer.slideDown(200);
|
|
|
|
|
|
mobilePendingUrgeBtn = btn;
|
|
|
|
|
|
|
|
|
|
|
|
if (window.mobileTodoConfig.captchaType === 'geetest') {
|
|
|
|
|
|
// 极验验证码
|
|
|
|
|
|
if (!mobileGeetestCaptchaObj && typeof initGeetest4 === 'function') {
|
|
|
|
|
|
initGeetest4({
|
|
|
|
|
|
captchaId: window.mobileTodoConfig.geetestId,
|
|
|
|
|
|
product: 'bind'
|
|
|
|
|
|
}, function(captcha) {
|
|
|
|
|
|
mobileGeetestCaptchaObj = captcha;
|
|
|
|
|
|
captcha.onReady(function() {
|
|
|
|
|
|
captcha.showCaptcha();
|
|
|
|
|
|
}).onSuccess(function() {
|
2026-01-16 14:14:51 +08:00
|
|
|
|
var result = captcha.getValidate();
|
2026-01-12 10:16:01 +08:00
|
|
|
|
if (result && mobilePendingUrgeBtn) {
|
2026-01-16 14:14:51 +08:00
|
|
|
|
var urgeId = mobilePendingUrgeBtn.closest(".mobile-todo-item").data("id");
|
2026-01-12 10:16:01 +08:00
|
|
|
|
doMobileUrgeGeetest(mobilePendingUrgeBtn, urgeId, result);
|
|
|
|
|
|
}
|
|
|
|
|
|
}).onError(function() {
|
|
|
|
|
|
captchaContainer.slideUp(200);
|
|
|
|
|
|
mobilePendingUrgeBtn = null;
|
|
|
|
|
|
});
|
|
|
|
|
|
});
|
|
|
|
|
|
} else if (mobileGeetestCaptchaObj) {
|
|
|
|
|
|
mobileGeetestCaptchaObj.showCaptcha();
|
|
|
|
|
|
}
|
2026-01-11 19:48:02 +08:00
|
|
|
|
} else {
|
2026-01-12 10:16:01 +08:00
|
|
|
|
// 数学验证码
|
|
|
|
|
|
$("#mobile-todo-captcha-input").val("").focus();
|
2026-01-11 19:48:02 +08:00
|
|
|
|
}
|
2026-01-12 10:16:01 +08:00
|
|
|
|
return;
|
2026-01-11 19:48:02 +08:00
|
|
|
|
}
|
2026-01-12 10:16:01 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 不需要验证码,直接催促
|
|
|
|
|
|
doMobileUrge(btn, id, "");
|
2026-01-11 19:48:02 +08:00
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
|
2026-01-12 10:16:01 +08:00
|
|
|
|
// 移动端数学验证码提交
|
|
|
|
|
|
$(document).on("click", "#mobile-todo-captcha-submit", function() {
|
|
|
|
|
|
if (!mobilePendingUrgeBtn) return;
|
|
|
|
|
|
|
2026-01-16 14:14:51 +08:00
|
|
|
|
var captchaInput = $("#mobile-todo-captcha-input");
|
|
|
|
|
|
var captchaValue = captchaInput.val().trim();
|
2026-01-12 10:16:01 +08:00
|
|
|
|
|
|
|
|
|
|
if (!captchaValue) {
|
|
|
|
|
|
captchaInput.focus();
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-01-16 14:14:51 +08:00
|
|
|
|
var id = mobilePendingUrgeBtn.closest(".mobile-todo-item").data("id");
|
2026-01-12 10:16:01 +08:00
|
|
|
|
doMobileUrge(mobilePendingUrgeBtn, id, captchaValue);
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
// 移动端验证码回车提交
|
|
|
|
|
|
$(document).on("keypress", "#mobile-todo-captcha-input", function(e) {
|
|
|
|
|
|
if (e.key === "Enter") {
|
|
|
|
|
|
$("#mobile-todo-captcha-submit").click();
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
// 执行移动端催促
|
|
|
|
|
|
function doMobileUrge(btn, id, captcha) {
|
|
|
|
|
|
btn.prop("disabled", true).html('<i class="fa fa-spinner fa-spin"></i>');
|
|
|
|
|
|
|
|
|
|
|
|
$.ajax({
|
|
|
|
|
|
url: window.mobileTodoConfig.ajaxUrl,
|
|
|
|
|
|
type: "POST",
|
|
|
|
|
|
data: {
|
|
|
|
|
|
action: "argon_urge_todo",
|
|
|
|
|
|
nonce: window.mobileTodoConfig.nonce,
|
|
|
|
|
|
id: id,
|
|
|
|
|
|
comment_captcha: captcha
|
|
|
|
|
|
},
|
|
|
|
|
|
success: function(res) {
|
|
|
|
|
|
handleMobileUrgeResponse(btn, res);
|
|
|
|
|
|
},
|
|
|
|
|
|
error: function() {
|
|
|
|
|
|
btn.prop("disabled", false).html('<i class="fa fa-bell"></i>');
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 极验验证码催促
|
|
|
|
|
|
function doMobileUrgeGeetest(btn, id, geetestResult) {
|
|
|
|
|
|
btn.prop("disabled", true).html('<i class="fa fa-spinner fa-spin"></i>');
|
|
|
|
|
|
|
|
|
|
|
|
$.ajax({
|
|
|
|
|
|
url: window.mobileTodoConfig.ajaxUrl,
|
|
|
|
|
|
type: "POST",
|
|
|
|
|
|
data: {
|
|
|
|
|
|
action: "argon_urge_todo",
|
|
|
|
|
|
nonce: window.mobileTodoConfig.nonce,
|
|
|
|
|
|
id: id,
|
|
|
|
|
|
lot_number: geetestResult.lot_number,
|
|
|
|
|
|
captcha_output: geetestResult.captcha_output,
|
|
|
|
|
|
pass_token: geetestResult.pass_token,
|
|
|
|
|
|
gen_time: geetestResult.gen_time
|
|
|
|
|
|
},
|
|
|
|
|
|
success: function(res) {
|
|
|
|
|
|
handleMobileUrgeResponse(btn, res);
|
|
|
|
|
|
if (mobileGeetestCaptchaObj) mobileGeetestCaptchaObj.reset();
|
|
|
|
|
|
},
|
|
|
|
|
|
error: function() {
|
|
|
|
|
|
btn.prop("disabled", false).html('<i class="fa fa-bell"></i>');
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 处理移动端催促响应
|
|
|
|
|
|
function handleMobileUrgeResponse(btn, res) {
|
2026-01-16 14:14:51 +08:00
|
|
|
|
var captchaContainer = $(".mobile-todo-captcha-container");
|
2026-01-12 10:16:01 +08:00
|
|
|
|
|
|
|
|
|
|
if (res.success) {
|
|
|
|
|
|
btn.addClass("urged").html('<i class="fa fa-check"></i>');
|
|
|
|
|
|
captchaContainer.slideUp(200);
|
|
|
|
|
|
mobilePendingUrgeBtn = null;
|
|
|
|
|
|
|
|
|
|
|
|
// 更新验证码文本
|
|
|
|
|
|
if (res.data && res.data.captcha) {
|
|
|
|
|
|
$(".mobile-todo-captcha-text").text(res.data.captcha);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 同步到桌面端
|
2026-01-16 14:14:51 +08:00
|
|
|
|
var id = btn.closest(".mobile-todo-item").data("id");
|
2026-01-12 10:16:01 +08:00
|
|
|
|
syncTodoToDesktop(id, "", "urge");
|
|
|
|
|
|
|
|
|
|
|
|
// 显示成功提示
|
|
|
|
|
|
if (typeof iziToast !== 'undefined') {
|
|
|
|
|
|
iziToast.success({
|
|
|
|
|
|
title: '',
|
|
|
|
|
|
message: res.data && res.data.message ? res.data.message : '已提醒',
|
|
|
|
|
|
position: 'topRight',
|
|
|
|
|
|
timeout: 3000
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
} else {
|
|
|
|
|
|
btn.prop("disabled", false).html('<i class="fa fa-bell"></i>');
|
|
|
|
|
|
|
|
|
|
|
|
// 显示错误提示
|
|
|
|
|
|
if (typeof iziToast !== 'undefined') {
|
|
|
|
|
|
iziToast.error({
|
|
|
|
|
|
title: '',
|
|
|
|
|
|
message: res.data || '操作失败',
|
|
|
|
|
|
position: 'topRight',
|
|
|
|
|
|
timeout: 3000
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 刷新验证码
|
|
|
|
|
|
if (res.data && res.data.captcha) {
|
|
|
|
|
|
$(".mobile-todo-captcha-text").text(res.data.captcha);
|
|
|
|
|
|
}
|
|
|
|
|
|
$("#mobile-todo-captcha-input").val("").focus();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-01-11 19:48:02 +08:00
|
|
|
|
// 同步TODO操作到桌面端
|
|
|
|
|
|
function syncTodoToDesktop(id, content, action) {
|
2026-01-16 14:14:51 +08:00
|
|
|
|
var desktopList = $("#todo-list");
|
2026-01-11 19:48:02 +08:00
|
|
|
|
if (desktopList.length === 0) return;
|
|
|
|
|
|
|
|
|
|
|
|
if (action === "add") {
|
|
|
|
|
|
desktopList.find(".todo-empty").remove();
|
2026-01-16 14:14:51 +08:00
|
|
|
|
var newItem = $('<li class="todo-item" data-id="' + id + '">' +
|
2026-01-11 19:48:02 +08:00
|
|
|
|
'<span class="todo-content">' + $("<div>").text(content).html() + '</span>' +
|
|
|
|
|
|
'<button class="todo-complete-btn" title="完成"><i class="fa fa-check"></i></button>' +
|
|
|
|
|
|
'</li>');
|
|
|
|
|
|
desktopList.prepend(newItem);
|
|
|
|
|
|
} else if (action === "complete") {
|
2026-01-16 14:14:51 +08:00
|
|
|
|
var item = desktopList.find('.todo-item[data-id="' + id + '"]');
|
2026-01-11 19:48:02 +08:00
|
|
|
|
item.addClass("todo-completed");
|
|
|
|
|
|
item.find(".todo-complete-btn").replaceWith('<button class="todo-delete-btn" title="删除"><i class="fa fa-trash"></i></button>');
|
|
|
|
|
|
} else if (action === "delete") {
|
|
|
|
|
|
desktopList.find('.todo-item[data-id="' + id + '"]').remove();
|
|
|
|
|
|
} else if (action === "urge") {
|
2026-01-16 14:14:51 +08:00
|
|
|
|
var urgeBtn = desktopList.find('.todo-item[data-id="' + id + '"] .todo-urge-btn');
|
2026-01-11 19:48:02 +08:00
|
|
|
|
urgeBtn.addClass("urged").prop("disabled", true).html('<i class="fa fa-check"></i>');
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}();
|
|
|
|
|
|
|
|
|
|
|
|
/*折叠区块小工具*/
|
|
|
|
|
|
$(document).on("click" , ".collapse-block .collapse-block-title" , function(){
|
|
|
|
|
|
let block = $(this).parent();
|
|
|
|
|
|
$(block).toggleClass("collapsed");
|
|
|
|
|
|
let inner = $(".collapse-block-body", block);
|
|
|
|
|
|
if (block.hasClass("collapsed")){
|
2026-01-12 00:15:20 +08:00
|
|
|
|
inner.stop(true, false).slideUp(250, 'easeOutCirc');
|
2026-01-11 19:48:02 +08:00
|
|
|
|
}else{
|
|
|
|
|
|
inner.stop(true, false).slideDown(300, 'easeOutCirc');
|
|
|
|
|
|
}
|
|
|
|
|
|
$("html").trigger("scroll");
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
/*获得 Github Repo Shortcode 信息卡内容*/
|
|
|
|
|
|
function getGithubInfoCardContent(){
|
|
|
|
|
|
$(".github-info-card").each(function(){
|
|
|
|
|
|
(function($this){
|
2026-01-16 14:14:51 +08:00
|
|
|
|
if ($this.attr("data-getdata") == "backend"){
|
2026-01-11 19:48:02 +08:00
|
|
|
|
$(".github-info-card-description" , $this).html($this.attr("data-description"));
|
|
|
|
|
|
$(".github-info-card-stars" , $this).html($this.attr("data-stars"));
|
|
|
|
|
|
$(".github-info-card-forks" , $this).html($this.attr("data-forks"));
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
$(".github-info-card-description" , $this).html("Loading...");
|
|
|
|
|
|
$(".github-info-card-stars" , $this).html("-");
|
|
|
|
|
|
$(".github-info-card-forks" , $this).html("-");
|
|
|
|
|
|
author = $this.attr("data-author");
|
|
|
|
|
|
project = $this.attr("data-project");
|
|
|
|
|
|
$.ajax({
|
|
|
|
|
|
url : "https://api.github.com/repos/" + author + "/" + project,
|
|
|
|
|
|
type : "GET",
|
|
|
|
|
|
dataType : "json",
|
|
|
|
|
|
success : function(result){
|
|
|
|
|
|
description = result.description;
|
2026-01-16 14:14:51 +08:00
|
|
|
|
if (result.homepage != "" && result.homepage != null){
|
2026-01-11 19:48:02 +08:00
|
|
|
|
description += " <a href='" + result.homepage + "' target='_blank' no-pjax>" + result.homepage + "</a>"
|
|
|
|
|
|
}
|
|
|
|
|
|
$(".github-info-card-description" , $this).html(description);
|
|
|
|
|
|
$(".github-info-card-stars" , $this).html(result.stargazers_count);
|
|
|
|
|
|
$(".github-info-card-forks" , $this).html(result.forks_count);
|
|
|
|
|
|
},
|
|
|
|
|
|
error : function(xhr){
|
2026-01-16 14:14:51 +08:00
|
|
|
|
if (xhr.status == 404){
|
2026-01-11 19:48:02 +08:00
|
|
|
|
$(".github-info-card-description" , $this).html(__("找不到该 Repo"));
|
|
|
|
|
|
}else{
|
|
|
|
|
|
$(".github-info-card-description" , $this).html(__("获取 Repo 信息失败"));
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
})($(this));
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
getGithubInfoCardContent();
|
|
|
|
|
|
|
|
|
|
|
|
/*说说点赞*/
|
|
|
|
|
|
$(document).on("click" , ".shuoshuo-upvote" , function(){
|
|
|
|
|
|
$this = $(this);
|
|
|
|
|
|
ID = $this.attr("data-id");
|
|
|
|
|
|
$this.addClass("shuoshuo-upvoting");
|
|
|
|
|
|
$.ajax({
|
|
|
|
|
|
url : argonConfig.wp_path + "wp-admin/admin-ajax.php",
|
|
|
|
|
|
type : "POST",
|
|
|
|
|
|
dataType : "json",
|
|
|
|
|
|
data : {
|
|
|
|
|
|
action: "upvote_shuoshuo",
|
|
|
|
|
|
shuoshuo_id : ID,
|
|
|
|
|
|
},
|
|
|
|
|
|
success : function(result){
|
|
|
|
|
|
$this.removeClass("shuoshuo-upvoting");
|
2026-01-16 14:14:51 +08:00
|
|
|
|
if (result.status == "success"){
|
2026-01-11 19:48:02 +08:00
|
|
|
|
$(".shuoshuo-upvote-num" , $this).html(result.total_upvote);
|
|
|
|
|
|
$("i.fa-thumbs-o-up" , $this).addClass("fa-thumbs-up").removeClass("fa-thumbs-o-up");
|
|
|
|
|
|
$this.addClass("upvoted");
|
|
|
|
|
|
$this.addClass("shuoshuo-upvoted-animation");
|
|
|
|
|
|
iziToast.show({
|
|
|
|
|
|
title: result.msg,
|
|
|
|
|
|
class: 'shadow-sm',
|
|
|
|
|
|
position: 'topRight',
|
|
|
|
|
|
backgroundColor: '#2dce89',
|
|
|
|
|
|
titleColor: '#ffffff',
|
|
|
|
|
|
messageColor: '#ffffff',
|
|
|
|
|
|
iconColor: '#ffffff',
|
|
|
|
|
|
progressBarColor: '#ffffff',
|
|
|
|
|
|
icon: 'fa fa-check',
|
|
|
|
|
|
timeout: 5000
|
|
|
|
|
|
});
|
|
|
|
|
|
}else{
|
|
|
|
|
|
$(".shuoshuo-upvote-num" , $this).html(result.total_upvote);
|
|
|
|
|
|
iziToast.show({
|
|
|
|
|
|
title: result.msg,
|
|
|
|
|
|
class: 'shadow-sm',
|
|
|
|
|
|
position: 'topRight',
|
|
|
|
|
|
backgroundColor: '#f5365c',
|
|
|
|
|
|
titleColor: '#ffffff',
|
|
|
|
|
|
messageColor: '#ffffff',
|
|
|
|
|
|
iconColor: '#ffffff',
|
|
|
|
|
|
progressBarColor: '#ffffff',
|
|
|
|
|
|
icon: 'fa fa-close',
|
|
|
|
|
|
timeout: 5000
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
error : function(xhr){
|
|
|
|
|
|
$this.removeClass("shuoshuo-upvoting");
|
|
|
|
|
|
iziToast.show({
|
|
|
|
|
|
title: __("点赞失败"),
|
|
|
|
|
|
class: 'shadow-sm',
|
|
|
|
|
|
position: 'topRight',
|
|
|
|
|
|
backgroundColor: '#f5365c',
|
|
|
|
|
|
titleColor: '#ffffff',
|
|
|
|
|
|
messageColor: '#ffffff',
|
|
|
|
|
|
iconColor: '#ffffff',
|
|
|
|
|
|
progressBarColor: '#ffffff',
|
|
|
|
|
|
icon: 'fa fa-close',
|
|
|
|
|
|
timeout: 5000
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
});
|
|
|
|
|
|
//折叠长说说
|
|
|
|
|
|
function foldLongShuoshuo(){
|
2026-01-16 14:14:51 +08:00
|
|
|
|
if (argonConfig.fold_long_shuoshuo == false){
|
2026-01-11 19:48:02 +08:00
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
$("#main .shuoshuo-foldable > .shuoshuo-content").each(function(){
|
|
|
|
|
|
if ($(this).hasClass("shuoshuo-unfolded")){
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
if (this.clientHeight > 400){
|
|
|
|
|
|
$(this).addClass("shuoshuo-folded");
|
|
|
|
|
|
$(this).append("<div class='show-full-shuoshuo'><button class='btn btn-outline-primary'><i class='fa fa-angle-down' aria-hidden='true'></i> " + __("展开") + "</button></div>");
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
foldLongShuoshuo();
|
|
|
|
|
|
$(document).on("click" , ".show-full-shuoshuo" , function(){
|
|
|
|
|
|
$(this).parent().removeClass("shuoshuo-folded").addClass("shuoshuo-unfolded");
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
//颜色计算
|
|
|
|
|
|
function rgb2hsl(R,G,B){
|
|
|
|
|
|
let r = R / 255;
|
|
|
|
|
|
let g = G / 255;
|
|
|
|
|
|
let b = B / 255;
|
|
|
|
|
|
|
|
|
|
|
|
let var_Min = Math.min(r, g, b);
|
|
|
|
|
|
let var_Max = Math.max(r, g, b);
|
|
|
|
|
|
let del_Max = var_Max - var_Min;
|
|
|
|
|
|
|
|
|
|
|
|
let H, S, L = (var_Max + var_Min) / 2;
|
|
|
|
|
|
|
2026-01-16 14:14:51 +08:00
|
|
|
|
if (del_Max == 0){
|
2026-01-11 19:48:02 +08:00
|
|
|
|
H = 0;
|
|
|
|
|
|
S = 0;
|
|
|
|
|
|
}else{
|
|
|
|
|
|
if (L < 0.5){
|
|
|
|
|
|
S = del_Max / (var_Max + var_Min);
|
|
|
|
|
|
}else{
|
|
|
|
|
|
S = del_Max / (2 - var_Max - var_Min);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
del_R = (((var_Max - r) / 6) + (del_Max / 2)) / del_Max;
|
|
|
|
|
|
del_G = (((var_Max - g) / 6) + (del_Max / 2)) / del_Max;
|
|
|
|
|
|
del_B = (((var_Max - b) / 6) + (del_Max / 2)) / del_Max;
|
|
|
|
|
|
|
2026-01-16 14:14:51 +08:00
|
|
|
|
if (r == var_Max){
|
2026-01-11 19:48:02 +08:00
|
|
|
|
H = del_B - del_G;
|
|
|
|
|
|
}
|
2026-01-16 14:14:51 +08:00
|
|
|
|
else if (g == var_Max){
|
2026-01-11 19:48:02 +08:00
|
|
|
|
H = (1 / 3) + del_R - del_B;
|
|
|
|
|
|
}
|
2026-01-16 14:14:51 +08:00
|
|
|
|
else if (b == var_Max){
|
2026-01-11 19:48:02 +08:00
|
|
|
|
H = (2 / 3) + del_G - del_R;
|
|
|
|
|
|
}
|
|
|
|
|
|
if (H < 0) H += 1;
|
|
|
|
|
|
if (H > 1) H -= 1;
|
|
|
|
|
|
}
|
|
|
|
|
|
return {
|
|
|
|
|
|
'h': H,//0~1
|
|
|
|
|
|
's': S,
|
|
|
|
|
|
'l': L,
|
|
|
|
|
|
'H': Math.round(H * 360),//0~360
|
|
|
|
|
|
'S': Math.round(S * 100),//0~100
|
|
|
|
|
|
'L': Math.round(L * 100),//0~100
|
|
|
|
|
|
};
|
|
|
|
|
|
}
|
|
|
|
|
|
function Hue_2_RGB(v1,v2,vH){
|
|
|
|
|
|
if (vH < 0) vH += 1;
|
|
|
|
|
|
if (vH > 1) vH -= 1;
|
|
|
|
|
|
if ((6 * vH) < 1) return (v1 + (v2 - v1) * 6 * vH);
|
|
|
|
|
|
if ((2 * vH) < 1) return v2;
|
|
|
|
|
|
if ((3 * vH) < 2) return (v1 + (v2 - v1) * ((2 / 3) - vH) * 6);
|
|
|
|
|
|
return v1;
|
|
|
|
|
|
}
|
|
|
|
|
|
function hsl2rgb(h,s,l){
|
|
|
|
|
|
let r, g, b, var_1, var_2;
|
2026-01-16 14:14:51 +08:00
|
|
|
|
if (s == 0){
|
2026-01-11 19:48:02 +08:00
|
|
|
|
r = l;
|
|
|
|
|
|
g = l;
|
|
|
|
|
|
b = l;
|
|
|
|
|
|
}
|
|
|
|
|
|
else{
|
|
|
|
|
|
if (l < 0.5){
|
|
|
|
|
|
var_2 = l * (1 + s);
|
|
|
|
|
|
}
|
|
|
|
|
|
else{
|
|
|
|
|
|
var_2 = (l + s) - (s * l);
|
|
|
|
|
|
}
|
|
|
|
|
|
var_1 = 2 * l - var_2;
|
|
|
|
|
|
r = Hue_2_RGB(var_1, var_2, h + (1 / 3));
|
|
|
|
|
|
g = Hue_2_RGB(var_1, var_2, h);
|
|
|
|
|
|
b = Hue_2_RGB(var_1, var_2, h - (1 / 3));
|
|
|
|
|
|
}
|
|
|
|
|
|
return {
|
|
|
|
|
|
'R': Math.round(r * 255),//0~255
|
|
|
|
|
|
'G': Math.round(g * 255),
|
|
|
|
|
|
'B': Math.round(b * 255),
|
|
|
|
|
|
'r': r,//0~1
|
|
|
|
|
|
'g': g,
|
|
|
|
|
|
'b': b
|
|
|
|
|
|
};
|
|
|
|
|
|
}
|
|
|
|
|
|
function rgb2hex(r,g,b){
|
|
|
|
|
|
let hex = new Array('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F');
|
|
|
|
|
|
let rh, gh, bh;
|
|
|
|
|
|
rh = "", gh ="", bh="";
|
|
|
|
|
|
while (rh.length < 2){
|
|
|
|
|
|
rh = hex[r%16] + rh;
|
|
|
|
|
|
r = Math.floor(r / 16);
|
|
|
|
|
|
}
|
|
|
|
|
|
while (gh.length < 2){
|
|
|
|
|
|
gh = hex[g%16] + gh;
|
|
|
|
|
|
g = Math.floor(g / 16);
|
|
|
|
|
|
}
|
|
|
|
|
|
while (bh.length < 2){
|
|
|
|
|
|
bh = hex[b%16] + bh;
|
|
|
|
|
|
b = Math.floor(b / 16);
|
|
|
|
|
|
}
|
|
|
|
|
|
return "#" + rh + gh + bh;
|
|
|
|
|
|
}
|
|
|
|
|
|
function hex2rgb(hex){
|
|
|
|
|
|
//hex: #XXXXXX
|
|
|
|
|
|
let dec = {
|
|
|
|
|
|
'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9, 'A': 10, 'B': 11, 'C': 12, 'D': 13, 'E': 14, 'F': 15
|
|
|
|
|
|
};
|
|
|
|
|
|
return {
|
|
|
|
|
|
'R': (dec[hex.substr(1,1)] * 16 + dec[hex.substr(2,1)]),//0~255
|
|
|
|
|
|
'G': (dec[hex.substr(3,1)] * 16 + dec[hex.substr(4,1)]),
|
|
|
|
|
|
'B': (dec[hex.substr(5,1)] * 16 + dec[hex.substr(6,1)]),
|
|
|
|
|
|
'r': (dec[hex.substr(1,1)] * 16 + dec[hex.substr(2,1)]) / 255,//0~1
|
|
|
|
|
|
'g': (dec[hex.substr(3,1)] * 16 + dec[hex.substr(4,1)]) / 255,
|
|
|
|
|
|
'b': (dec[hex.substr(5,1)] * 16 + dec[hex.substr(6,1)]) / 255
|
|
|
|
|
|
};
|
|
|
|
|
|
}
|
|
|
|
|
|
function rgb2gray(R,G,B){
|
|
|
|
|
|
return Math.round(R * 0.299 + G * 0.587 + B * 0.114);
|
|
|
|
|
|
}
|
|
|
|
|
|
function hex2gray(hex){
|
|
|
|
|
|
let rgb_array = hex2rgb(hex);
|
|
|
|
|
|
return hex2gray(rgb_array['R'], rgb_array['G'], rgb_array['B']);
|
|
|
|
|
|
}
|
|
|
|
|
|
function rgb2str(rgb){
|
|
|
|
|
|
return rgb['R'] + "," + rgb['G'] + "," + rgb['B'];
|
|
|
|
|
|
}
|
|
|
|
|
|
function hex2str(hex){
|
|
|
|
|
|
return rgb2str(hex2rgb(hex));
|
|
|
|
|
|
}
|
|
|
|
|
|
//颜色选择器 & 切换主题色
|
2026-01-16 14:14:51 +08:00
|
|
|
|
if ($("meta[name='argon-enable-custom-theme-color']").attr("content") == 'true'){
|
2026-01-11 19:48:02 +08:00
|
|
|
|
let themeColorPicker = new Pickr({
|
|
|
|
|
|
el: '#theme-color-picker',
|
|
|
|
|
|
container: 'body',
|
|
|
|
|
|
theme: 'monolith',
|
|
|
|
|
|
closeOnScroll: false,
|
|
|
|
|
|
appClass: 'theme-color-picker-box',
|
|
|
|
|
|
useAsButton: false,
|
|
|
|
|
|
padding: 8,
|
|
|
|
|
|
inline: false,
|
|
|
|
|
|
autoReposition: true,
|
|
|
|
|
|
sliders: 'h',
|
|
|
|
|
|
disabled: false,
|
|
|
|
|
|
lockOpacity: true,
|
|
|
|
|
|
outputPrecision: 0,
|
|
|
|
|
|
comparison: false,
|
|
|
|
|
|
default: $("meta[name='theme-color']").attr("content"),
|
|
|
|
|
|
swatches: ['#5e72e4', '#fa7298', '#009688', '#607d8b', '#2196f3', '#3f51b5', '#ff9700', '#109d58', '#dc4437', '#673bb7', '#212121', '#795547'],
|
|
|
|
|
|
defaultRepresentation: 'HEX',
|
|
|
|
|
|
showAlways: false,
|
|
|
|
|
|
closeWithKey: 'Escape',
|
|
|
|
|
|
position: 'top-start',
|
|
|
|
|
|
adjustableNumbers: false,
|
|
|
|
|
|
components: {
|
|
|
|
|
|
palette: true,
|
|
|
|
|
|
preview: true,
|
|
|
|
|
|
opacity: false,
|
|
|
|
|
|
hue: true,
|
|
|
|
|
|
interaction: {
|
|
|
|
|
|
hex: true,
|
|
|
|
|
|
rgba: true,
|
|
|
|
|
|
hsla: false,
|
|
|
|
|
|
hsva: false,
|
|
|
|
|
|
cmyk: false,
|
|
|
|
|
|
input: true,
|
|
|
|
|
|
clear: false,
|
|
|
|
|
|
cancel: true,
|
|
|
|
|
|
save: true
|
|
|
|
|
|
}
|
|
|
|
|
|
},
|
|
|
|
|
|
strings: {
|
|
|
|
|
|
save: __('确定'),
|
|
|
|
|
|
clear: __('清除'),
|
|
|
|
|
|
cancel: __('恢复博客默认')
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
themeColorPicker.on('change', instance => {
|
|
|
|
|
|
updateThemeColor(pickrObjectToHEX(instance), true);
|
|
|
|
|
|
})
|
|
|
|
|
|
themeColorPicker.on('save', (color, instance) => {
|
|
|
|
|
|
updateThemeColor(pickrObjectToHEX(instance._color), true);
|
|
|
|
|
|
themeColorPicker.hide();
|
|
|
|
|
|
})
|
|
|
|
|
|
themeColorPicker.on('cancel', instance => {
|
|
|
|
|
|
themeColorPicker.hide();
|
|
|
|
|
|
themeColorPicker.setColor($("meta[name='theme-color-origin']").attr("content").toUpperCase());
|
|
|
|
|
|
updateThemeColor($("meta[name='theme-color-origin']").attr("content").toUpperCase(), false);
|
|
|
|
|
|
setCookie("argon_custom_theme_color", "", 0);
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
function pickrObjectToHEX(color){
|
|
|
|
|
|
let HEXA = color.toHEXA();
|
|
|
|
|
|
return ("#" + HEXA[0] + HEXA[1] + HEXA[2]).toUpperCase();
|
|
|
|
|
|
}
|
|
|
|
|
|
function updateThemeColor(color, setcookie){
|
|
|
|
|
|
let themecolor = color;
|
|
|
|
|
|
let themecolor_rgbstr = hex2str(themecolor);
|
|
|
|
|
|
let RGB = hex2rgb(themecolor);
|
|
|
|
|
|
let HSL = rgb2hsl(RGB['R'], RGB['G'], RGB['B']);
|
|
|
|
|
|
|
|
|
|
|
|
document.documentElement.style.setProperty('--themecolor', themecolor);
|
|
|
|
|
|
document.documentElement.style.setProperty('--themecolor-R', RGB['R']);
|
|
|
|
|
|
document.documentElement.style.setProperty('--themecolor-G', RGB['G']);
|
|
|
|
|
|
document.documentElement.style.setProperty('--themecolor-B', RGB['B']);
|
|
|
|
|
|
document.documentElement.style.setProperty('--themecolor-H', HSL['H']);
|
|
|
|
|
|
document.documentElement.style.setProperty('--themecolor-S', HSL['S']);
|
|
|
|
|
|
document.documentElement.style.setProperty('--themecolor-L', HSL['L']);
|
|
|
|
|
|
|
2026-01-16 14:14:51 +08:00
|
|
|
|
|
|
|
|
|
|
if (rgb2gray(RGB['R'], RGB['G'], RGB['B']) < 50){
|
2026-01-11 19:48:02 +08:00
|
|
|
|
$("html").addClass("themecolor-toodark");
|
|
|
|
|
|
}else{
|
|
|
|
|
|
$("html").removeClass("themecolor-toodark");
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
$("meta[name='theme-color']").attr("content", themecolor);
|
|
|
|
|
|
$("meta[name='theme-color-rgb']").attr("content", themecolor_rgbstr);
|
|
|
|
|
|
|
|
|
|
|
|
if (setcookie){
|
|
|
|
|
|
setCookie("argon_custom_theme_color", themecolor, 365);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*打字效果*/
|
|
|
|
|
|
function typeEffect($element, text, now, interval){
|
|
|
|
|
|
if (now > text.length){
|
|
|
|
|
|
setTimeout(function(){
|
|
|
|
|
|
$element.removeClass("typing-effect");
|
|
|
|
|
|
}, 1000);
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
$element[0].innerText = text.substring(0, now);
|
|
|
|
|
|
setTimeout(function(){typeEffect($element, text, now + 1, interval)}, interval);
|
|
|
|
|
|
}
|
|
|
|
|
|
function startTypeEffect($element, text, interval){
|
|
|
|
|
|
$element.addClass("typing-effect");
|
|
|
|
|
|
$element.attr("style", "--animation-cnt: " + Math.ceil(text.length * interval / 1000));
|
|
|
|
|
|
typeEffect($element, text, 1, interval);
|
|
|
|
|
|
}
|
|
|
|
|
|
!function(){
|
2026-01-16 14:14:51 +08:00
|
|
|
|
if ($(".banner-title").data("interval") != undefined){
|
2026-01-11 19:48:02 +08:00
|
|
|
|
let interval = $(".banner-title").data("interval");
|
|
|
|
|
|
let $title = $(".banner-title-inner");
|
|
|
|
|
|
let $subTitle = $(".banner-subtitle");
|
|
|
|
|
|
startTypeEffect($title, $title.data("text"), interval);
|
|
|
|
|
|
if (!$subTitle.length){
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
setTimeout(function(){startTypeEffect($subTitle, $subTitle.data("text"), interval);}, Math.ceil($title.data("text").length * interval / 1000) * 1000);
|
|
|
|
|
|
}
|
|
|
|
|
|
}();
|
|
|
|
|
|
|
|
|
|
|
|
/*一言*/
|
|
|
|
|
|
if ($(".hitokoto").length > 0){
|
|
|
|
|
|
$.ajax({
|
|
|
|
|
|
type: 'GET',
|
|
|
|
|
|
url: "https://v1.hitokoto.cn",
|
|
|
|
|
|
success: function(result){
|
|
|
|
|
|
$(".hitokoto").text(result.hitokoto);
|
|
|
|
|
|
},
|
|
|
|
|
|
error: function(result){
|
|
|
|
|
|
$(".hitokoto").text(__("Hitokoto 获取失败"));
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*Highlight.js*/
|
|
|
|
|
|
function randomString(len) {
|
|
|
|
|
|
len = len || 32;
|
|
|
|
|
|
let chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
|
|
|
|
|
|
let res = "";
|
|
|
|
|
|
for (let i = 0; i < len; i++) {
|
|
|
|
|
|
res += chars.charAt(Math.floor(Math.random() * chars.length));
|
|
|
|
|
|
}
|
|
|
|
|
|
res[0] = chars.charAt(Math.floor(Math.random() * (chars.length - 10)));
|
|
|
|
|
|
return res;
|
|
|
|
|
|
}
|
2026-01-16 14:14:51 +08:00
|
|
|
|
var codeOfBlocks = {};
|
2026-01-11 19:48:02 +08:00
|
|
|
|
function getCodeFromBlock(block){
|
2026-01-16 14:14:51 +08:00
|
|
|
|
if (codeOfBlocks[block.id] != undefined){
|
2026-01-11 19:48:02 +08:00
|
|
|
|
return codeOfBlocks[block.id];
|
|
|
|
|
|
}
|
|
|
|
|
|
let lines = $(".hljs-ln-code", block);
|
|
|
|
|
|
let res = "";
|
|
|
|
|
|
for (let i = 0; i < lines.length - 1; i++){
|
|
|
|
|
|
res += lines[i].innerText;
|
|
|
|
|
|
res += "\n";
|
|
|
|
|
|
}
|
|
|
|
|
|
res += lines[lines.length - 1].innerText;
|
|
|
|
|
|
codeOfBlocks[block.id] = res;
|
|
|
|
|
|
return res;
|
|
|
|
|
|
}
|
|
|
|
|
|
function highlightJsRender(){
|
2026-01-16 14:14:51 +08:00
|
|
|
|
if (typeof(hljs) == "undefined"){
|
2026-01-11 19:48:02 +08:00
|
|
|
|
return;
|
|
|
|
|
|
}
|
2026-01-16 14:14:51 +08:00
|
|
|
|
if (typeof(argonConfig.code_highlight.enable) == "undefined"){
|
2026-01-11 19:48:02 +08:00
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
if (!argonConfig.code_highlight.enable){
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
$("article pre.code").each(function(index, block) {
|
|
|
|
|
|
if ($(block).hasClass("no-hljs")){
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
$(block).html("<code>" + $(block).html() + "</code>");
|
|
|
|
|
|
});
|
|
|
|
|
|
$("article pre > code").each(function(index, block) {
|
|
|
|
|
|
if ($(block).hasClass("no-hljs")){
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
$(block).parent().attr("id", randomString());
|
|
|
|
|
|
hljs.highlightBlock(block);
|
|
|
|
|
|
hljs.lineNumbersBlock(block, {singleLine: true});
|
|
|
|
|
|
$(block).parent().addClass("hljs-codeblock");
|
|
|
|
|
|
if (argonConfig.code_highlight.hide_linenumber){
|
|
|
|
|
|
$(block).parent().addClass("hljs-hide-linenumber");
|
|
|
|
|
|
}
|
|
|
|
|
|
if (argonConfig.code_highlight.break_line){
|
|
|
|
|
|
$(block).parent().addClass("hljs-break-line");
|
|
|
|
|
|
}
|
|
|
|
|
|
if (argonConfig.code_highlight.transparent_linenumber){
|
|
|
|
|
|
$(block).parent().addClass("hljs-transparent-linenumber");
|
|
|
|
|
|
}
|
|
|
|
|
|
$(block).attr("hljs-codeblock-inner", "");
|
|
|
|
|
|
let copyBtnID = "copy_btn_" + randomString();
|
|
|
|
|
|
$(block).parent().append(`<div class="hljs-control hljs hljs-title">
|
|
|
|
|
|
<div class="hljs-control-btn hljs-control-toggle-linenumber" tooltip-hide-linenumber="` + __("隐藏行号") + `" tooltip-show-linenumber="` + __("显示行号") + `">
|
|
|
|
|
|
<i class="fa fa-list"></i>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<div class="hljs-control-btn hljs-control-toggle-break-line" tooltip-enable-breakline="` + __("开启折行") + `" tooltip-disable-breakline="` + __("关闭折行") + `">
|
|
|
|
|
|
<i class="fa fa-align-left"></i>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<div class="hljs-control-btn hljs-control-copy" id=` + copyBtnID + ` tooltip="` + __("复制") + `">
|
|
|
|
|
|
<i class="fa fa-clipboard"></i>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<div class="hljs-control-btn hljs-control-fullscreen" tooltip-fullscreen="` + __("全屏") + `" tooltip-exit-fullscreen="` + __("退出全屏") + `">
|
|
|
|
|
|
<i class="fa fa-arrows-alt"></i>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
</div>`);
|
|
|
|
|
|
let clipboard = new ClipboardJS("#" + copyBtnID, {
|
|
|
|
|
|
text: function(trigger) {
|
|
|
|
|
|
return getCodeFromBlock($(block).parent()[0]);
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
clipboard.on('success', function(e) {
|
|
|
|
|
|
iziToast.show({
|
|
|
|
|
|
title: __("复制成功"),
|
|
|
|
|
|
message: __("代码已复制到剪贴板"),
|
|
|
|
|
|
class: 'shadow',
|
|
|
|
|
|
position: 'topRight',
|
|
|
|
|
|
backgroundColor: '#2dce89',
|
|
|
|
|
|
titleColor: '#ffffff',
|
|
|
|
|
|
messageColor: '#ffffff',
|
|
|
|
|
|
iconColor: '#ffffff',
|
|
|
|
|
|
progressBarColor: '#ffffff',
|
|
|
|
|
|
icon: 'fa fa-check',
|
|
|
|
|
|
timeout: 5000
|
|
|
|
|
|
});
|
|
|
|
|
|
});
|
|
|
|
|
|
clipboard.on('error', function(e) {
|
|
|
|
|
|
iziToast.show({
|
|
|
|
|
|
title: __("复制失败"),
|
|
|
|
|
|
message: __("请手动复制代码"),
|
|
|
|
|
|
class: 'shadow',
|
|
|
|
|
|
position: 'topRight',
|
|
|
|
|
|
backgroundColor: '#f5365c',
|
|
|
|
|
|
titleColor: '#ffffff',
|
|
|
|
|
|
messageColor: '#ffffff',
|
|
|
|
|
|
iconColor: '#ffffff',
|
|
|
|
|
|
progressBarColor: '#ffffff',
|
|
|
|
|
|
icon: 'fa fa-close',
|
|
|
|
|
|
timeout: 5000
|
|
|
|
|
|
});
|
|
|
|
|
|
});
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
$(document).ready(function(){
|
|
|
|
|
|
highlightJsRender();
|
|
|
|
|
|
waterflowInit();
|
|
|
|
|
|
});
|
|
|
|
|
|
$(document).on("click" , ".hljs-control-fullscreen" , function(){
|
|
|
|
|
|
let block = $(this).parent().parent();
|
|
|
|
|
|
block.toggleClass("hljs-codeblock-fullscreen");
|
|
|
|
|
|
if (block.hasClass("hljs-codeblock-fullscreen")){
|
|
|
|
|
|
$("html").addClass("noscroll codeblock-fullscreen");
|
|
|
|
|
|
}else{
|
|
|
|
|
|
$("html").removeClass("noscroll codeblock-fullscreen");
|
|
|
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
$(document).on("click" , ".hljs-control-toggle-break-line" , function(){
|
|
|
|
|
|
let block = $(this).parent().parent();
|
|
|
|
|
|
block.toggleClass("hljs-break-line");
|
|
|
|
|
|
});
|
|
|
|
|
|
$(document).on("click" , ".hljs-control-toggle-linenumber" , function(){
|
|
|
|
|
|
let block = $(this).parent().parent();
|
|
|
|
|
|
block.toggleClass("hljs-hide-linenumber");
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
/*时间差计算*/
|
|
|
|
|
|
function addPreZero(num, n) {
|
2026-01-16 14:14:51 +08:00
|
|
|
|
var len = num.toString().length;
|
2026-01-11 19:48:02 +08:00
|
|
|
|
while(len < n) {
|
|
|
|
|
|
num = "0" + num;
|
|
|
|
|
|
len++;
|
|
|
|
|
|
}
|
|
|
|
|
|
return num;
|
|
|
|
|
|
}
|
|
|
|
|
|
function humanTimeDiff(time){
|
|
|
|
|
|
let now = new Date();
|
|
|
|
|
|
time = new Date(time);
|
|
|
|
|
|
let delta = now - time;
|
|
|
|
|
|
if (delta < 0){
|
|
|
|
|
|
delta = 0;
|
|
|
|
|
|
}
|
|
|
|
|
|
if (delta < 1000 * 60){
|
|
|
|
|
|
return __("刚刚");
|
|
|
|
|
|
}
|
|
|
|
|
|
if (delta < 1000 * 60 * 60){
|
|
|
|
|
|
return parseInt(delta / (1000 * 60)) + " " + __("分钟前");
|
|
|
|
|
|
}
|
|
|
|
|
|
if (delta < 1000 * 60 * 60 * 24){
|
|
|
|
|
|
return parseInt(delta / (1000 * 60 * 60)) + " " + __("小时前");
|
|
|
|
|
|
}
|
|
|
|
|
|
let yesterday = new Date(now - 1000 * 60 * 60 * 24);
|
|
|
|
|
|
yesterday.setHours(0);
|
|
|
|
|
|
yesterday.setMinutes(0);
|
|
|
|
|
|
yesterday.setSeconds(0);
|
|
|
|
|
|
yesterday.setMilliseconds(0);
|
|
|
|
|
|
if (time > yesterday){
|
|
|
|
|
|
return __("昨天") + " " + time.getHours() + ":" + addPreZero(time.getMinutes(), 2);
|
|
|
|
|
|
}
|
|
|
|
|
|
let theDayBeforeYesterday = new Date(now - 1000 * 60 * 60 * 24 * 2);
|
|
|
|
|
|
theDayBeforeYesterday.setHours(0);
|
|
|
|
|
|
theDayBeforeYesterday.setMinutes(0);
|
|
|
|
|
|
theDayBeforeYesterday.setSeconds(0);
|
|
|
|
|
|
theDayBeforeYesterday.setMilliseconds(0);
|
2026-01-16 14:14:51 +08:00
|
|
|
|
if (time > theDayBeforeYesterday && argonConfig.language.indexOf("zh") == 0){
|
2026-01-11 19:48:02 +08:00
|
|
|
|
return __("前天") + " " + time.getHours() + ":" + addPreZero(time.getMinutes(), 2);
|
|
|
|
|
|
}
|
|
|
|
|
|
if (delta < 1000 * 60 * 60 * 24 * 30){
|
|
|
|
|
|
return parseInt(delta / (1000 * 60 * 60 * 24)) + " " + __("天前");
|
|
|
|
|
|
}
|
|
|
|
|
|
let theFirstDayOfThisYear = new Date(now);
|
|
|
|
|
|
theFirstDayOfThisYear.setMonth(0);
|
|
|
|
|
|
theFirstDayOfThisYear.setDate(1);
|
|
|
|
|
|
theFirstDayOfThisYear.setHours(0);
|
|
|
|
|
|
theFirstDayOfThisYear.setMinutes(0);
|
|
|
|
|
|
theFirstDayOfThisYear.setSeconds(0);
|
|
|
|
|
|
theFirstDayOfThisYear.setMilliseconds(0);
|
|
|
|
|
|
if (time > theFirstDayOfThisYear){
|
2026-01-16 14:14:51 +08:00
|
|
|
|
if (argonConfig.dateFormat == "YMD" || argonConfig.dateFormat == "MDY"){
|
2026-01-11 19:48:02 +08:00
|
|
|
|
return (time.getMonth() + 1) + "-" + time.getDate();
|
|
|
|
|
|
}else{
|
|
|
|
|
|
return time.getDate() + "-" + (time.getMonth() + 1);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2026-01-16 14:14:51 +08:00
|
|
|
|
if (argonConfig.dateFormat == "YMD"){
|
2026-01-11 19:48:02 +08:00
|
|
|
|
return time.getFullYear() + "-" + (time.getMonth() + 1) + "-" + time.getDate();
|
2026-01-16 14:14:51 +08:00
|
|
|
|
}else if (argonConfig.dateFormat == "MDY"){
|
2026-01-11 19:48:02 +08:00
|
|
|
|
return time.getDate() + "-" + (time.getMonth() + 1) + "-" + time.getFullYear();
|
2026-01-16 14:14:51 +08:00
|
|
|
|
}else if (argonConfig.dateFormat == "DMY"){
|
2026-01-11 19:48:02 +08:00
|
|
|
|
return time.getDate() + "-" + (time.getMonth() + 1) + "-" + time.getFullYear();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
function calcHumanTimesOnPage(){
|
|
|
|
|
|
$(".human-time").each(function(){
|
|
|
|
|
|
$(this).text(humanTimeDiff(parseInt($(this).data("time")) * 1000));
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
calcHumanTimesOnPage();
|
|
|
|
|
|
setInterval(function(){
|
|
|
|
|
|
calcHumanTimesOnPage()
|
|
|
|
|
|
}, 15000);
|
|
|
|
|
|
|
2026-01-16 14:14:51 +08:00
|
|
|
|
|
2026-01-11 19:48:02 +08:00
|
|
|
|
/*Console*/
|
|
|
|
|
|
!function(){
|
|
|
|
|
|
void 0;
|
|
|
|
|
|
}();
|
2026-01-16 00:40:55 +08:00
|
|
|
|
|
|
|
|
|
|
/* ========== Modern UI Enhancements - 现代化交互动画增强 ========== */
|
|
|
|
|
|
(function() {
|
|
|
|
|
|
'use strict';
|
|
|
|
|
|
|
|
|
|
|
|
// 1. 触摸涟漪效果
|
|
|
|
|
|
function createRipple(event, element) {
|
|
|
|
|
|
if (window.matchMedia('(hover: hover)').matches) return;
|
2026-01-16 14:14:51 +08:00
|
|
|
|
var rect = element.getBoundingClientRect();
|
|
|
|
|
|
var ripple = document.createElement('span');
|
|
|
|
|
|
var size = Math.max(rect.width, rect.height);
|
2026-01-16 00:40:55 +08:00
|
|
|
|
ripple.style.width = ripple.style.height = size + 'px';
|
|
|
|
|
|
ripple.style.left = ((event.clientX || event.touches[0].clientX) - rect.left - size / 2) + 'px';
|
|
|
|
|
|
ripple.style.top = ((event.clientY || event.touches[0].clientY) - rect.top - size / 2) + 'px';
|
|
|
|
|
|
ripple.className = 'touch-ripple';
|
2026-01-16 14:14:51 +08:00
|
|
|
|
var oldRipple = element.querySelector('.touch-ripple');
|
2026-01-16 00:40:55 +08:00
|
|
|
|
if (oldRipple) oldRipple.remove();
|
|
|
|
|
|
element.style.position = 'relative';
|
|
|
|
|
|
element.style.overflow = 'hidden';
|
|
|
|
|
|
element.appendChild(ripple);
|
|
|
|
|
|
setTimeout(function() { ripple.remove(); }, 600);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
function initRippleEffect() {
|
2026-01-16 14:14:51 +08:00
|
|
|
|
var rippleElements = document.querySelectorAll('.btn, .card, .nav-link, .dropdown-item, .page-link, .leftbar-mobile-menu-item > a, .leftbar-mobile-action, .fabtn, .comment-reply, .tag, .badge');
|
2026-01-16 00:40:55 +08:00
|
|
|
|
rippleElements.forEach(function(el) {
|
|
|
|
|
|
if (el.dataset.rippleInit) return;
|
|
|
|
|
|
el.dataset.rippleInit = 'true';
|
|
|
|
|
|
el.addEventListener('touchstart', function(e) { createRipple(e, this); }, { passive: true });
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 2. 图片加载动画
|
|
|
|
|
|
function initImageLoadAnimation() {
|
2026-01-16 14:14:51 +08:00
|
|
|
|
var images = document.querySelectorAll('article img[loading="lazy"], .post-thumbnail img');
|
2026-01-16 00:40:55 +08:00
|
|
|
|
images.forEach(function(img) {
|
|
|
|
|
|
if (img.dataset.loadAnimInit) return;
|
|
|
|
|
|
img.dataset.loadAnimInit = 'true';
|
|
|
|
|
|
if (img.complete) { img.classList.add('loaded'); }
|
|
|
|
|
|
else { img.addEventListener('load', function() { this.classList.add('loaded'); }); }
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 3. 滚动入场动画
|
|
|
|
|
|
function initScrollAnimations() {
|
|
|
|
|
|
if (!('IntersectionObserver' in window)) return;
|
2026-01-16 14:14:51 +08:00
|
|
|
|
var animatedElements = document.querySelectorAll('.article-list article.post, .comment-item, .timeline-item, .friend-link-item, #leftbar .card, #rightbar .card');
|
|
|
|
|
|
var observer = new IntersectionObserver(function(entries) {
|
2026-01-16 00:40:55 +08:00
|
|
|
|
entries.forEach(function(entry) {
|
|
|
|
|
|
if (entry.isIntersecting) { entry.target.classList.add('animate-in'); observer.unobserve(entry.target); }
|
|
|
|
|
|
});
|
|
|
|
|
|
}, { threshold: 0.1, rootMargin: '0px 0px -50px 0px' });
|
|
|
|
|
|
animatedElements.forEach(function(el) { if (!el.classList.contains('animate-in')) observer.observe(el); });
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 4. 平滑滚动
|
|
|
|
|
|
function initSmoothScroll() {
|
|
|
|
|
|
document.querySelectorAll('a[href^="#"]').forEach(function(anchor) {
|
|
|
|
|
|
if (anchor.dataset.smoothScrollInit) return;
|
|
|
|
|
|
anchor.dataset.smoothScrollInit = 'true';
|
|
|
|
|
|
anchor.addEventListener('click', function(e) {
|
2026-01-16 14:14:51 +08:00
|
|
|
|
var targetId = this.getAttribute('href');
|
2026-01-16 00:40:55 +08:00
|
|
|
|
if (targetId === '#') return;
|
2026-01-16 14:14:51 +08:00
|
|
|
|
var target = document.querySelector(targetId);
|
2026-01-16 00:40:55 +08:00
|
|
|
|
if (target) { e.preventDefault(); target.scrollIntoView({ behavior: 'smooth', block: 'start' }); }
|
|
|
|
|
|
});
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 5. 页面加载进度条
|
|
|
|
|
|
function initLoadingBar() {
|
|
|
|
|
|
if (document.getElementById('page-loading-bar')) return;
|
2026-01-16 14:14:51 +08:00
|
|
|
|
var bar = document.createElement('div');
|
2026-01-16 00:40:55 +08:00
|
|
|
|
bar.id = 'page-loading-bar';
|
|
|
|
|
|
bar.style.width = '0%';
|
|
|
|
|
|
document.body.appendChild(bar);
|
2026-01-16 14:14:51 +08:00
|
|
|
|
var progress = 0;
|
|
|
|
|
|
var interval = setInterval(function() {
|
2026-01-16 00:40:55 +08:00
|
|
|
|
progress += Math.random() * 10;
|
|
|
|
|
|
if (progress >= 90) { clearInterval(interval); progress = 90; }
|
|
|
|
|
|
bar.style.width = progress + '%';
|
|
|
|
|
|
}, 100);
|
|
|
|
|
|
window.addEventListener('load', function() {
|
|
|
|
|
|
clearInterval(interval);
|
|
|
|
|
|
bar.style.width = '100%';
|
|
|
|
|
|
setTimeout(function() { bar.style.opacity = '0'; setTimeout(function() { bar.remove(); }, 300); }, 200);
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 6. PJAX 加载动画
|
|
|
|
|
|
function initPjaxAnimations() {
|
|
|
|
|
|
if (typeof jQuery === 'undefined') return;
|
|
|
|
|
|
jQuery(document).on('pjax:start', function() {
|
|
|
|
|
|
jQuery('#primary').addClass('pjax-loading');
|
2026-01-16 14:14:51 +08:00
|
|
|
|
var bar = document.getElementById('page-loading-bar');
|
2026-01-16 00:40:55 +08:00
|
|
|
|
if (!bar) { bar = document.createElement('div'); bar.id = 'page-loading-bar'; document.body.appendChild(bar); }
|
|
|
|
|
|
bar.style.opacity = '1'; bar.style.width = '30%';
|
|
|
|
|
|
setTimeout(function() { bar.style.width = '60%'; }, 200);
|
|
|
|
|
|
});
|
|
|
|
|
|
jQuery(document).on('pjax:end', function() {
|
|
|
|
|
|
jQuery('#primary').removeClass('pjax-loading');
|
2026-01-16 14:14:51 +08:00
|
|
|
|
var bar = document.getElementById('page-loading-bar');
|
2026-01-16 00:40:55 +08:00
|
|
|
|
if (bar) { bar.style.width = '100%'; setTimeout(function() { bar.style.opacity = '0'; setTimeout(function() { bar.remove(); }, 300); }, 200); }
|
|
|
|
|
|
setTimeout(function() { initRippleEffect(); initImageLoadAnimation(); initScrollAnimations(); initSmoothScroll(); }, 100);
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-01-16 10:04:29 +08:00
|
|
|
|
// 7. 主题切换动画 - 已在 header.php 中通过 setDarkmode 函数处理,此处不再重复
|
2026-01-16 00:40:55 +08:00
|
|
|
|
function initThemeTransition() {
|
2026-01-16 10:04:29 +08:00
|
|
|
|
// 移除 MutationObserver 避免无限循环导致内存泄漏
|
|
|
|
|
|
// 主题切换过渡效果已在 setDarkmode() 函数中实现
|
2026-01-16 00:40:55 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 8. 减少动画偏好检测
|
|
|
|
|
|
function checkReducedMotion() {
|
|
|
|
|
|
if (window.matchMedia('(prefers-reduced-motion: reduce)').matches) {
|
|
|
|
|
|
document.documentElement.classList.add('reduced-motion');
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 初始化
|
|
|
|
|
|
function init() {
|
|
|
|
|
|
checkReducedMotion();
|
|
|
|
|
|
initRippleEffect();
|
|
|
|
|
|
initImageLoadAnimation();
|
|
|
|
|
|
initScrollAnimations();
|
|
|
|
|
|
initSmoothScroll();
|
|
|
|
|
|
initPjaxAnimations();
|
|
|
|
|
|
initThemeTransition();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', init); }
|
|
|
|
|
|
else { init(); }
|
|
|
|
|
|
if (document.readyState !== 'complete') { initLoadingBar(); }
|
|
|
|
|
|
})();
|
|
|
|
|
|
/* ========== End of Modern UI Enhancements ========== */
|