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'); }); var route = location.href.substring(0, location.href.indexOf('?') === -1 ? (location.href.indexOf('#') === -1 ? location.href.length : location.href.indexOf('#')) : location.href.indexOf('?')) $('.left_menu_box ul li a').each((i, e) => { if (e.parentElement.childNodes.length > 3) { return } let href = e.href.substring(0, e.href.indexOf('?') === -1 ? (e.href.indexOf('#') === -1 ? e.href.length : e.href.indexOf('#')) : e.href.indexOf('?')) if (route === href) { e.parentElement.classList.add('current-pjax-item') } }) $('.left_menu_box ul li ul li a').each((i, e) => { let href = e.href.substring(0, e.href.indexOf('?') === -1 ? (e.href.indexOf('#') === -1 ? e.href.length : e.href.indexOf('#')) : e.href.indexOf('?')) if (route === href) { e.parentElement.parentElement.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("
" + tot.toFixed(2) + "MB
"); $.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 = `
${mediaInner}
`; $(".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 = `
    ${mediaPreview}
    `; $(".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); $(".moment_list").empty(); $('#t_pagination a').hide(); $this.addClass('active').parent().siblings().children().removeClass('active'); var cat = $this.attr('data'); $.ajax({ type: "GET", url: cat, beforeSend: function () { $('.moment_list').html('
    '); }, success: function (data) { $('.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 }, '', '/'); } document.cookie = "page=; path=/; domain=anian.cc; max-age=0"; } }); }); //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]); $.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(); //如果没有下一页了,隐藏 } $body.animate({scrollTop: result.offset().top - 58}, 500); getMomentAudio(); initAgree(); lazyLoadInstance.update(); initializeMomentFold(); modify_moment_video_size(); document.cookie = `page=${encodeURIComponent(currentPage)}; path=/; domain=anian.cc`; } else { $('#t_pagination a').hide(); } } }); return false; }); // 图库分类切换 AJAX (完整版) $(document).ready(function () { // 1. 先解绑旧事件,防止重复绑定导致的冲突 $(document).off('click', '#cat_nav_items a.cat-link'); // 2. 绑定新的点击事件 $(document).on('click', '#cat_nav_items a.cat-link', function (e) { // 阻止默认行为 e.preventDefault(); e.stopPropagation(); e.stopImmediatePropagation(); var $this = $(this); // 3. 状态检查 if ($this.hasClass('disabled') || $this.hasClass('active')) { return false; } // 获取 AJAX 请求地址 (用于后端获取数据) var url = $this.data('href'); if (!url) { console.error('未找到分类链接地址'); return false; } // --- 【新增逻辑 1】准备要显示在浏览器地址栏的 URL --- // 获取链接的纯文本内容(即中文分类名,如“苏州”) // clone() 后移除 span 再取 text,防止“全部”后面的空格干扰 var tagText = $this.clone().find('span').remove().end().text().trim(); var displayUrl; if (tagText === '全部') { displayUrl = '/photos'; } else { // 使用 encodeURIComponent 处理中文,防止 URL 乱码 displayUrl = '/photos?tag=' + encodeURIComponent(tagText); } // ---------------------------------------------------- // 4. UI 状态更新 $('#cat_nav_items a').addClass('disabled'); $this.addClass('active') .parent() .siblings() .children('a') .removeClass('active'); // 5. 发起 AJAX 请求 $.ajax({ type: "GET", url: url, beforeSend: function () { $("#photos_item").html( '
    ' ); $('#p_pagination').hide(); }, success: function (data) { var $data = $(data); // 6. 替换相册列表内容 var newContent = $data.find("#photos_item").html(); $("#photos_item").html(newContent); // 7. 同步更新分页区域 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(); } // 8. 重新初始化插件 if (typeof pix !== 'undefined' && pix.initGalleryPhotos) { pix.initGalleryPhotos(); } if ($('.gallery-photos').length > 0 && typeof waterfall === 'function') { waterfall('.gallery-photos'); } // 9. 恢复点击状态 $('#cat_nav_items a').removeClass('disabled'); // --- 【新增逻辑 2】修改浏览器 URL --- // 使用 pushState 更新地址栏,不刷新页面 // 参数:state对象, 标题, 新URL history.pushState({path: displayUrl}, '', displayUrl); // ---------------------------------- // 10. 清理分页 Cookie document.cookie = "page=; path=/; domain=anian.cc; max-age=0"; }, error: function () { $('#cat_nav_items a').removeClass('disabled'); cocoMessage.error('内容获取失败'); $("#photos_item").empty(); } }); return false; }); }); //ajax加载图库 $(document).on('click', '#p_pagination a', function () { var href = $(this).attr('data'); const currentPage = parseInt(href.match(/\d+/)[0]); $.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(); //如果没有下一页了,隐藏 } pix.initGalleryPhotos(); document.cookie = `page=${encodeURIComponent(currentPage)}; path=/; domain=anian.cc`; } else { $('#p_pagination a').hide(); } } }); 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"); // console.log(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 = `
    ${title}${author}
    `; } else { html = '音乐参数错误'; } $('#' + id).html(html); } }); } } } } // 初始化:解析URL的tag参数,匹配对应分类(中文名称)并触发原有请求 function initTagSwitch() { const pathname = window.location.pathname; const urlParams = new URLSearchParams(window.location.search); const activeTag = urlParams.get('tag'); // 如果没有 tag 参数,直接退出 if (!activeTag || activeTag.trim() === '') { return; } let targetLink = $(); // 初始化空 jQuery 对象 // --- 1. 判断是否为 Posts (文章归档) 页面 --- if (pathname === '/archives') { targetLink = $('.posts_cat_nav ul li a').filter(function() { // 保持你原有的 Post 文本提取逻辑 (过滤文本节点) const linkText = $(this).contents().filter(function() { return this.nodeType === 3; }).text().trim(); return linkText === activeTag; }); } // --- 2. 判断是否为 Photos (相册) 页面 --- else if (pathname === '/photos') { targetLink = $('#cat_nav_items a.cat-link').filter(function() { // 使用针对相册 HTML 结构的文本提取逻辑 (移除 span 干扰) const linkText = $(this).clone().find('span').remove().end().text().trim(); return linkText === activeTag; }); } // --- 3. 如果找到了匹配的链接,触发点击 --- if (targetLink.length > 0) { // 确保 DOM 完全就绪后再点击,加个小延迟防止插件未绑定 setTimeout(function() { targetLink.click(); }, 50); } } // ajax分类筛选 posts(完全保留原有请求逻辑,仅新增tag参数URL同步) $(document).on('click', '.posts_cat_nav ul li a', function (e) { e.preventDefault(); 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'); $(".norpost_list").empty(); $('#pagination a').hide(); $(this).addClass('active'); $(this).parent().siblings().children().removeClass('active'); 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) { $('#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); document.cookie = "page=; path=/; domain=anian.cc; max-age=0"; }, error: function() { $('.posts_cat_nav ul li a').removeClass('disabled'); } }); }); //首页ajax加载文章 $('body').on('click', '#pagination a', function () { const postListElement = document.getElementById("post_item"); 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(); //如果没有下一页了,隐藏 } $body.animate({scrollTop: result.offset().top - 58}, 500); initAgree() lazyLoadInstance.update(); document.cookie = `page=${encodeURIComponent(currentPage)}; path=/; domain=anian.cc`; } } }); return false; }); //分类页面文章加载 $('body').on('click', '.arc_pagenav a', function () { const postListElement = document.getElementById("post_item"); $(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(); $body.animate({scrollTop: post.offset().top - 58}, 500); initAgree() lazyLoadInstance.update(); } }); } 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("" + title + ""); }); $(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 > 200) { $('a.go_top').addClass('show'); } else { $('a.go_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 date = new Date(); date.setTime(date.getTime() + (3 * 60 * 60 * 1000)); var t = $('html'); if (t.hasClass('dark')) { document.cookie = "dark=normal;path=/;domain=anian.cc;expires=" + date.toGMTString(); } else { document.cookie = "dark=dark;path=/;domain=anian.cc;expires=" + date.toGMTString(); } 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); } }) .catch(console.error); }); $('.yiyan_box .change').click(); //pjax 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(); document.cookie = "page=; path=/; domain=anian.cc; max-age=0"; }) } // 刷新评论组件函数 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) { // console.log(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(/\/+$/, ""); if (currentPath === "") currentPath = "/"; const menuLinks = document.querySelectorAll('a[href]:not([href^="javascript"])'); // 清除现有样式 menuLinks.forEach(link => { link.style.color = ""; const icon = link.querySelector("i"); if (icon) icon.style.color = ""; }); // 高亮匹配项 menuLinks.forEach(link => { let linkPath = link.getAttribute("href").replace(/\/+$/, ""); if (linkPath === "") linkPath = "/"; const isMatch = currentPath === linkPath || (linkPath !== "/" && currentPath.startsWith(linkPath)); if (isMatch) { link.style.color = "#4CAF50"; const icon = link.querySelector("i"); if (icon) icon.style.color = "#4CAF50"; } }); } // 指定日期黑白效果 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); } }); }); } // 更换背景函数封装 function setFixedBackground(bgImageUrl) { const body = document.body; body.classList.add('common-fixed-bg'); body.style.backgroundImage = `url('${bgImageUrl}')`; } // 更换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 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(data) { const textEl = document.getElementById('anianLunarText'); const defaultText = '一日不见如隔三秋'; if (!textEl) return; 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/2025-12-2.png'); } switch (jijie) { case "春季": bannerImages.push('/upload/dingbu-chun.png'); break; case "夏季": bannerImages.push('/upload/dingbu-xia.png'); break; case "秋季": bannerImages.push('/upload/dingbu-qiu.png'); break; case "冬季": bannerImages.push('/upload/dingbu-dong.png'); break; default: bannerImages.push('/upload/dingbu-siji.png'); break; } } // Cookie 是否存在 function anian_checkCookieExists(name) { return document.cookie.includes(`${name}=`); } // 写入当日有效 Cookie(23:59 失效) function anian_setDailyCookie(name, value) { const now = new Date(); const china = new Date(now.getTime() + 8 * 3600 * 1000); const expires = new Date(Date.UTC( china.getUTCFullYear(), china.getUTCMonth(), china.getUTCDate(), 15, 59, 59 )); document.cookie = `${name}=${encodeURIComponent(value)};expires=${expires.toUTCString()};path=/;domain=anian.cc`; } // 读取 Cookie function anian_getCookieValue(name) { const m = document.cookie.match(new RegExp(`(^| )${name}=([^;]+)`)); return m ? decodeURIComponent(m[2]) : null; } // 获取农历数据并触发渲染 function anian_handleLunarCookie() { const apiUrl = 'https://cn.apihz.cn/api/time/getday.php?id=10011724&key=0bdd2d8b3d97c0d476c98a41f108a96f'; const cookieName = 'anian_lunar_info'; // 优先使用缓存 if (anian_checkCookieExists(cookieName)) { try { const data = JSON.parse(anian_getCookieValue(cookieName)); anian_renderLunarUI(data); return; } catch (_) {} } // 无缓存则请求 API fetch(apiUrl) .then(r => r.ok ? r.json() : Promise.reject()) .then(data => { if (data.code !== 200) throw new Error(); const jieqi = (data.JIEQICN || '').includes('第1天') ? data.jieqi : ''; const lunarInfo = { ganzhiYear: data.ganzhinian || '', lunarMonth: data.nyue || '', lunarDay: data.nri || '', jieqi: jieqi || '', jijie: data.jijie || '', traditionalFestival: data.YIFESTIVAL || '' }; anian_setDailyCookie(cookieName, JSON.stringify(lunarInfo)); anian_renderLunarUI(lunarInfo); }) .catch(() => { anian_renderLunarUI(null); }); } // 绿色数字时钟粒子效果 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) } // 侧边栏公告提醒 const LATEST_NOTICE_DATE = '2025-12-14'; // 最新公告日期 const COOKIE_NAME = 'latest_notice_date'; const COOKIE_EXPIRE_YEARS = 10; const NOTICE_DETAIL_PATH = '/notice'; // 读取Cookie function getCookie(name) { const cookieArr = document.cookie.split('; '); for (let cookie of cookieArr) { const [cookieName, cookieValue] = cookie.split('='); if (cookieName === name) { return decodeURIComponent(cookieValue); } } return null; } // 设置Cookie function setCookie(name, value) { const date = new Date(); date.setTime(date.getTime() + (COOKIE_EXPIRE_YEARS * 365 * 24 * 60 * 60 * 1000)); const expires = "expires=" + date.toUTCString(); document.cookie = `${name}=${encodeURIComponent(value)}; ${expires}; path=/;domain=anian.cc`; } // 每次调用都重新获取最新DOM元素,避免旧元素引用(标记已读核心函数) function markAsRead() { const noticeBubble = document.getElementById('noticeBubble'); const noticeBtn = document.getElementById('noticeBtn'); if (!noticeBubble || !noticeBtn) return; setCookie(COOKIE_NAME, LATEST_NOTICE_DATE); noticeBubble.classList.remove('show'); noticeBtn.classList.remove('has-notice'); } // 检测是否在公告详情页,若是则标记已读 function checkNoticeDetailPage() { const currentPath = window.location.pathname.replace(/\/$/, ''); const savedDate = getCookie(COOKIE_NAME); const hasUnread = !savedDate || savedDate !== LATEST_NOTICE_DATE; if (currentPath === NOTICE_DETAIL_PATH && hasUnread) { markAsRead(); } } // 初始化函数 function initNoticeTip() { const noticeBubble = document.getElementById('noticeBubble'); const noticeBtn = document.getElementById('noticeBtn'); if (!noticeBubble || !noticeBtn) return; const savedDate = getCookie(COOKIE_NAME); const hasUnread = !savedDate || savedDate !== LATEST_NOTICE_DATE; if (hasUnread) { noticeBubble.classList.add('show'); noticeBtn.classList.add('has-notice'); } else { noticeBubble.classList.remove('show'); noticeBtn.classList.remove('has-notice'); } checkNoticeDetailPage(); } // 全局事件委托 function bindGlobalNoticeEvents() { 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(); } }); document.body.dataset.noticeEventsBound = 'true'; } // 测速侧边栏 const bubble = document.getElementById("anianxBubble"), bubbleText = document.getElementById("anianxBubbleText"), group = document.querySelector(".anianx-group"), main = document.querySelector('[data-anianx-type="main"]'), test = document.querySelector('[data-anianx-type="test"]'), sub = document.querySelector('[data-anianx-type="sub"]'); let speedLock = false; let xianlu = 0; const hostname = location.hostname; function moveArrow(btn) { const btnRect = btn.getBoundingClientRect(), groupRect = group.getBoundingClientRect(), center = (btnRect.left - groupRect.left) + (btnRect.width / 2); bubble.style.setProperty("--anianx-arrow", center + "px"); } if (hostname === "anian.cc") { xianlu = 1; main.classList.add("anianx-fixed"); bubbleText.classList.remove("anianx-loading"); bubbleText.innerText = "当前为主线路"; moveArrow(main); } else if (hostname === "www.anian.cc") { xianlu = 2; sub.classList.add("anianx-fixed"); bubbleText.classList.remove("anianx-loading"); bubbleText.innerText = "当前为副线路"; moveArrow(sub); } else { bubbleText.classList.remove("anianx-loading"); bubbleText.innerText = "当前线路未知"; moveArrow(test); } main.addEventListener("click", () => { if (main.classList.contains("anianx-fixed")) { bubbleText.classList.remove("anianx-loading"); bubbleText.innerText = "当前为主线路"; } else { bubbleText.classList.add("anianx-loading"); bubbleText.innerText = "正在切换至主线路"; // 1. 获取当前滚动位置 const currentScrollTop = window.scrollY || document.documentElement.scrollTop; document.cookie = `scrollParam=${currentScrollTop}; path=/; domain=anian.cc`; const finalUrl = main.dataset.anianxHref + location.pathname + location.search + location.hash; // 3. 执行跳转 location.href = finalUrl; } moveArrow(main); }); sub.addEventListener("click", () => { if (sub.classList.contains("anianx-fixed")) { bubbleText.classList.remove("anianx-loading"); bubbleText.innerText = "当前为副线路"; } else { bubbleText.classList.add("anianx-loading"); bubbleText.innerText = "正在切换至副线路"; // 1. 获取当前滚动位置 const currentScrollTop = window.scrollY || document.documentElement.scrollTop; // 2. 拼接URL参数(保留原有逻辑 + 添加scrollTop参数) const baseUrl = sub.dataset.anianxHref + location.pathname + location.search; document.cookie = `scrollParam=${currentScrollTop}; path=/; domain=anian.cc`; const finalUrl = baseUrl + location.hash; // 3. 执行跳转 location.href = finalUrl; } moveArrow(sub); }); function loadMultiplePages(pageCount, type = null, currentCount = 1) { return new Promise((resolve, reject) => { const configs = { moment: { paginator: "#t_pagination a", listContainer: ".moment_list", itemSelector: ".p_item", afterLoad: () => { typeof getMomentAudio === 'function' && getMomentAudio(); typeof initAgree === 'function' && initAgree(); window.lazyLoadInstance && lazyLoadInstance.update(); typeof initializeMomentFold === 'function' && initializeMomentFold(); typeof modify_moment_video_size === 'function' && modify_moment_video_size(); } }, gallery: { paginator: "#p_pagination a", listContainer: ".gallery-photos", itemSelector: ".gallery-photo", afterLoad: () => { window.pix && typeof pix.initGalleryPhotos === 'function' && pix.initGalleryPhotos(); } } }; if (!type) { if ($("#t_pagination").length) type = 'moment'; else if ($("#p_pagination").length) type = 'gallery'; else { const errMsg = "[loadMultiplePages] 未找到分页器,无法识别加载类型"; // console.error(errMsg); reject(errMsg); return; } } const config = configs[type]; const $paginationBtn = $(config.paginator); const nextHref = $paginationBtn.attr('data'); if (currentCount > pageCount) { // console.log(`[${type}] 批量加载完成,共${pageCount}页`); resolve(); return; } if (!nextHref) { // console.log(`[${type}] 已无更多内容`); $paginationBtn.hide(); resolve(); return; } $paginationBtn.prop('disabled', true); const $pagingWrapper = $paginationBtn.closest('.post-paging'); if (type === 'gallery' && $pagingWrapper.length) { $pagingWrapper.data('origin-html', $pagingWrapper.html()); $pagingWrapper.html('
    '); } $.ajax({ type: "GET", url: nextHref, success: function (html) { const $html = $(html); const items = $html.find(`${config.listContainer} ${config.itemSelector}`); if (items.length > 0) { $(config.listContainer).append(items.fadeIn(300)); const newHref = $html.find(config.paginator).attr("data"); if (type === 'gallery' && $pagingWrapper.length) { $pagingWrapper.html(`${Theme.site_page}`); } const $newBtn = $(config.paginator); if (newHref) { $newBtn.attr("data", newHref).show().prop('disabled', false); $newBtn.html(`${Theme.site_page}`); } else { $newBtn.hide(); } config.afterLoad(); loadMultiplePages(pageCount, type, currentCount + 1) .then(resolve) .catch(reject); } else { $(config.paginator).hide(); resolve(); } }, error: function () { const errMsg = `[${type}] 第${currentCount}页加载失败`; // console.log(errMsg); $(config.paginator).prop('disabled', false); reject(errMsg); } }); }); } function initjump() { const urlParams = new URLSearchParams(window.location.search); const page = document.cookie.split('; ').find(c => c.startsWith('page='))?.split('=')[1] ? decodeURIComponent(document.cookie.split('; ').find(c => c.startsWith('page='))?.split('=')[1]) : null; const scrollTop = document.cookie.split('; ').find(c => c.startsWith('scrollParam='))?.split('=')[1] ? decodeURIComponent(document.cookie.split('; ').find(c => c.startsWith('scrollParam='))?.split('=')[1]) : null; document.cookie = "scrollParam=; path=/; domain=anian.cc; expires=Thu, 01 Jan 1970 00:00:00 GMT"; const loadPageTask = () => { return new Promise((resolve) => { const timeout = setTimeout(() => { // console.warn("页面加载超时,强制执行滚动"); resolve(); }, 3000); if (page && !isNaN(page)) { const targetPage = Number(page) - 1; loadMultiplePages(targetPage) .then(() => { clearTimeout(timeout); resolve(); }) .catch(() => { clearTimeout(timeout); resolve(); }); } else { clearTimeout(timeout); resolve(); } }); }; if (scrollTop && !isNaN(scrollTop)) { loadPageTask().then(() => { if (xianlu === 1) cocoMessage.success('已成功切换到主线路'); else if (xianlu === 2) cocoMessage.success('已成功切换到副线路'); const recordScroll = Number(scrollTop); const maxScroll = document.documentElement.scrollHeight - window.innerHeight; const scrollDistance = Math.min(recordScroll, maxScroll); const scrollSpeed = 1; const minDuration = 100; const maxDuration = 1000; const dynamicDuration = Math.min(Math.max(scrollDistance / scrollSpeed, minDuration), maxDuration); if (recordScroll > maxScroll && (recordScroll - maxScroll) > 200) { cocoMessage.warning('请手动加载以恢复原线路内容'); $('html, body').animate({ scrollTop: maxScroll }, dynamicDuration); } else { $('html, body').animate({ scrollTop: recordScroll }, dynamicDuration); } urlParams.delete('scrollTop'); const newUrl = window.location.pathname + (urlParams.toString() ? `?${urlParams.toString()}` : '') + window.location.hash; window.history.replaceState({}, document.title, newUrl); }); } } test.addEventListener("click", () => { if (speedLock) return; speedLock = true; bubbleText.classList.add("anianx-loading"); bubbleText.innerText = "测速中"; moveArrow(test); speedTestWithTimeout(7500).then(result => { bubbleText.classList.remove("anianx-loading"); bubbleText.innerText = result; }).catch(() => { bubbleText.classList.remove("anianx-loading"); bubbleText.innerText = "请检查网络或切换线路"; }).finally(() => { speedLock = false; }); }); function speedTestWithTimeout(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); } }); } // 侧边栏订阅函数 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(), initializeMomentFold(), initNoticeTip(), nextBanner() } pix.roleMoments(); initBlog(); setPageGrayscale(); anian_handleLunarCookie(); updateMusicBtnColor('default'); initGreenDigitalClock(); bindGlobalNoticeEvents(); initjump(); initTagSwitch();