var $body = (window.opera) ? (document.compatMode == "CSS1Compat" ? $('html') : $('body')) : $('html,body');
var storage = window.localStorage;
var lazyLoadInstance = new LazyLoad({});
// $(document).on('click', '.left_menu_box ul li a , .widget_nav_menu ul li a, .menu-top-container ul li a', function () {
// var t = $(this);
// t.siblings("ul").slideToggle(200);
// t.parent().siblings().find("ul").hide(200);
// if (t.parent().hasClass('has_children')) {
// t.find('.drop_icon').toggleClass('up');
// }
// $('.left_menu_box ul li').removeClass('current-pjax-item current-menu-item current-menu-parent current-menu-ancestor');
// t.parent().addClass('current-pjax-item');
// });
function highlightMenu() {
$('.left_menu_box ul li').removeClass('current-pjax-item')
// 路径映射表
const pathMap = {
'/moments': '/',
'/tags': '/content',
'/archives': '/archives',
'/categories': '/content'
}
// 获取清洗后的 pathname(去掉 ? 和 #)
function getPathname(url) {
const cleanUrl = url.substring(0,
url.indexOf('?') === -1
? (url.indexOf('#') === -1 ? url.length : url.indexOf('#'))
: url.indexOf('?')
)
return new URL(cleanUrl).pathname
}
// 从长到短匹配路径映射(支持 /categories/shi 匹配 /categories)
function getTargetPathname(pathname) {
const segments = pathname.split('/').filter(Boolean)
for (let i = segments.length; i >= 0; i--) {
const currentPath = '/' + segments.slice(0, i).join('/')
if (pathMap[currentPath]) return pathMap[currentPath]
}
return pathname // 无映射则返回原路径
}
const currentPathname = getPathname(location.href)
const targetPathname = getTargetPathname(currentPathname)
let hasMatched = false
// 遍历一级菜单匹配
$('.left_menu_box ul li a').each((i, e) => {
const menuPathname = getPathname(e.href)
if (targetPathname === menuPathname) {
e.parentElement.classList.add('current-pjax-item')
hasMatched = true
}
})
// 兜底匹配 /navigator
if (!hasMatched) {
$('.left_menu_box ul li a').each((i, e) => {
const menuPathname = getPathname(e.href)
if (menuPathname === '/navigator') {
e.parentElement.classList.add('current-pjax-item')
}
})
}
}
//全局loading
function loading_template() {
tag = '
';
tag += '';
return tag;
}
function loading_start(target) {
target.append(loading_template());
}
function loading_done(target) {
target.children('.loader').remove();
}
//话题表情添加
$(document).on('click', 'a.smile_btn', function () {
var a = $(this).html();
var textarea = $("textarea#topic_content");
var content = textarea.val();
textarea.val(content + a);
textarea.focus();
});
$(document).on('click', '.smile_box i', function () {
var t = $(".smile_show");
t.slideToggle(100);
});
//选择话题
$(document).on('click', '.t_cat_box li', function () {
var name = $(this).find('.c_name span').html();
$('.t_cat_toogle span').html(name);
UIkit.dropdown('.t_cat_box').hide(false);
});
$(document).on('click', '.up_cat_btn', function () {
var name = $('input#add_cat').val();
if (!name) {
cocoMessage.error("请填写话题");
return false;
}
$('.t_cat_toogle span').text(name)
UIkit.dropdown('.t_cat_box').hide(false);
});
$(document).on('click', '.simi a', function () {
var visible = $(this).attr('visible');
if (visible == 'PUBLIC') {
$(this).html('').attr('visible', 'PRIVATE');
$(this).children().css({ "background": "#ddd", "color": "#c6c6c6" });
} else {
$(this).html('').attr('visible', 'PUBLIC');
$(this).children().css({ "background": "#e3efe7", "color": "#66c187" });
}
});
//消息通知
cocoMessage.config({
duration: 2000,
});
//sortable事件 隐藏input
UIkit.util.on('.img_show', 'start', function (item) {
$(".up_img_btn").hide();
});
UIkit.util.on('.img_show', 'moved', function (item) {
var img_num = $('.add_img_box .t_media_item').length;
if (img_num < 9) {
$(".up_img_btn").show();
}
});
UIkit.util.on('.img_show', 'stop', function (item) {
var img_num = $('.add_img_box .t_media_item').length;
if (img_num < 9) {
$(".up_img_btn").show();
}
});
//ajax上传媒体文件到媒体库(已兼容图片/视频)
$(document).on('change', '#topic_img_up', function (e) {
e.preventDefault();
if ($('#topic_img_up').val() == '') return;
const policyName = Theme.moments.policy_name;
const groupName = Theme.moments.group_name;
var files = $('#topic_img_up')[0].files;
var imgtot = 0;
var num = $('.add_img_box .t_media_item').length;
// 修改提示语为“文件”
if (num + files.length > 9) {
cocoMessage.error("最多上传9个媒体文件");
return;
}
$.each(files, function (i, file) {
imgtot += file['size'];
});
var tot = imgtot / 1024000;
$(".up_img_btn i").hide();
$(".up_img_btn").prepend("");
$.each(files, function (i, file) {
var data = new FormData();
data.append('file', file);
policyName && data.append('policyName', policyName);
groupName && data.append('groupName', groupName);
$.ajax({
type: "POST",
url: `${Theme.moments.attachments_upload_api}`,
dataType: 'json',
data: data,
processData: false,
contentType: false,
beforeSend: function () {
$('input#topic_img_up').attr('disabled', 'disabled');
},
success: function (data) {
// 1. 获取上传后的地址
var src = data.metadata.annotations["storage.halo.run/uri"]
|| data.metadata.annotations["storage.halo.run/external-link"]
|| data.metadata.annotations["lskypro.plugin.halo.chenhe.me/image-link"];
// 2. 获取文件类型 (MIME Type)
// Halo 的 API 通常在 data.spec.mediaType 中返回类型,或者根据后缀判断
var mediaType = data.spec.mediaType || "";
var isVideo = mediaType.startsWith('video/') || /\.(mp4|webm|mov)$/i.test(src);
// 3. 动态生成预览 HTML
var mediaInner = isVideo
? ``
: `
`;
var media = ``;
$(".img_show").prepend(media);
num = $('.add_img_box .t_media_item').length;
$(".img_load_text").remove();
if (num < 10) $(".up_img_btn i").show();
$('input#topic_img_up').removeAttr('disabled');
},
error: function () {
cocoMessage.error("上传失败");
$(".img_load_text").remove();
$(".up_img_btn i").show();
$('input#topic_img_up').removeAttr('disabled');
}
});
});
});
//同步修改检查数量的提示语
function check_image_num() {
var num = $('.add_img_box .t_media_item').length;
if (num > 8) {
cocoMessage.error("最多上传9个媒体文件");
return true;
}
}
//sortable事件 隐藏input
UIkit.util.on('.img_show', 'start', function (item) {
$(".up_img_btn").hide();
});
UIkit.util.on('.img_show', 'moved', function (item) {
var img_num = $('.add_img_box .t_media_item').length;
if (img_num < 9) {
$(".up_img_btn").show();
}
});
UIkit.util.on('.img_show', 'stop', function (item) {
var img_num = $('.add_img_box .t_media_item').length;
if (img_num < 9) {
$(".up_img_btn").show();
}
});
//获取媒体库图片/视频(功能不变)
$(document).on('click', '.up_from_media a', function () {
$(".attch_nav .pre").hide();
$(".attch_nav .nex").hide();
$(".attch_nav").attr('paged', '1');
$(".wp_get_media_list").empty();
$(".show_media_box").show();
$.ajax({
type: "get",
url: `/apis/${Theme.moments.attachments_api}/v1alpha1/attachments?group=&page=1&size=10&ungrouped=false&accepts=image/*&accepts=video/*`,
contentType: "application/json",
beforeSend: function () { },
success: function (data) {
var list = data.items;
$.each(list, function (i, value) {
var thum = value.status.permalink;
var src = value.status.permalink;
var mediaType = value.spec.mediaType || '';
var wf_media = '';
if (mediaType.startsWith('video/')) {
wf_media = `
`;
} else {
wf_media = `
`;
}
$(".wp_get_media_list").append(wf_media);
});
var max = data.totalPages;
$(".attch_nav .nex").toggle(max > 1);
}
});
});
//媒体库分页(功能不变)
$(document).on('click', '.attch_nav a', function () {
$(".wp_get_media_list").empty();
var type = $(this).attr('class');
var paged = $(".attch_nav").attr('paged');
if (type == 'nex') {
paged = parseInt(paged) + 1;
} else if (type == 'pre' && paged) {
paged = parseInt(paged) - 1;
}
$(".attch_nav").attr('paged', paged);
$.ajax({
type: "get",
url: `/apis/${Theme.moments.attachments_api}/v1alpha1/attachments?group=&page=${paged}&size=10&ungrouped=false&accepts=image/*&accepts=video/*`,
contentType: "application/json",
beforeSend: function () { },
success: function (data) {
$(".wp_get_media_list").empty();
var list = data.items;
$.each(list, function (i, value) {
var thum = value.status.permalink;
var src = value.status.permalink;
var mediaType = value.spec.mediaType;
var wf_media = '';
if (mediaType.startsWith('video/')) {
wf_media = `
`;
} else {
wf_media = `
`;
}
$(".wp_get_media_list").append(wf_media);
});
var max = data.totalPages;
$(".attch_nav .nex").toggle(max > paged);
$(".attch_nav .pre").toggle(paged > 1);
}
});
});
//收起媒体库(无修改)
$(document).on('click', '.show_media_box .souqi', function () {
$(".show_media_box").hide();
$(".wp_get_media_list").empty();
});
//从媒体库插入图片/视频(删除按钮样式简化)
$(document).on('click', '.wp_get_media_list li', function () {
var num = $('.add_img_box .t_media_item').length;
if (num == 8) {
$("a.up_img_btn").hide();
}
if (check_image_num()) {
return false;
}
var src = $(this).attr('data-src');
var type = $(this).attr('data-type');
var mediaHtml = '';
if (type.startsWith('video/')) {
mediaHtml = ``;
} else {
var thum = $(this).children().attr('src') || $(this).children().attr('poster');
mediaHtml = ``;
}
$(".img_show").prepend(mediaHtml);
});
//删除图片/视频(保留事件冒泡修复)
$(document).on('click', '.topic-img-de', function (e) {
e.stopPropagation();
var msg = "确认删除此媒体文件?";
if (confirm(msg)) {
$(this).parent().remove();
} else {
return false;
}
var num = $('.add_img_box .t_media_item').length;
if (num < 9) {
$("a.up_img_btn").show();
}
});
// 样式修复:3列布局 + 正方形显示(核心)
$(function () {
var style = ``;
$('head').append(style);
});
//插入外部图片链接
$(document).on('click', '.up_from_cdn a', function () {
//$(".show_media_box .souqi").click();
$(".show_cdn_media").show();
});
//取消
$(document).on('click', 'a.img_link_cancel', function () {
$(".show_cdn_media").hide();
});
//插入图片或视频链接
$(document).on('click', 'a.img_link_btn', function () {
var img_url = $("#img_link_up").val().trim();
// 1. 扩展正则判断,支持视频后缀
if (!/\.(mp4|webm|jpg|png|gif|webp|jpeg)$/i.test(img_url) || img_url == '') {
cocoMessage.error("媒体格式不正确或链接为空!");
return false;
}
if (check_image_num()) {
return false;
}
var num = $('.add_img_box .t_media_item').length;
if (num == 8) {
$("a.up_img_btn").hide();
}
var src = img_url;
// 获取后缀名并转为小写
var ext = img_url.substring(img_url.lastIndexOf('.') + 1).toLowerCase();
// 2. 判定是否为视频
var isVideo = (ext === 'mp4' || ext === 'webm');
var type = isVideo ? 'video/' + ext : 'image/' + ext;
// 3. 根据类型生成预览 HTML
var mediaPreview = '';
if (isVideo) {
mediaPreview = ``;
} else {
mediaPreview = `
`;
}
var media = ``;
$(".img_show").prepend(media);
$("#img_link_up").val('');
});
//ajax获取我的地理位置
$(document).on('click', '.loca .laqu', function () {
var gaode_key = Theme.moments.gaode_key;
var ip = '';
$.ajax({
type: "get",
url: `/apis/uc.api.security.halo.run/v1alpha1/devices`,
contentType: "application/json",
success: function (data) {
if (data.length > 0) {
var ipAddress = data[0].device.spec.ipAddress;
if (!/^10\.|^192\.|^168\.|^172\./.test(ipAddress)) {
ip = data[0].device.spec.ipAddress
}
}
$.ajax({
type: "get",
url: `https://restapi.amap.com/v3/ip?ip=${ip}&key=${gaode_key}`,
contentType: "application/json",
beforeSend: function () {
$(".loca_text").text("数据拉取中..");
},
success: function (data) {
if (data.status == '1') {
var city = 'X市';
if (typeof data.city === 'string') {
city = data.city;
}
var province = 'X省';
if (typeof data.province === 'string') {
province = data.province;
}
var loca = "" + province + " · " + city + "";
$(".loca_text").html(loca).attr("state", '1'); //设置为开启
} else {
cocoMessage.error(data.info);
}
}
});
}
});
});
//插入自定义位置【点击关闭】
$(document).on('click', 'a.set_local_btn', function (e) {
var loca = $("#set_local").val();
var state = $(".loca_text").attr('state');
if (loca == '') {
cocoMessage.error("为空则不显示位置");
$(".loca_text").text('').attr("state", '0');
$("a.close_local").text('位置已关闭').css('color', '#ddd');
$.removeCookie('mylocal', { path: '/' });
} else {
$(".loca_text").text(loca).attr("state", '1');
$("a.close_local").text('位置已开启').css('color', '#8890cc');
$.cookie('mylocal', loca, { expires: 30, path: '/' });
}
e.preventDefault();
e.stopPropagation();
UIkit.dropdown($('.local_box')).hide(0);
});
//插入自定义位置【input监控】
$(document).on('input', '#set_local', function () {
var loca = $(this).val();
var state = $(".loca_text").attr('state');
if (loca == '') {
cocoMessage.error("为空则不显示位置");
$(".loca_text").text('').attr("state", '0');
$("a.close_local").text('位置已关闭').css('color', '#ddd');
} else {
$(".loca_text").text(loca).attr("state", '1');
$("a.close_local").text('位置已开启,点击关闭').css('color', '#8890cc');
}
});
//关闭地理位置
$(document).on('click', 'a.close_local', function () {
$(".loca_text").text('').attr("state", '0');
$('#set_local, [name="set_local"]').val('');
$("a.close_local").text('位置已关闭').css('color', '#ddd');
});
$(document).on('click', '.loca_text', function () {
$("a.close_local").text('位置已开启,点击关闭').css('color', '#8890cc');
});
//发布更新瞬间
let isSubmittingMoment = false;
$(document).on('click', '.push_item', function () {
if (isSubmittingMoment) return false;
var content = $("#topic_content").val();
var catname = $(".t_cat_toogle span").text();
var loca = $(".loca_text").text();
var act = $('.push_item').attr('action');
var pid = $('.push_item').attr('pid');
var moment_type = $('.push_item').attr('type');
var visible = $(".simi a").attr('visible');
var min = Theme.moments.min_push_num;
if (min > 0) {
if (!content) {
cocoMessage.error("请输入内容");
return false;
}
if (content.length < min) {
cocoMessage.error("内容不得少于" + min + "个字");
return false;
}
}
let tags = [];
if (catname) {
tags.push(catname);
content += `${catname}
`;
}
get_moment_data(moment_type);
isSubmittingMoment = true;
const $btn = $(this);
$btn.attr('disabled', true).addClass('disabled');
function release() {
isSubmittingMoment = false;
$btn.removeAttr('disabled').removeClass('disabled');
}
if (act === 'push') {
let pushData = {
apiVersion: 'moment.halo.run/v1alpha1',
kind: 'Moment',
metadata: { generateName: "moment-" },
spec: {
content: {
html: content,
medium: moment_data,
raw: content
},
owner: "",
tags: tags,
visible: visible
}
};
if (loca && loca !== '数据拉取中..') {
pushData.metadata.annotations = { mylocal: loca };
}
cocoMessage.info("发布中..");
$.ajax({
type: "POST",
url: `/apis/${Theme.moments.push_api}/v1alpha1/moments`,
contentType: "application/json",
data: JSON.stringify(pushData),
success() {
cocoMessage.success('发布成功!');
location.reload();
},
error() {
cocoMessage.error('发布失败!');
release();
}
});
return;
}
if (act === 'update') {
let updateData = {
apiVersion: 'moment.halo.run/v1alpha1',
kind: 'Moment',
metadata: {
name: pid,
generateName: "moment-",
finalizers: ["tag-moment-protection", "moment-protection"],
version: parseInt($('.push_item').attr('version'))
},
spec: {
content: {
html: content,
medium: moment_data,
raw: content
},
owner: $('.push_item').attr('owner'),
releaseTime: $('.push_item').attr('releaseTime'),
tags: tags,
visible: visible
}
};
if (loca && loca !== '数据拉取中..') {
updateData.metadata.annotations = { mylocal: loca };
}
cocoMessage.info("更新中..");
$.ajax({
type: "PUT",
url: `/apis/${Theme.moments.api}/v1alpha1/moments/${pid}`,
contentType: "application/json",
data: JSON.stringify(updateData),
success() {
cocoMessage.success('更新成功!');
location.reload();
},
error() {
cocoMessage.error('更新失败!');
release();
}
});
}
});
//获取片刻类型参数
function get_moment_data(type) {
moment_data = [];
switch (type) {
case "image":
$(".t_media_item").each(function () {
var src = $(this).attr('data-src');
var type = $(this).attr('data-type');
var obj = {
url: src,
type: "PHOTO",
originType: type
}
moment_data.push(obj); //图片
});
break;
case "card":
$(".card_sortble .moment_card_item").each(function () {
var pid = $(this).attr('pid');
var type = $(this).attr('type');
var obj = {
url: pid,
type: "POST",
originType: type
}
moment_data.push(obj); //卡片
});
break;
case "audio":
get_audio_data();
break;
case "video":
get_video_data();
break;
}
}
//片刻音乐参数
function get_audio_data() {
var type = $('.audio_choose li.uk-active a').attr('au_type');
if (type == 'local') {
var url = $('input#moment_audio_url').val();
var obj = {
url: url,
type: "AUDIO",
originType: 'audio/' + type
}
} else {
var n_id = $('input#moment_audio_api').val();
var obj = {
url: n_id,
type: "AUDIO",
originType: 'audio/' + type
}
}
moment_data.push(obj);
}
//片刻视频参数
function get_video_data() {
var type = $('.video_choose li.uk-active a').attr('vi_type');
if (type == 'local') {
var url = $('input#moment_video_url').val();
var obj = {
url: url,
type: "VIDEO",
originType: 'video/mp4'
}
} else if (type == 'bili') {
var bvid = $('input#moment_video_bili').val();
var obj = {
url: bvid,
type: "VIDEO",
originType: 'video/bili'
}
}
moment_data.push(obj);
}
//片刻空值提示
function get_moment_error(type) {
switch (type) {
case "card":
var v = $('.show_card .moment_card_item');
if (v.length == 0) {
return false;
}
break;
case "audio":
var au_type = $('.audio_choose li.uk-active a').attr('au_type');
var url = $('input#moment_audio_url').val(); //歌曲链接
var title = $('input#moment_audio_name').val(); //标题
var cover = $('.loacl_audio .audio_left img').length; //封面
if (au_type == 'local') {
if (url == '' || title == '' || cover == 0) {
return false;
}
} else {
var n_id = $('input#moment_audio_api').val();
if (n_id == '') {
return false;
}
}
break;
case "video":
var vi_type = $('.video_choose li.uk-active a').attr('vi_type');
var url = $('input#moment_video_url').val();
//var cover = $('.m_media_left img').length;
if (vi_type == 'local') {
if (url == '') {
return false;
}
} else {
var bvid = $('input#moment_video_bili').val();
if (bvid == '') {
return false;
}
}
break;
}
}
// ajax分类筛选 moment
$(document).on('click', '.moment_cat_nav ul li a', function () {
var $this = $(this);
if ($this.hasClass('disabled')) {
return false;
}
$('.moment_cat_nav ul li a').addClass('disabled');
var temp = $("#comment_form_reset");
var formHtml = $("#t_commentform").prop('outerHTML');
temp.html(formHtml);
// --- 1. 保存旧内容---
var $momentList = $(".moment_list");
var oldContent = $momentList.html();
var oldPagination = $('#t_pagination').prop('outerHTML');
$(".moment_list").empty();
$('#t_pagination a').hide();
var cat = $this.attr('data');
$.ajax({
type: "GET",
url: cat,
beforeSend: function () {
$('.moment_list').html('');
},
success: function (data) {
$this.addClass('active').parent().siblings().children().removeClass('active');
$('.moment_list .loading_box').remove();
var result = $(data).find(".moment_list .p_item");
$(".moment_list").append(result.fadeIn(300));
var $newPagination = $(data).find("#t_pagination");
var newHref = $newPagination.find("a").attr("data");
// 检查当前页面是否有分页容器,如果没有则补齐
if ($('#t_pagination').length === 0 && $newPagination.length > 0) {
$(".moment_list").after($newPagination.prop('outerHTML'));
}
var $paginationBtn = $('#t_pagination a');
if (newHref === undefined) {
$paginationBtn.hide();
} else {
$paginationBtn.attr("data", newHref).text(Theme.site_page).show();
$('#t_pagination').show();
}
getMomentAudio();
initAgree();
if (typeof lazyLoadInstance !== 'undefined') lazyLoadInstance.update();
$('.moment_cat_nav ul li a').removeClass('disabled');
initializeMomentFold();
// if (typeof modify_moment_video_size === 'function') modify_moment_video_size();
if (cat.indexOf('tag=') !== -1) {
history.pushState({ url: cat }, '', cat);
} else {
history.pushState({ url: cat }, '', '/');
}
if (!$.cookie('scrollParam')) {
$.removeCookie('page', { path: '/', domain: 'anian.cc' });
}
if (window._tagSwitchCallback) {
window._tagSwitchCallback.resolve(); // 标记成功
window._tagSwitchCallback = null; // 清理临时变量
}
},
error: function () {
$('.moment_cat_nav ul li a').removeClass('disabled');
cocoMessage.error('内容获取失败');
$('.moment_list .loading_box').remove();
// 恢复列表内容
$momentList.html(oldContent);
if ($('#t_pagination').length > 0) {
$('#t_pagination').replaceWith(oldPagination);
} else {
$momentList.after(oldPagination);
}
if (window._tagSwitchCallback) {
window._tagSwitchCallback.reject(); // 标记失败
window._tagSwitchCallback = null; // 清理临时变量
}
}
});
});
// ajax分类筛选朋友圈
$(document).on('click', '.friends_cat_nav .cat-link', function () {
var $this = $(this);
if ($this.hasClass('disabled')) {
return false;
}
$('.friends_cat_nav .cat-link').addClass('disabled');
// 保留原有的表单重置逻辑(如果不需要可删除)
var temp = $("#comment_form_reset");
var formHtml = $("#t_commentform").prop('outerHTML');
temp.html(formHtml);
// --- 1. 保存旧内容---
var $momentList = $(".moment_list");
var oldContent = $momentList.html();
var oldPagination = $('#t_pagination').prop('outerHTML');
// 清空列表并隐藏分页
$(".moment_list").empty();
$('#t_pagination a').hide();
// 获取目标 URL(注意这里用的是 data-href)
var url = $this.attr('data-href');
$.ajax({
type: "GET",
url: url,
beforeSend: function () {
// 显示加载动画
$('.moment_list').html('');
},
success: function (data) {
$this.addClass('active').parent().siblings().children().removeClass('active');
// 移除加载动画
$('.moment_list .loading_box').remove();
// 提取并插入新的列表项
var result = $(data).find(".moment_list .p_item");
$(".moment_list").append(result.fadeIn(300));
// 处理分页逻辑
var $newPagination = $(data).find("#t_pagination");
var newHref = $newPagination.find("a").attr("data");
// 检查当前页面是否有分页容器,如果没有则补齐
if ($('#t_pagination').length === 0 && $newPagination.length > 0) {
$(".moment_list").after($newPagination.prop('outerHTML'));
}
var $paginationBtn = $('#t_pagination a');
if (newHref === undefined) {
$paginationBtn.hide();
} else {
$paginationBtn.attr("data", newHref).text(Theme.site_page).show();
$('#t_pagination').show();
}
// --- 功能初始化区域(根据您的实际情况启用/禁用) ---
if (typeof lazyLoadInstance !== 'undefined') lazyLoadInstance.update();
$('.friends_cat_nav .cat-link').removeClass('disabled');
initializeMomentFold();
// 更新浏览器历史状态
url = url.replace('author', 'tag');
history.pushState({ url: url }, '', url);
// 清除分页 cookie(保持原样)
if (!$.cookie('scrollParam')) {
$.removeCookie('page', { path: '/', domain: 'anian.cc' });
}
if (window._tagSwitchCallback) {
window._tagSwitchCallback.resolve(); // 标记成功
window._tagSwitchCallback = null; // 清理临时变量
}
},
error: function () {
$('.friends_cat_nav .cat-link').removeClass('disabled');
if (window._tagSwitchCallback) {
window._tagSwitchCallback.reject(); // 标记失败
window._tagSwitchCallback = null; // 清理临时变量
}
cocoMessage.error('内容获取失败');
$('.moment_list .loading_box').remove();
// 恢复列表内容
$momentList.html(oldContent);
if ($('#t_pagination').length > 0) {
$('#t_pagination').replaceWith(oldPagination);
} else {
$momentList.after(oldPagination);
}
}
});
});
//ajax加载片刻
$(document).on('click', '#t_pagination a', function () {
const postListElement = document.getElementById("post_item");
var href = $(this).attr('data');
const currentPage = parseInt(href.match(/\d+/)[0]);
const $pagingArea = $('#t_pagination .post-paging');
const originalPagingHtml = $pagingArea.html();
$.ajax({
type: "GET",
url: href,
beforeSend: function () {
$('#t_pagination .post-paging').html('');
},
success: function (posts) {
if (posts) {
var result = $(posts).find(".moment_list .p_item");
$('#t_pagination .post-paging').html(`${Theme.site_page}`);
$(".moment_list").append(result.fadeIn(300));
window.pjax && window.pjax.refresh(postListElement)
var newhref = $(posts).find("#t_pagination a").attr("data");
if (newhref != undefined) {
$("#t_pagination a").attr("data", newhref);
$('#t_pagination a').show();
} else {
$("#t_pagination a").hide();
}
if (!window.scroll_param || (!window.loadMoreTimeout && window.scroll_param > result.offset().top - 58)) {
$body.animate({ scrollTop: result.offset().top - 58 }, 500);
} else window.forceStopLoading = true;
getMomentAudio();
initAgree();
lazyLoadInstance.update();
initializeMomentFold();
$.cookie('page', currentPage, { path: '/', domain: 'anian.cc' });
} else {
$('#t_pagination a').hide();
}
},
error: function () {
$pagingArea.html(originalPagingHtml);
$('#t_pagination a').show();
cocoMessage.error('内容获取失败');
}
});
return false;
});
// AJAX分类切换图库
$(document).ready(function () {
$(document).on('click', '.photos_cat_nav ul li a', function (e) {
var $this = $(this);
if ($this.hasClass('disabled') || $this.hasClass('active')) {
return false;
}
var url = $this.data('href');
if (!url) {
return false;
}
var tagText = $this.clone().find('span').remove().end().text().trim();
var displayUrl;
if (tagText === '全部') {
displayUrl = '/photos';
} else {
displayUrl = '/photos?tag=' + encodeURIComponent(tagText);
}
$('.posts_cat_nav ul li a').addClass('disabled');
// --- 1. 保存旧内容 (关键修改) ---
var $photosItem = $("#photos_item");
var oldPhotosContent = $photosItem.html(); // 保存图库列表内容
var oldPagination = $('#p_pagination').length > 0 ? $('#p_pagination').prop('outerHTML') : ''; // 保存分页结构
$.ajax({
type: "GET",
url: url,
beforeSend: function () {
$("#photos_item").html(
''
);
$('#p_pagination').hide();
},
success: function (data) {
$this.addClass('active').parent().siblings().children().removeClass('active');
var $data = $(data);
var newContent = $data.find("#photos_item").html();
$("#photos_item").html(newContent);
var $newPagination = $data.find("#p_pagination");
if ($newPagination.length > 0) {
var newHref = $newPagination.find("a").attr("data");
if (newHref) {
if ($('#p_pagination').length === 0) {
$("#photos_item").after($newPagination.prop('outerHTML'));
} else {
$('#p_pagination').replaceWith($newPagination.prop('outerHTML'));
}
$('#p_pagination').show();
} else {
$('#p_pagination').hide();
}
} else {
$('#p_pagination').hide();
}
if (typeof pix !== 'undefined' && pix.initGalleryPhotos) {
pix.initGalleryPhotos();
}
if ($('.gallery-photos').length > 0 && typeof waterfall === 'function') {
waterfall('.gallery-photos');
}
$('.posts_cat_nav ul li a').removeClass('disabled');
history.pushState({ path: displayUrl }, '', displayUrl);
if (!$.cookie('scrollParam')) {
$.removeCookie('page', { path: '/', domain: 'anian.cc' });
}
if (window._tagSwitchCallback) {
window._tagSwitchCallback.resolve(); // 标记成功
window._tagSwitchCallback = null; // 清理临时变量
}
},
error: function () {
// --- 2. 还原旧内容 (关键修改) ---
$photosItem.html(oldPhotosContent); // 恢复图库列表内容
// 恢复分页结构
if (oldPagination) {
if ($('#p_pagination').length > 0) {
$('#p_pagination').replaceWith(oldPagination);
} else {
$photosItem.after(oldPagination);
}
}
$('.posts_cat_nav ul li a').removeClass('disabled');
cocoMessage.error('内容获取失败');
if (window._tagSwitchCallback) {
window._tagSwitchCallback.reject(); // 标记失败
window._tagSwitchCallback = null; // 清理临时变量
}
}
});
return false;
});
});
//ajax加载图库
$(document).on('click', '#p_pagination a', function () {
var href = $(this).attr('data');
const currentPage = parseInt(href.match(/\d+/)[0]);
const $pagingArea = $('#p_pagination .post-paging');
const originalPagingHtml = $pagingArea.html();
const targetOffsetTop = $('#p_pagination a').offset().top;
$.ajax({
type: "GET",
url: href,
beforeSend: function () {
$('#p_pagination .post-paging').html('');
},
success: function (photos) {
if (photos) {
var result = $(photos).find(".norpost_list .gallery-photo");
$('#p_pagination .post-paging').html(`${Theme.site_page}`);
$(".gallery-photos").append(result.fadeIn(300));
var newhref = $(photos).find("#p_pagination a").attr("data"); //找出新的下一页链接
if (newhref != undefined) {
$("#p_pagination a").attr("data", newhref);
$('#p_pagination a').show();
} else {
$("#p_pagination a").hide(); //如果没有下一页了,隐藏
}
if (!window.scroll_param || (!window.loadMoreTimeout && window.scroll_param > targetOffsetTop - 358)) {
$body.animate({ scrollTop: targetOffsetTop - 358 }, 500);
} else window.forceStopLoading = true;
pix.initGalleryPhotos();
$.cookie('page', currentPage, { path: '/', domain: 'anian.cc' });
} else {
$('#p_pagination a').hide();
}
},
error: function () {
$pagingArea.html(originalPagingHtml);
$('#p_pagination a').show();
cocoMessage.error('内容获取失败');
}
});
return false;
});
//阅读更多按钮
$(document).on('click', 'a.show-more-btn', function () {
var t = $(this);
t.prev().show();
t.next().show();
t.siblings('.dotd').hide();
t.hide();
});
$(document).on('click', 'a.read-less-btn', function () {
var t = $(this);
t.siblings('.rm_hidden').hide();
t.siblings('.dotd').show();
t.prev().show();
t.hide();
});
//ajax加载评论
$(document).on('click', '.show_comment', function () {
$('.blog_list_inner').css('min-height', 'calc(100vh)');
var pid = $(this).attr('pid');
var other = $(this).parents('.moment_item').siblings('div');
$.each(other, function (name, value) {
//遍历每个 回复表单
var otherid = $(this).find('.show_comment').attr('pid');
$("#halo-comment-" + otherid).hide();
});
$(`#halo-comment-${pid}`).css('display', $(`#halo-comment-${pid}`).css('display') == 'block' ? 'none' : 'block');
});
//片刻点赞
$(document).on('click', '.up_like ', function () {
if ($(this).hasClass('done')) {
cocoMessage.info("地久天长");
return false;
} else {
$(this).addClass('done');
var pid = $(this).data("id");
var key = $(this).data("key");
let agreeArr = localStorage.getItem(`pix.upvoted.${key}.names`)
? JSON.parse(localStorage.getItem(`pix.upvoted.${key}.names`))
: [];
rateHolder = $(this).children('span');
iconHolder = $(this).children('i');
$.ajax({
type: 'post',
contentType: "application/json; charset=utf-8",
url: '/apis/api.halo.run/v1alpha1/trackers/upvote',
data: JSON.stringify({
group: key == "moment" ? "moment.halo.run" : "content.halo.run",
plural: key == "moment" ? "moments" : "posts",
name: pid,
}),
success: function (data) {
$(iconHolder).toggleClass('ri-heart-2-fill');
var num = $(rateHolder).text();
$(rateHolder).text(++num);
agreeArr.push(pid);
const val = JSON.stringify(agreeArr);
localStorage.setItem(`pix.upvoted.${key}.names`, val);
cocoMessage.success("卿卿与黄");
}
}); // end ajax
}
});
function initAgree() {
var agreeAnnius = $('.up_like')
if (agreeAnnius.length > 0) {
let agreeArr = JSON.parse(localStorage.getItem(`pix.upvoted.${$(agreeAnnius[0]).data("key")}.names`))
for (var i = 0; i < agreeAnnius.length; i++) {
let pid = $(agreeAnnius[i]).attr('data-id');
if (agreeArr != null) {
let flag = agreeArr.includes(pid);
if (flag) {
$(agreeAnnius[i]).addClass('done');
}
}
}
}
}
function getMomentAudio() {
var audioList = $('.pix_player.qt')
if (audioList.length > 0) {
for (var i = 0; i < audioList.length; i++) {
let id = $(audioList[i]).attr('id');
let type = $(audioList[i]).attr('type');
var result = type.substring(type.indexOf("audio/") + 6);
if (id != null && id != '') {
var api = `${Theme.play.pix_mu_api || 'https://api.i-meto.com/meting/api'}?type=song&id=:id`
var meta = {
type: result,
id: id,
}
let url = api.replace(":id", meta.id);
$.ajax({
type: "get",
url: url,
success: function (res) {
var html = ''
if (res.length > 0) {
let author = res[0].author;
let pic = res[0].pic;
let title = res[0].title;
let url = res[0].url;
let lrc = res[0].lrc;
html = `
`;
} else {
html = '音乐参数错误';
}
$('#' + id).html(html);
}
});
}
}
}
}
// ajax分类筛选 posts(首页片刻时改这个)
$(document).on('click', '.posts_cat_nav ul li a', function (e) {
e.preventDefault();
var $this = $(this);
const postListElement = document.getElementById("post_item");
var t = $('.posts_cat_nav ul li a');
if (t.hasClass('disabled')) {
return false;
}
$('.posts_cat_nav ul li a').addClass('disabled');
// --- 1. 保存旧内容---
var $momentList = $(".norpost_list");
var oldContent = $momentList.html();
var oldPagination = $('#pagination').prop('outerHTML');
$(".norpost_list").empty();
$('#pagination a').hide();
var cat = $(this).attr('data');
// 替换:获取a标签内的中文文本并去除空格
var tag = $(this).text().trim();
$.ajax({
type: "GET",
url: cat, // 完全保留原有请求URL,不修改
headers: {
Accept: "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7"
},
beforeSend: function () {
$('.norpost_list').html('');
},
success: function (data) {
$this.addClass('active').parent().siblings().children().removeClass('active');
$('#pagination a').text(Theme.site_page);
var result = $(data).find(".norpost_list").children();
$(".norpost_list").append(result.fadeIn(300));
window.pjax && window.pjax.refresh(postListElement);
let newhref = $(data).find("#pagination a").attr("data") || $(data).find(".arc_pagenav a").attr("data");
if (newhref != undefined) {
$("#pagination a").attr("data", newhref);
$('#pagination a').show();
} else {
$('#pagination a').hide();
}
$('.loading_box').remove();
initAgree();
lazyLoadInstance.update();
$('.posts_cat_nav ul li a').removeClass('disabled');
// 仅新增:基于中文tag构造URL并更新(不影响请求逻辑)
const urlParams = new URLSearchParams();
let newUrl = '/archives';
// 替换:判断是否为"全部",非全部则追加中文tag参数
if (tag !== '全部' && tag !== '') {
urlParams.append('tag', tag);
newUrl = `${newUrl}?${urlParams.toString()}`;
}
history.pushState({ url: newUrl }, '', newUrl);
if (!$.cookie('scrollParam')) {
$.removeCookie('page', { path: '/', domain: 'anian.cc' });
}
if (window._tagSwitchCallback) {
window._tagSwitchCallback.resolve(); // 标记成功
window._tagSwitchCallback = null; // 清理临时变量
}
},
error: function () {
$('.posts_cat_nav ul li a').removeClass('disabled');
cocoMessage.error('内容获取失败');
$('.norpost_list .loading_box').remove();
// 恢复列表内容
$momentList.html(oldContent);
if ($('#pagination').length > 0) {
$('#pagination').replaceWith(oldPagination);
} else {
$momentList.after(oldPagination);
}
if (window._tagSwitchCallback) {
window._tagSwitchCallback.reject(); // 标记失败
window._tagSwitchCallback = null; // 清理临时变量
}
}
});
});
//ajax加载文章
$('body').on('click', '#pagination a', function () {
const postListElement = document.getElementById("post_item");
const $pagingArea = $('#pagination .post-paging');
const originalPagingHtml = $pagingArea.html();
var href = $(this).attr('data');
const currentPage = parseInt(href.match(/\d+/)[0]);
$.ajax({
type: "GET",
url: href,
headers: {
Accept: "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7"
},
beforeSend: function () {
$('#pagination .post-paging').html('');
},
success: function (data) {
if (data) {
var result = $(data).find(".norpost_list ").children();
$('#pagination .post-paging').html(`${Theme.site_page}`);
$('.norpost_list').append($(result).fadeIn(400));
window.pjax && window.pjax.refresh(postListElement)
var newhref = $(data).find("#pagination a").attr("data") || $(data).find(".arc_pagenav a").attr("data"); //找出新的下一页链接
if (newhref != undefined) {
$("#pagination a").attr("data", newhref);
$('#pagination a').show();
} else {
$("#pagination a").hide(); //如果没有下一页了,隐藏
}
if (!window.scroll_param || (!window.loadMoreTimeout && window.scroll_param > result.offset().top - 58)) {
$body.animate({ scrollTop: result.offset().top - 58 }, 500);
} else window.forceStopLoading = true;
initAgree()
lazyLoadInstance.update();
$.cookie('page', currentPage, { path: '/', domain: 'anian.cc' });
} else {
$("#pagination a").hide();
}
},
error: function () {
$pagingArea.html(originalPagingHtml);
$('#pagination a').show();
cocoMessage.error('内容获取失败');
}
});
return false;
});
// ajax加载分类页面文章
$('body').on('click', '.arc_pagenav a', function () {
// 【新增】保存分页区域的原始HTML,用于失败时恢复
const $pagingArea = $('.arc_pagenav');
const originalPagingHtml = $pagingArea.html();
const postListElement = document.getElementById("post_item");
var href = $(this).attr('data');
const currentPage = parseInt(href.match(/\d+/)[0]);
$(this).hide();
var content = $('.norpost_list');
var href = $(this).attr('data');
if (href != undefined) {
$.ajax({
type: "GET",
url: href,
headers: {
Accept: "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7"
},
beforeSend: function () {
$('.arc_pagenav').append('');
},
success: function (data) {
var post = $(data).find(".norpost_list").children();
content.append(post.fadeIn(300));
window.pjax && window.pjax.refresh(postListElement)
var newhref = $(data).find(".arc_pagenav a").attr("data"); //找出新的下一页链接
if (newhref != undefined) {
$(".arc_pagenav a").attr("data", newhref);
$('.arc_pagenav a').show();
} else {
$(".arc_pagenav a").hide(); //如果没有下一页了,隐藏
}
$('.arc_pagenav .uk-spinner').remove();
if (!window.scroll_param || (!window.loadMoreTimeout && window.scroll_param > post.offset().top - 58)) {
$body.animate({ scrollTop: post.offset().top - 58 }, 500);
} else window.forceStopLoading = true;
initAgree()
lazyLoadInstance.update();
$.cookie('page', currentPage, { path: '/', domain: 'anian.cc' });
},
error: function () {
$pagingArea.html(originalPagingHtml);
cocoMessage.error('内容获取失败');
}
});
}
return false;
});
function loginUrl() {
window.location.href = `/login?redirect_uri=${encodeURIComponent(window.location.pathname)}`;
}
$(document).on('mouseenter', '.lbc .left_menu_box ul li a , body.mod_third_s .left_menu_box ul li a', function (event) {
var title = $(this).find('.nav_title').text();
$(this).append("");
});
$(document).on('mouseleave', '.lbc .left_menu_box ul li a , body.mod_third_s .left_menu_box ul li a', function (event) {
$(this).find('.menu_tips').remove();
});
//滚动
$(document).ready(function (e) {
$(window).scroll(function () {
var b = $(window).scrollTop(); //监控窗口已滚动的距离;
if (b > 190) {
$('.top_bar').addClass('mobile_active');
} else {
$('.top_bar').removeClass('mobile_active');
}
if (b > 1500) {
$('a.go_top').addClass('show');
$('a.tool_top').addClass('show');
} else {
$('a.go_top').removeClass('show');
$('a.tool_top').removeClass('show');
}
});
});
$.fn.autoTextarea = function (options) {
var defaults = {
maxHeight: null,//文本框是否自动撑高,默认:null,不自动撑高;如果自动撑高必须输入数值,该值作为文本框自动撑高的最大高度
minHeight: 50
};
var opts = $.extend({}, defaults, options);
return $(this).each(function () {
$(this).bind("paste cut keydown keyup focus blur", function () {
var height, style = this.style;
this.style.height = opts.minHeight + 'px';
if (this.scrollHeight > opts.minHeight) {
if (opts.maxHeight && this.scrollHeight > opts.maxHeight) {
height = opts.maxHeight;
style.overflowY = 'scroll';
} else {
height = this.scrollHeight;
style.overflowY = 'hidden';
}
style.height = height + 'px';
}
});
});
};
$('body').on('click', '.com_msg_btn', function () {
var num = $(this).attr('check');
if (num == 0) {
return false;
}
$.ajax({
type: 'POST',
dataType: 'json',
url: Theme.ajaxurl,
data: {
'action': 'up_unread_msg',
},
beforeSend: function () {
},
success: function (data) {
if (data.code == '0') {
$('small.f_unread_num').remove();
} else {
return false;
}
}
});
});
//搜索类型
$('body').on('click', '.s_set_box a', function () {
var type = $(this).attr('data');
$(this).addClass('active').siblings('a').removeClass('active');
$('form#index_search input[type="hidden"]').val(type);
$.cookie('s_type', type, { expires: 30, path: '/', domain: 'anian.cc' });
});
$('body').on('click', '.top_s_box a', function () {
UIkit.dropdown('.s_set_box').hide(false);
var data = $(this).attr('data');
var type = $(this).text();
$('.set_text').text(type);
$('form#top_search input[type="hidden"]').val(data);
});
//黑暗模式
$('body').on('click', '.t_dark a', function () {
var t = $('html');
if (t.hasClass('dark')) {
$.cookie('dark', 'normal', { path: '/', domain: 'anian.cc', expires: 30 });
} else {
$.cookie('dark', 'dark', { path: '/', domain: 'anian.cc', expires: 30 });
}
t.toggleClass('dark');
});
//片刻管理按钮
$(document).on('mouseenter', '.post_control_btn', function (event) {
var a = $(this).siblings('.post_control_box');
a.addClass('show');
});
$(document).on('mouseleave', '.post_control', function (event) {
$(this).find('.post_control_box').removeClass('show');
});
//社交小工具二维码
$(document).on('mouseenter', '.sw_social', function (event) {
var qrbox = $(this).siblings('.sw_qrcode');
if (qrbox.length > 0) {
qrbox.addClass('active');
qrbox.fadeIn(200);
}
});
$(document).on('mouseleave', '.sw_social', function (event) {
var qrbox = $(this).siblings('.sw_qrcode');
if (qrbox.length > 0) {
qrbox.removeClass('active');
qrbox.fadeOut(200);
}
});
//点击收起移动侧栏
$('body').on('click', '.m_offcanvas', function () {
var target = event.target;
var parentAnchor = $(target).closest('a');
if (target.getAttribute('href') == '#' || parentAnchor.attr('href') == '#') {
} else {
UIkit.offcanvas('.m_offcanvas').hide();
}
});
// 刷新内容(兼容一言和今日诗词API)
$('body').on('click', '.yiyan_box .change', function () {
var url = Theme.widget_yiyan.api || 'https://v1.hitokoto.cn';
fetch(url)
.then(response => response.json())
.then(data => {
const targetElement = document.querySelector('.yiyan_box p');
if (url.includes('jinrishici.com')) {
// 今日诗词API处理逻辑:标题添加《》
targetElement.innerText = data.content;
targetElement.setAttribute("uk-tooltip", `《${data.origin}》${data.author}`);
} else {
// 原有一言API处理逻辑
targetElement.innerText = data.hitokoto;
targetElement.setAttribute("uk-tooltip", data.from);
}
})
});
$('.yiyan_box .change').click();
//pjax
$(document).on('pjax:error', function (event, xhr, textStatus, errorThrown, options) {
cocoMessage.error('加载失败!');
});
if (Theme.pjax) {
let pjaxSelectors = ["head title", "#pjax-container", ".pjax"]
var pjax = new Pjax({
elements: 'a:not([target="_blank"]):not([pjax="exclude"])',
selectors: pjaxSelectors,
analytics: false,
cacheBust: false,
});
document.addEventListener('pjax:send', function () {
NProgress.start();
})
document.addEventListener('pjax:complete', function () {
lazyLoadInstance.update();
typeof hljs === 'object' && hljs.highlightAll();
typeof Prism === 'object' && Prism.highlightAll();
autoload_posts_music();
initBlog();
refreshCommentWidget();
NProgress.done();
$.removeCookie('page', { path: '/', domain: 'anian.cc' });
})
}
// 刷新评论组件函数
function refreshCommentWidget() {
const commentWrappers = document.querySelectorAll('.halo-comment');
if (commentWrappers.length > 0) {
commentWrappers.forEach(wrapper => {
const scripts = wrapper.querySelectorAll('script[type="module"]');
scripts.forEach(oldScript => {
const newScript = document.createElement('script');
newScript.type = 'module';
// 复制所有属性
Array.from(oldScript.attributes).forEach(attr => {
if (attr.name !== 'type') {
newScript.setAttribute(attr.name, attr.value);
}
});
// 复制脚本内容
newScript.textContent = oldScript.textContent;
// 替换旧脚本
oldScript.parentNode.insertBefore(newScript, oldScript);
oldScript.remove();
});
});
}
}
$('body').on('click', '.msg_modal_inner .unread_box .box .mark_read', function (e) {
let msg_name = $(this).parent()[0].getAttribute('msg-name')
let username = Theme.username
$.ajax({
type: "put",
url: `/apis/api.notification.halo.run/v1alpha1/userspaces/${username}/notifications/${msg_name}/mark-as-read`,
success: function (res) {
pix.getMsg()
}
});
})
const getWindowInfo = () => {
pix.initTopBar()
};
const debounce = (fn, delay) => {
let timer;
return function () {
if (timer) {
clearTimeout(timer);
}
timer = setTimeout(() => {
fn();
}, delay);
}
};
const cancalDebounce = debounce(getWindowInfo, 1);
window.addEventListener('resize', cancalDebounce);
//固定顶部栏
$(document).scroll(function () {
let topBar = $('#masthead .top_bar');
var placeholder = document.querySelector('#masthead .uk-sticky-placeholder');
var width = topBar.width();
var scrT = document.documentElement.scrollTop;
if (window.innerWidth > 960) {
// 如果滚动的距离>60
if (scrT > 60) {
topBar.addClass('uk-active uk-sticky-fixed').css({ "width": width, "top": '0px', "position": "fixed" });
placeholder.hidden = false;
} else {
topBar.removeClass('uk-active uk-sticky-fixed').css({ "width": "auto", "top": "auto", "position": "" });
placeholder.hidden = true;
}
} else {
// 如果滚动的距离>0
if (scrT > 0) {
topBar.addClass('uk-active uk-sticky-below')
} else {
topBar.removeClass('uk-active uk-sticky-below')
}
}
});
// 获取当前具有 "current" 类的元素
var currentElement = document.querySelector('.current');
// 检查是否找到了具有 "current" 类的元素
if (currentElement) {
// 将当前元素滚动到视图中
currentElement.scrollIntoView({
behavior: 'smooth', // 平滑滚动
block: 'start' // 将当前元素顶部对齐到视口顶部
});
}
$('body').on('click', '.listree-btn', function () {
"目录[+]" == $(".listree-btn").text() ? $(".listree-btn").attr("title", "收起").text("目录[-]").parent().next().show() : $(".listree-btn").attr("title", "展开").text("目录[+]").parent().next().hide();
return !1
});
// toc
function autotree() {
$(document).ready(function () {
$('.listree-titles').html('目录[+]')
$('#listree-ol').empty();
$("#listree-ol").css("display", "none")
// 获取所有标题元素
var headings = document.querySelectorAll('.post-single .single-content *:is(h1, h2, h3, h4, h5, h6)');
// 为标题元素添加 listree-list 类,并修改 id
headings.forEach(function (heading, index) {
heading.classList.add('listree-list');
heading.id = 'listree-list' + index;
});
// 创建一个空的目录列表
var tocList = document.querySelector('#listree-ol');
// 保存每个级别的父列表项
var parentItems = {};
// 遍历每个标题元素
headings.forEach(function (heading, index) {
// 创建列表项
var listItem = document.createElement('li');
// 创建标题链接
var link = document.createElement('a');
// 直接设置链接的href为标题元素的id
link.href = '#listree-list' + index;
link.classList.add('toc-link', 'node-name--' + heading.tagName);
link.textContent = heading.textContent.trim();
// 将标题链接添加到列表项中
listItem.appendChild(link);
// 获取当前标题级别
var level = parseInt(heading.tagName.slice(1));
// 查找当前标题的父级列表项
var parentItem = parentItems[level - 1];
// 如果存在父级列表项,则将当前列表项作为其子项
if (parentItem) {
// 如果父级列表项还没有子列表,则创建一个子列表
if (!parentItem.querySelector('ul')) {
var subList = document.createElement('ul');
parentItem.appendChild(subList);
}
// 将当前列表项添加到父级列表的子列表中
parentItem.querySelector('ul').appendChild(listItem);
} else {
// 如果不存在父级列表项,则将当前列表项直接添加到根列表中
tocList.appendChild(listItem);
}
// 更新当前级别的父列表项为当前列表项
parentItems[level] = listItem;
});
$(".listree-btn").click(function () {
"目录[+]" == $(".listree-btn").text() ? $(".listree-btn").attr("title", "收起").text("目录[-]").parent().next().show() : $(".listree-btn").attr("title", "展开").text("目录[+]").parent().next().hide();
return !1
});
$("a.toc-link").click(function (event) {
event.preventDefault();
var targetId = $(this).attr("href");
$("html, body").animate({
scrollTop: $(targetId).offset().top - 77
}, 800);
});
// 判断是否存在目录,设置显示或隐藏
if ($('#listree-ol').children().length > 0) {
$(".listree-box").css("display", "block");
} else {
$(".listree-box").css("display", "none");
}
})
jQuery(document).ready(function (f) {
var T = f(".listree-list");
if (T.length < 1)
return;
var b = [];
function Q() {
T.each(function () {
var T = f(this).offset();
b.push(Math.floor(T.top))
})
}
function a(T) {
var b = f("#listree-ol li");
var Q = f(".listree-list dt");
if (b.length < 1)
return;
var a = b.outerHeight();
if (!b.eq(T).hasClass("current")) {
b.removeClass("current");
b.eq(T).addClass("current");
Q.animate({
top: a * T + (b.outerHeight() - Q.outerHeight()) / 2 + 1
}, 50)
}
}
function X() {
if ($('#listree-ol').children().length < 1)
return;
var f = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0;
var Q = Math.ceil(f + 77);
var X = 0;
for (var aU = 0; aU < b.length; aU++) {
if (Q >= b[aU]) {
X = aU
} else {
break
}
}
if (X < 0)
X = 0;
if (!T.eq(X).hasClass("current")) {
T.removeClass("current");
T.eq(X).addClass("current");
a(X)
}
}
Q();
setTimeout(X, 0);
f(window).on("scroll", X)
});
}
pix.addRuntime();
$(document).ready(function () {
$("[data-fancybox]").fancybox({
selector: '[data-fancybox]',
loop: true,
transitionEffect: 'slide',
protect: true,
buttons: ['slideShow', 'fullScreen', 'thumbs', 'close'],
hash: false
})
})
// 手机端底部菜单高亮
function highlightActiveMenu() {
let currentPath = window.location.pathname.replace(/\/+$/, "");
const pathParts = currentPath.split('/');
let firstLevelPath = '/' + (pathParts[1] || '');
if (firstLevelPath === '/') currentPath = '/';
const menuRules = {
diary: ['/', '/moments'],
composition: ['/content', '/categories', '/tags', '/archives'],
appendix: []
};
const footerMenu = document.querySelector('.footer_menu');
if (!footerMenu) return;
const diaryLi = footerMenu.querySelector('a[href="/"]').closest('li');
const compositionLi = footerMenu.querySelector('a[href="/archives"]').closest('li');
const appendixLi = footerMenu.querySelector('a[href="/navigator"]').closest('li');
const allMenuLis = footerMenu.querySelectorAll('.item li');
allMenuLis.forEach(li => {
li.classList.remove('active');
const link = li.querySelector('a');
if (link) {
link.classList.remove('active');
link.style.color = "";
const icon = link.querySelector("i");
if (icon) icon.style.color = "";
}
});
const highlightMenu = (menuLi) => {
if (!menuLi) return;
const link = menuLi.querySelector('a');
menuLi.classList.add('active');
link.classList.add('active');
link.style.color = "#4CAF50";
const icon = link.querySelector("i");
if (icon) icon.style.color = "#4CAF50";
};
if (menuRules.diary.includes(firstLevelPath)) {
highlightMenu(diaryLi);
}
else if (menuRules.composition.includes(firstLevelPath)) {
highlightMenu(compositionLi);
}
else {
highlightMenu(appendixLi);
}
}
// 指定日期黑白效果
function setPageGrayscale() {
const dateList = ['12-13'];
const style = document.createElement('style');
style.innerHTML = '.grayscale-mode{filter:grayscale(100%)!important;-webkit-filter:grayscale(100%)!important;transition:filter 60s ease!important;}';
document.head.appendChild(style);
const today = new Date();
const todayMd = `${today.getMonth() + 1}-${today.getDate()}`;
if (dateList.includes(todayMd)) {
document.documentElement.classList.add('grayscale-mode');
}
}
// 内容折叠初始化
function initializeMomentFold() {
const foldConfig = {
maxHeight: 240,
moreText: '展开',
lessText: '收起'
};
$('.moment-collapse-container').each(function () {
const $contentContainer = $(this);
if ($contentContainer.next('.moment-fold-btn').length > 0) return;
// 完整内容高度
const fullHeight = $contentContainer[0].scrollHeight;
const needFold = fullHeight > foldConfig.maxHeight;
if (!needFold) return;
// 初始化折叠状态
$contentContainer.addClass('collapsed').css('max-height', foldConfig.maxHeight + 'px');
const $foldBtn = $(``);
$contentContainer.after($foldBtn);
// 折叠/展开切换
$foldBtn.on('click', function () {
const isCollapsed = $contentContainer.hasClass('collapsed');
const heightDiff = fullHeight - foldConfig.maxHeight; // 完整高度与折叠高度的差值
if (isCollapsed) {
// 展开逻辑
$contentContainer.removeClass('collapsed').css('max-height', fullHeight + 'px');
$(this).text(foldConfig.lessText);
} else {
// 收起逻辑:页面向下滚动差值距离
$('html, body').animate({ scrollTop: $(window).scrollTop() - heightDiff }, 300, 'linear');
$contentContainer.addClass('collapsed').css('max-height', foldConfig.maxHeight + 'px');
$(this).text(foldConfig.moreText);
}
});
});
}
// // 更换banner函数封装(PJAX触发)
// const bg1 = document.querySelector('.bg1');
// const bg2 = document.querySelector('.bg2');
// let bannerIndex = 0;
// let isBg1Active = true;
// let hasSingleBannerShown = false;
// let bannerImages = [];
// function preloadImage(url) {
// return new Promise((resolve, reject) => {
// const img = new Image();
// img.onload = () => resolve(url);
// img.onerror = reject;
// img.src = url;
// });
// }
// function changeBanner(url) {
// const show = isBg1Active ? bg2 : bg1;
// const hide = isBg1Active ? bg1 : bg2;
// show.style.backgroundImage = `url(${url})`;
// show.style.opacity = 1;
// hide.style.opacity = 0;
// isBg1Active = !isBg1Active;
// }
// async function safeChangeBanner(url) {
// await preloadImage(url);
// changeBanner(url);
// }
// function nextBanner() {
// if (bannerImages.length < 1) return;
// if (bannerImages.length === 1) {
// // 第一次调用:显示图片并标记为已显示
// if (!hasSingleBannerShown) {
// safeChangeBanner(bannerImages[bannerIndex]);
// hasSingleBannerShown = true;
// }
// // 非第一次调用:直接返回,不触发切换
// return;
// }
// safeChangeBanner(bannerImages[bannerIndex]);
// bannerIndex = (bannerIndex + 1) % bannerImages.length;
// }
// // 重置状态函数
// function resetBannerState() {
// bannerIndex = 0;
// isBg1Active = true;
// hasSingleBannerShown = false;
// }
// 更换背景函数封装
function setFixedBackground(bgImageUrl) {
const body = document.body;
body.classList.add('common-fixed-bg');
body.style.backgroundImage = `url('${bgImageUrl}')`;
}
// 奇遇显示函数封装
function showCenterImage(imageUrl) {
const container = document.getElementById('centerImgContainer');
const img = document.getElementById('targetImg');
// 重置所有状态(避免上一次操作残留影响)
container.classList.remove('container-fade-active');
img.classList.remove('img-fade-in', 'img-fade-out');
img.style.opacity = 0;
img.src = ""; // 先清空原有src
// 定义图片加载成功的回调函数
function handleImageLoad() {
// 移除事件监听(防止重复绑定)
img.removeEventListener('load', handleImageLoad);
img.removeEventListener('error', handleImageError);
// 图片加载成功后,再执行淡入动画
container.classList.add('container-fade-active');
img.classList.add('img-fade-in');
// 图片显示1.5秒后,执行自动关闭逻辑
setTimeout(() => {
container.classList.remove('container-fade-active');
img.classList.add('img-fade-out');
setTimeout(() => {
img.classList.remove('img-fade-in', 'img-fade-out');
}, 500);
}, 1500);
}
// 定义图片加载失败的回调函数
function handleImageError() {
// 移除事件监听
img.removeEventListener('load', handleImageLoad);
img.removeEventListener('error', handleImageError);
// 重置容器和图片状态,不执行任何动画
container.classList.remove('container-fade-active');
img.classList.remove('img-fade-in', 'img-fade-out');
img.style.opacity = 0;
img.src = "";
}
// 绑定图片加载/失败事件监听(先绑定,再赋值src,避免缓存导致回调不触发)
img.addEventListener('load', handleImageLoad);
img.addEventListener('error', handleImageError);
// 最后赋值src,触发图片加载(异步操作)
img.src = imageUrl;
}
// 侧边栏农历信息显示函数
function anian_renderLunarUI() {
const textEl = document.getElementById('anianLunarText');
const cookieName = 'anian_lunar_info';
const defaultText = '一日不见如隔三秋';
const maxRetries = 20;
if (!textEl) return;
const doRender = (data) => {
if (!data) {
textEl.innerHTML = defaultText;
return;
}
const { ganzhiYear = '', lunarMonth = '', lunarDay = '', jieqi = '', jijie = '', traditionalFestival = '' } = data;
let text = `${ganzhiYear}年${lunarMonth}${lunarDay}`;
const extra = [];
if (jieqi) extra.push(jieqi);
if (traditionalFestival) extra.push(traditionalFestival);
if (extra.length) text += `
${extra.join(' · ')}`;
textEl.innerHTML = text;
if (jieqi === '大寒') showCenterImage('/upload/qiyu-jieqi-dahan.png');
// setFixedBackground('/upload/JX3WJ.mp4_20260207_022345.027.jpg');
};
const tryRender = (attempt) => {
let data = null;
try {
const cookieVal = anian_getCookie(cookieName);
if (cookieVal) data = JSON.parse(cookieVal);
} catch (_) { }
if (data) {
doRender(data);
} else if (attempt < maxRetries) {
setTimeout(() => tryRender(attempt + 1), 500);
} else {
doRender(null);
}
};
tryRender(0);
}
// 绿色数字时钟粒子效果
function initGreenDigitalClock() {
var t = 820;
var a = 250;
var r = 7;
var n = 10;
var e = .65;
var f;
var o = [];
const v = ["#00FF7F", "#32CD32", "#228B22", "#008000", "#006400", "#90EE90", "#98FB98", "#00FA9A", "#00FF00", "#3CB371"];
var h = [];
var u = [
[[0, 0, 1, 1, 1, 0, 0], [0, 1, 1, 0, 1, 1, 0], [1, 1, 0, 0, 0, 1, 1], [1, 1, 0, 0, 0, 1, 1], [1, 1, 0, 0, 0, 1, 1], [1, 1, 0, 0, 0, 1, 1], [1, 1, 0, 0, 0, 1, 1], [1, 1, 0, 0, 0, 1, 1], [0, 1, 1, 0, 1, 1, 0], [0, 0, 1, 1, 1, 0, 0]],
[[0, 0, 0, 1, 1, 0, 0], [0, 1, 1, 1, 1, 0, 0], [0, 0, 0, 1, 1, 0, 0], [0, 0, 0, 1, 1, 0, 0], [0, 0, 0, 1, 1, 0, 0], [0, 0, 0, 1, 1, 0, 0], [0, 0, 0, 1, 1, 0, 0], [0, 0, 0, 1, 1, 0, 0], [0, 0, 0, 1, 1, 0, 0], [1, 1, 1, 1, 1, 1, 1]],
[[0, 1, 1, 1, 1, 1, 0], [1, 1, 0, 0, 0, 1, 1], [0, 0, 0, 0, 0, 1, 1], [0, 0, 0, 0, 1, 1, 0], [0, 0, 0, 1, 1, 0, 0], [0, 0, 1, 1, 0, 0, 0], [0, 1, 1, 0, 0, 0, 0], [1, 1, 0, 0, 0, 0, 0], [1, 1, 0, 0, 0, 1, 1], [1, 1, 1, 1, 1, 1, 1]],
[[1, 1, 1, 1, 1, 1, 1], [0, 0, 0, 0, 0, 1, 1], [0, 0, 0, 0, 1, 1, 0], [0, 0, 0, 1, 1, 0, 0], [0, 0, 1, 1, 1, 0, 0], [0, 0, 0, 0, 1, 1, 0], [0, 0, 0, 0, 0, 1, 1], [0, 0, 0, 0, 0, 1, 1], [1, 1, 0, 0, 0, 1, 1], [0, 1, 1, 1, 1, 1, 0]],
[[0, 0, 0, 0, 1, 1, 0], [0, 0, 0, 1, 1, 1, 0], [0, 0, 1, 1, 1, 1, 0], [0, 1, 1, 0, 1, 1, 0], [1, 1, 0, 0, 1, 1, 0], [1, 1, 1, 1, 1, 1, 1], [0, 0, 0, 0, 1, 1, 0], [0, 0, 0, 0, 1, 1, 0], [0, 0, 0, 0, 1, 1, 0], [0, 0, 0, 1, 1, 1, 1]],
[[1, 1, 1, 1, 1, 1, 1], [1, 1, 0, 0, 0, 0, 0], [1, 1, 0, 0, 0, 0, 0], [1, 1, 1, 1, 1, 1, 0], [0, 0, 0, 0, 0, 1, 1], [0, 0, 0, 0, 0, 1, 1], [0, 0, 0, 0, 0, 1, 1], [0, 0, 0, 0, 0, 1, 1], [1, 1, 0, 0, 0, 1, 1], [0, 1, 1, 1, 1, 1, 0]],
[[0, 0, 0, 0, 1, 1, 0], [0, 0, 1, 1, 0, 0, 0], [0, 1, 1, 0, 0, 0, 0], [1, 1, 0, 0, 0, 0, 0], [1, 1, 0, 1, 1, 1, 0], [1, 1, 0, 0, 0, 1, 1], [1, 1, 0, 0, 0, 1, 1], [1, 1, 0, 0, 0, 1, 1], [1, 1, 0, 0, 0, 1, 1], [0, 1, 1, 1, 1, 1, 0]],
[[1, 1, 1, 1, 1, 1, 1], [1, 1, 0, 0, 0, 1, 1], [0, 0, 0, 0, 1, 1, 0], [0, 0, 0, 0, 1, 1, 0], [0, 0, 0, 1, 1, 0, 0], [0, 0, 0, 1, 1, 0, 0], [0, 0, 1, 1, 0, 0, 0], [0, 0, 1, 1, 0, 0, 0], [0, 0, 1, 1, 0, 0, 0], [0, 0, 1, 1, 0, 0, 0]],
[[0, 1, 1, 1, 1, 1, 0], [1, 1, 0, 0, 0, 1, 1], [1, 1, 0, 0, 0, 1, 1], [1, 1, 0, 0, 0, 1, 1], [0, 1, 1, 1, 1, 1, 0], [1, 1, 0, 0, 0, 1, 1], [1, 1, 0, 0, 0, 1, 1], [1, 1, 0, 0, 0, 1, 1], [1, 1, 0, 0, 0, 1, 1], [0, 1, 1, 1, 1, 1, 0]],
[[0, 1, 1, 1, 1, 1, 0], [1, 1, 0, 0, 0, 1, 1], [1, 1, 0, 0, 0, 1, 1], [1, 1, 0, 0, 0, 1, 1], [0, 1, 1, 1, 0, 1, 1], [0, 0, 0, 0, 0, 1, 1], [0, 0, 0, 0, 0, 1, 1], [0, 0, 0, 0, 1, 1, 0], [0, 0, 0, 1, 1, 0, 0], [0, 1, 1, 0, 0, 0, 0]],
[[0, 0, 0, 0], [0, 0, 0, 0], [0, 1, 1, 0], [0, 1, 1, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 1, 1, 0], [0, 1, 1, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
];
function l(t) {
var a = [];
f.fillStyle = "#006400";
var r = new Date;
var e = 70, o = 30;
var v = r.getHours();
var u = Math.floor(v / 10);
var l = v % 10;
a.push({ num: u });
a.push({ num: l });
a.push({ num: 10 });
var c = r.getMinutes();
var u = Math.floor(c / 10);
var l = c % 10;
a.push({ num: u });
a.push({ num: l });
a.push({ num: 10 });
var M = r.getSeconds();
var u = Math.floor(M / 10);
var l = M % 10;
a.push({ num: u });
a.push({ num: l });
for (var p = 0; p < a.length; p++) {
a[p].offsetX = e;
e = m(e, o, a[p].num, t);
if (p < a.length - 1) {
if (a[p].num != 10 && a[p + 1].num != 10) {
e += n
}
}
}
if (h.length == 0) {
h = a
} else {
for (var C = 0; C < h.length; C++) {
if (h[C].num != a[C].num) {
s(a[C]);
h[C].num = a[C].num
}
}
}
i(t);
g();
return r
}
function s(t) {
var a = t.num;
var n = u[a];
for (var e = 0; e < n.length; e++) {
for (var f = 0; f < n[e].length; f++) {
if (n[e][f] == 1) {
var h = {
offsetX: t.offsetX + r + r * 2 * f,
offsetY: 30 + r + r * 2 * e,
color: v[Math.floor(Math.random() * v.length)],
g: 1.5 + Math.random(),
vx: Math.pow(-1, Math.ceil(Math.random() * 10)) * 4 + Math.random(),
vy: -5
};
o.push(h)
}
}
}
}
function i(t) {
for (var a = 0; a < o.length; a++) {
t.beginPath();
t.fillStyle = o[a].color;
t.arc(o[a].offsetX, o[a].offsetY, r, 0, 2 * Math.PI);
t.fill()
}
}
function g() {
var n = 0;
for (var f = 0; f < o.length; f++) {
var v = o[f];
v.offsetX += v.vx;
v.offsetY += v.vy;
v.vy += v.g;
if (v.offsetY > a - r) {
v.offsetY = a - r;
v.vy = -v.vy * e
}
if (v.offsetX > r && v.offsetX < t - r) {
o[n] = o[f];
n++
}
}
for (; n < o.length; n++) {
o.pop()
}
}
function m(t, a, n, e) {
var f = u[n];
for (var o = 0; o < f.length; o++) {
for (var v = 0; v < f[o].length; v++) {
if (f[o][v] == 1) {
e.beginPath();
e.arc(t + r + r * 2 * v, a + r + r * 2 * o, r, 0, 2 * Math.PI);
e.fill()
}
}
}
e.beginPath();
t += f[0].length * r * 2;
return t
}
var c = document.getElementById("canvas");
c.width = t;
c.height = a;
f = c.getContext("2d");
var M = new Date;
setInterval(function () {
f.clearRect(0, 0, f.canvas.width, f.canvas.height);
l(f)
}, 50)
}
// 侧边栏公告提醒 - 多RSS监控版(精准到秒+无兜底)
const COOKIE_EXPIRE_YEARS = 10;
const NOTICE_DETAIL_PATH = '/notice';
const RSS_URLS = [
'https://git.anian.cc/anian/halo-theme-pix/releases.rss',
];
async function getAllLatestNoticeDatesFromRSS() {
try {
const rssResponses = await Promise.all(
RSS_URLS.map(url => fetch(url))
);
for (let [index, response] of rssResponses.entries()) {
if (!response.ok) {
throw new Error(`RSS ${RSS_URLS[index]} 请求失败:${response.status}`);
}
}
const allPubDates = [];
for (let response of rssResponses) {
const xmlText = await response.text();
const parser = new DOMParser();
const xmlDoc = parser.parseFromString(xmlText, 'text/xml');
const items = xmlDoc.querySelectorAll('item');
if (items.length === 0) continue;
const itemDates = Array.from(items).map(item => {
const pubDateStr = item.querySelector('pubDate').textContent;
const pubDate = new Date(pubDateStr);
return `${pubDate.getFullYear()}-${String(pubDate.getMonth() + 1).padStart(2, '0')}-${String(pubDate.getDate()).padStart(2, '0')}-${String(pubDate.getHours()).padStart(2, '0')}-${String(pubDate.getMinutes()).padStart(2, '0')}-${String(pubDate.getSeconds()).padStart(2, '0')}`;
});
allPubDates.push(itemDates[0]);
}
const sortedDates = allPubDates.sort((a, b) => new Date(b) - new Date(a));
const combinedDateStr = sortedDates.join('_'); // 用_分隔多个日期
return combinedDateStr;
} catch (error) {
return null;
}
}
// 标记已读(接收拼接后的日期字符串)
function markAsRead(combinedDateStr) {
if (!combinedDateStr) return; // 无有效日期则不操作
const noticeBubble = document.getElementById('noticeBubble');
const noticeBtn = document.getElementById('noticeBtn');
if (!noticeBubble || !noticeBtn) return;
$.cookie('latest_notice_date', combinedDateStr, { path: '/', domain: 'anian.cc', expires: 365 });
noticeBubble.classList.remove('show');
noticeBtn.classList.remove('has-notice');
}
// 检测公告详情页并标记已读
function checkNoticeDetailPage(combinedDateStr) {
if (!combinedDateStr) return; // 无有效日期则不检查
const currentPath = window.location.pathname.replace(/\/$/, '');
const local_notice = $.cookie('latest_notice_date');
const hasUnread = !local_notice || local_notice !== combinedDateStr;
if (currentPath === NOTICE_DETAIL_PATH && hasUnread) {
markAsRead(combinedDateStr);
}
}
// 通知按钮绑定
function bindGlobalNoticeEvents(combinedDateStr) {
if (document.body.dataset.noticeEventsBound) return;
document.addEventListener('click', (e) => {
const noticeBtn = document.getElementById('noticeBtn');
if (noticeBtn && (e.target === noticeBtn || noticeBtn.contains(e.target))) {
markAsRead(combinedDateStr);
}
});
document.body.dataset.noticeEventsBound = 'true';
}
// 异步初始化(无兜底逻辑)
async function initNoticeTip() {
// 1. 获取所有RSS的拼接日期字符串,失败则直接终止
const combinedDateStr = await getAllLatestNoticeDatesFromRSS();
if (!combinedDateStr) return; // 【核心】RSS失败则不检查、不显示提醒
const noticeBubble = document.getElementById('noticeBubble');
const noticeBtn = document.getElementById('noticeBtn');
if (!noticeBubble || !noticeBtn) return;
const local_notice = $.cookie('latest_notice_date');
const hasUnread = !local_notice || local_notice !== combinedDateStr;
// 2. 只有RSS获取成功,才判断并显示/隐藏提醒
if (hasUnread) {
noticeBubble.classList.add('show');
noticeBtn.classList.add('has-notice');
} else {
noticeBubble.classList.remove('show');
noticeBtn.classList.remove('has-notice');
}
bindGlobalNoticeEvents(combinedDateStr);
checkNoticeDetailPage(combinedDateStr);
}
// 测速侧边栏
const anianxSpeedBubble = document.getElementById("anianxBubble"),
anianxSpeedBubbleText = document.getElementById("anianxBubbleText"),
anianxSpeedGroup = document.querySelector(".anianx-group"),
anianxSpeedMainLine = document.querySelector('[data-anianx-type="main"]'),
anianxSpeedTestLine = document.querySelector('[data-anianx-type="test"]'),
anianxSpeedSubLine = document.querySelector('[data-anianx-type="sub"]');
let anianxSpeedGlobalLock = false;
function anianxSpeedMoveArrow(btn) {
if (anianxSpeedGlobalLock) return;
const btnRect = btn.getBoundingClientRect(),
groupRect = anianxSpeedGroup.getBoundingClientRect(),
center = (btnRect.left - groupRect.left) + (btnRect.width / 2);
anianxSpeedBubble.style.setProperty("--anianx-arrow", center + "px");
}
if (location.hostname === "anian.cc") {
anianxSpeedMainLine.classList.add("anianx-fixed");
anianxSpeedBubbleText.classList.remove("anianx-loading");
anianxSpeedBubbleText.innerText = "当前为主线路";
anianxSpeedMoveArrow(anianxSpeedMainLine);
} else if (location.hostname === "www.anian.cc") {
anianxSpeedSubLine.classList.add("anianx-fixed");
anianxSpeedBubbleText.classList.remove("anianx-loading");
anianxSpeedBubbleText.innerText = "当前为副线路";
anianxSpeedMoveArrow(anianxSpeedSubLine);
} else {
anianxSpeedBubbleText.classList.remove("anianx-loading");
anianxSpeedBubbleText.innerText = "当前为测试线路";
anianxSpeedMoveArrow(anianxSpeedTestLine);
}
anianxSpeedMainLine.addEventListener("click", () => {
if (anianxSpeedGlobalLock) return;
anianxSpeedMoveArrow(anianxSpeedMainLine);
anianxSpeedGlobalLock = true;
if (anianxSpeedMainLine.classList.contains("anianx-fixed")) {
anianxSpeedBubbleText.classList.remove("anianx-loading");
anianxSpeedBubbleText.innerText = "当前为主线路";
anianxSpeedGlobalLock = false;
} else {
anianxSpeedBubbleText.classList.add("anianx-loading");
anianxSpeedBubbleText.innerText = "正在切换至主线路";
anianxSpeedMoveArrow(anianxSpeedMainLine);
const currentScrollTop = window.scrollY || document.documentElement.scrollTop;
$.cookie('scrollParam', currentScrollTop, { path: '/', domain: 'anian.cc' });
const finalUrl = anianxSpeedMainLine.dataset.anianxHref + location.pathname +
location.search + location.hash;
location.href = finalUrl;
}
});
anianxSpeedSubLine.addEventListener("click", () => {
if (anianxSpeedGlobalLock) return;
anianxSpeedMoveArrow(anianxSpeedSubLine);
anianxSpeedGlobalLock = true;
if (anianxSpeedSubLine.classList.contains("anianx-fixed")) {
anianxSpeedBubbleText.classList.remove("anianx-loading");
anianxSpeedBubbleText.innerText = "当前为副线路";
anianxSpeedGlobalLock = false;
} else {
anianxSpeedBubbleText.classList.add("anianx-loading");
anianxSpeedBubbleText.innerText = "正在切换至副线路";
anianxSpeedMoveArrow(anianxSpeedSubLine);
const currentScrollTop = window.scrollY || document.documentElement.scrollTop;
const baseUrl = anianxSpeedSubLine.dataset.anianxHref + location.pathname + location.search;
$.cookie('scrollParam', currentScrollTop, { path: '/', domain: 'anian.cc' });
const finalUrl = baseUrl + location.hash;
location.href = finalUrl;
}
});
anianxSpeedTestLine.addEventListener("click", () => {
if (anianxSpeedGlobalLock) return;
anianxSpeedMoveArrow(anianxSpeedTestLine);
anianxSpeedGlobalLock = true;
anianxSpeedBubbleText.classList.add("anianx-loading");
anianxSpeedBubbleText.innerText = "测速中";
anianxSpeedTestWithTimeout(7500).then(result => {
anianxSpeedBubbleText.classList.remove("anianx-loading");
anianxSpeedBubbleText.innerText = result;
}).catch(() => {
anianxSpeedBubbleText.classList.remove("anianx-loading");
anianxSpeedBubbleText.innerText = "请检查网络或切换线路";
}).finally(() => {
anianxSpeedGlobalLock = false;
});
});
function anianxSpeedTestWithTimeout(timeout) {
const controller = new AbortController();
const timer = setTimeout(() => controller.abort(), timeout);
return new Promise(async (resolve, reject) => {
try {
const t0 = Date.now();
const res = await fetch(`/upload/%E4%B8%8B%E8%BD%BD%20(9).mp4?t=${Date.now()}`, {
signal: controller.signal
});
const blob = await res.blob();
const size = blob.size;
const sec = (Date.now() - t0) / 1000;
const mbps = ((size * 8) / (sec * 1024 * 1024)).toFixed(2);
clearTimeout(timer);
resolve("正常:" + mbps + " Mbps");
} catch (e) {
clearTimeout(timer);
reject(e);
}
});
}
function initTagSwitch() {
return new Promise((resolve, reject) => {
const pathname = window.location.pathname;
const urlParams = new URLSearchParams(window.location.search);
const activeTag = urlParams.get('tag');
if (!activeTag || activeTag.trim() === '') {
resolve();
return;
}
let targetLink = $();
if (pathname === '/archives') {
targetLink = $('.posts_cat_nav ul li a').filter(function () {
const linkText = $(this).contents().filter(function () {
return this.nodeType === 3;
}).text().trim();
return linkText === activeTag;
});
} else if (pathname === '/photos') {
targetLink = $('.photos_cat_nav ul li a').filter(function () {
const linkText = $(this).clone().find('span').remove().end().text().trim();
return linkText === activeTag;
});
} else if (pathname === '/friends') {
targetLink = $('.friends_cat_nav ul li a').filter(function () {
const linkText = $(this).clone().find('span').remove().end().text().trim();
return linkText === activeTag;
});
}
if (targetLink.length > 0) {
window._tagSwitchCallback = { resolve, reject };
targetLink.click();
} else {
resolve();
}
});
}
// 1. 定义一个全局标志位,用于外部强制终止
window.forceStopLoading = false;
window.loadMoreTimeout = false;
function loadMultiplePages(pageCount) {
return new Promise((resolve) => {
let loadedCount = 0;
window.forceStopLoading = false; // 每次启动重置标志位
const getCurrentBtn = () => {
const $allBtns = $('.post-paging a:visible');
return $allBtns.filter(function () {
const dataAttr = $(this).attr('data');
return dataAttr !== undefined && dataAttr !== "" && dataAttr !== "无data属性";
}).first();
};
const loadNext = () => {
if (loadedCount >= pageCount || window.forceStopLoading) {
resolve();
return;
}
const $btn = getCurrentBtn();
if (!$btn || !$btn.length) {
resolve();
return;
}
const $pager = $btn.closest('.post-paging');
const oldHref = $btn.attr('data');
const pageStartTime = Date.now();
$btn.trigger('click'); // 加载更多
const waitInterval = setInterval(() => {
const now = Date.now();
if (window.forceStopLoading) {
clearInterval(waitInterval);
resolve();
return;
}
if (now - pageStartTime > 3000) {
clearInterval(waitInterval);
window.loadMoreTimeout = true;
resolve(); // 解决 Promise,触发后续滚动
return;
}
const isLoading = $pager.find('[uk-spinner]').length > 0;
if (isLoading) return; // 还在转圈,继续等待
clearInterval(waitInterval);
const $newBtn = getCurrentBtn();
const newHref = $newBtn.length ? $newBtn.attr('data') : null;
if (newHref && newHref !== oldHref) {
loadedCount++;
setTimeout(loadNext, 50);
} else {
resolve();
}
}, 50);
};
loadNext();
});
}
function initjump() {
let closeLoading = null;
const page = $.cookie('page');
const scrollParam = $.cookie('scrollParam');
$.removeCookie('scrollParam', { path: '/', domain: 'anian.cc' });
$.removeCookie('page', { path: '/', domain: 'anian.cc' });
window.scroll_param = scrollParam;
if (scrollParam && !isNaN(scrollParam)) {
closeLoading = cocoMessage.loading('自动恢复原线路内容中...');
}
initTagSwitch().then(() => {
const loadPageTask = () => {
if (page && !isNaN(page)) {
const targetPage = Number(page) - 1;
return loadMultiplePages(targetPage);
}
return Promise.resolve();
};
if (scrollParam && !isNaN(scrollParam)) {
loadPageTask().then(() => {
const recordScroll = Number(scrollParam);
const maxScroll = document.documentElement.scrollHeight - window.innerHeight;
const scrollDistance = Math.min(recordScroll, maxScroll);
$('html, body').animate({ scrollTop: scrollDistance }, 500);
if (recordScroll > maxScroll && (recordScroll - maxScroll) > 200) {
closeLoading();
cocoMessage.warning('请手动加载原线路内容');
} else {
const msg = location.hostname === "anian.cc" ? '主线路' : (location.hostname === "www.anian.cc" ? '副线路' : '测试线路');
closeLoading();
cocoMessage.success(`已成功切换至${msg}`);
}
}).catch(() => closeLoading?.());
}
}).catch(() => closeLoading?.());
}
// 侧边栏订阅函数
async function handleSubscribe(event) {
event.preventDefault();
const form = event.target;
const input = form.querySelector(".subscribe-input");
const btn = form.querySelector(".subscribe-btn");
const msg = document.getElementById("subscribe-message");
const email = input.value.trim();
if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email)) {
return show("请输入正确格式的邮箱地址", "error");
}
btn.disabled = true;
show("正在提交…");
try {
const res = await fetch(
"https://anian.cc/apis/api.flow.post.kunkunyu.com/v1alpha1/follows/-/submit",
{
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ email })
}
);
if (res.status === 200) {
show("订阅成功", "success");
input.value = "";
} else {
show("您已订阅过", "warning");
}
} catch {
show("网络错误,请稍后再试", "error");
}
btn.disabled = false;
function show(text, type) {
msg.textContent = text;
msg.className = `subscribe-message ${type}`;
}
}
// 图库兼容视频监听刷新排版
let wfTimer = null;
document.addEventListener('loadedmetadata', function (e) {
if (
e.target.tagName === 'VIDEO' &&
e.target.closest('.gallery-photos')
) {
clearTimeout(wfTimer);
wfTimer = setTimeout(() => {
waterfall('.gallery-photos');
}, 300);
}
}, true);
function initBlog() {
pix.initTopBar(),
pix.getMsg(),
initAgree(),
pix.initGalleryPhotos(),
pix.loadLightbox(),
pix.topCategoriesBarScroll(),
pix.topTableBarScroll(),
getMomentAudio(),
Theme.toc.all_open && autotree(),
highlightActiveMenu(),
syncFooterWithAudioState(),
highlightMenu(),
initializeMomentFold()
// nextBanner()
}
$(document).ready(function () {
pix.roleMoments();
initBlog();
setPageGrayscale();
anian_renderLunarUI();
updateMusicBtnColor('default');
initGreenDigitalClock();
initNoticeTip();
initjump();
});