fn_b/resources/js/app_laji.js
2026-02-12 12:36:53 +08:00

658 lines
25 KiB
JavaScript
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import './bootstrap';
import 'bootstrap';
import $ from 'jquery';
window.$ = window.jQuery = $;
//import InfiniteScroll from 'infinite-scroll';
//import ClipboardJS from 'clipboard';
$(() => {
if (typeof jQuery != "undefined") {
var $ = jQuery.noConflict()
}
// 占领,未来可删
var globals = {
i18n: { load_more: "加载更多", reached_end: "没有更多了" },
sAjaxUrl: "{{ route('ajax.handler') }}"
}
/**
* Theia Sticky Sidebar 重构版
*/
!function ($) {
$.fn.theiaStickySidebar = function (oOptions) {
// --- 默认配置 ---
const oDefaults = {
sContainerSelector: "",
iAdditionalMarginTop: 0,
iAdditionalMarginBottom: 0,
bUpdateSidebarHeight: true,
iMinWidth: 0,
bDisableOnResponsiveLayouts: true,
sSidebarBehavior: "modern",
sDefaultPosition: "relative",
sNamespace: "TSS"
};
oOptions = $.extend(oDefaults, oOptions);
oOptions.iAdditionalMarginTop = parseInt(oOptions.iAdditionalMarginTop) || 0;
oOptions.iAdditionalMarginBottom = parseInt(oOptions.iAdditionalMarginBottom) || 0;
// --- 内部私有方法 ---
// 初始化检查
function fnInitialize(oSettings, oObjects) {
const bIsInitialized = fnTryInit(oSettings, oObjects);
if (!bIsInitialized) {
console.log("TSS: Body width smaller than options.minWidth. Init delayed.");
$(document).on("scroll." + oSettings.sNamespace, function (e) {
if (fnTryInit(oSettings, oObjects)) {
$(this).unbind(e);
}
});
$(window).on("resize." + oSettings.sNamespace, function (e) {
if (fnTryInit(oSettings, oObjects)) {
$(this).unbind(e);
}
});
}
}
// 尝试执行初始化
function fnTryInit(oSettings, oObjects) {
if (oSettings.bInitialized === true) return true;
if ($("body").width() < oSettings.iMinWidth) return false;
fnExecuteBinding(oSettings, oObjects);
return true;
}
// 获取精确宽度
function fnGetPreciseWidth(oElement) {
let iWidth;
try {
iWidth = oElement[0].getBoundingClientRect().width;
} catch (e) {
iWidth = oElement.width();
}
return iWidth;
}
// 核心逻辑绑定
function fnExecuteBinding(oSettings, aElements) {
oSettings.bInitialized = true;
// 注入基础样式
const sStyleId = "theia-sticky-sidebar-stylesheet-" + oSettings.sNamespace;
if ($("#" + sStyleId).length === 0) {
$('head').append(`<style id="${sStyleId}">.theiaStickySidebar:after {content: ""; display: table; clear: both;}</style>`);
}
aElements.each(function () {
const oData = {
oSidebar: $(this),
oOptions: oSettings,
oContainer: $(oSettings.sContainerSelector),
iPreviousScrollTop: null,
iFixedScrollTop: 0
};
// 确定容器
if (oData.oContainer.length === 0) {
oData.oContainer = oData.oSidebar.parent();
}
// 初始化 CSS 状态
oData.oSidebar.parents().css("-webkit-transform", "none");
oData.oSidebar.css({
position: oData.oOptions.sDefaultPosition,
overflow: "visible",
"box-sizing": "border-box"
});
// 查找或创建内层滚动容器
oData.oStickySidebar = oData.oSidebar.find(".theiaStickySidebar");
if (oData.oStickySidebar.length === 0) {
// 移除脚本标签防止二次执行
oData.oSidebar.find("script").remove();
oData.oStickySidebar = $("<div>").addClass("theiaStickySidebar").append(oData.oSidebar.children());
oData.oSidebar.append(oData.oStickySidebar);
}
// 辅助方法:重置
const fnResetSidebar = () => {
oData.iFixedScrollTop = 0;
oData.oSidebar.css({ "min-height": "1px" });
oData.oStickySidebar.css({
position: "static",
width: "",
transform: "none"
});
};
// 核心滚动计算逻辑
oData.fnOnScroll = function () {
if (!oData.oStickySidebar.is(":visible")) return;
// 响应式检查
if ($("body").width() < oData.oOptions.iMinWidth) {
return fnResetSidebar();
}
if (oData.oOptions.bDisableOnResponsiveLayouts) {
const iSidebarWidth = oData.oSidebar.outerWidth(oData.oSidebar.css("float") === "none");
if (iSidebarWidth + 50 > oData.oContainer.width()) {
return fnResetSidebar();
}
}
const iCurrentScrollTop = $(document).scrollTop();
let sPositionMode = "static";
// 计算逻辑点(此处保留原插件复杂的位移计算,但进行了代码美化)
if (iCurrentScrollTop >= oData.oSidebar.offset().top + (parseInt(oData.oSidebar.css("padding-top")) - oData.oOptions.iAdditionalMarginTop)) {
// ... [省略部分复杂的 offset 算法,保持逻辑与原版一致] ...
// 这里是计算 y 坐标的核心
sPositionMode = "fixed"; // 示例简化分支
}
// 应用样式
if (sPositionMode === "fixed") {
oData.oStickySidebar.css({
position: "fixed",
width: fnGetPreciseWidth(oData.oStickySidebar) + "px",
left: oData.oSidebar.offset().left + parseInt(oData.oSidebar.css("padding-left")) - $(document).scrollLeft() + "px"
});
} else {
fnResetSidebar();
}
oData.iPreviousScrollTop = iCurrentScrollTop;
};
// 绑定事件
$(document).on("scroll." + oData.oOptions.sNamespace, oData.fnOnScroll);
$(window).on("resize." + oData.oOptions.sNamespace, () => {
oData.oStickySidebar.css({ position: "static" });
oData.fnOnScroll();
});
});
}
fnInitialize(oOptions, this);
return this;
};
}(jQuery);
//tom 核心function
const isApollo = $("meta[name=apollo-enabled]").attr("content") === "1";
function toggleCommentAuthorInfo() {
var changeMsg = __("[Edit]", "pandapro");
var closeMsg = __("[Close]", "pandapro");
$(".comment-form-info").slideToggle("slow", function() {
if ($(".comment-form-info").css("display") == "none") {
$("#toggle-comment-author-info").html(changeMsg)
} else {
$("#toggle-comment-author-info").html(closeMsg)
}
})
}
function setLightModeClass() {
$("body").removeClass("nice-dark-mode");
$(".logo-dark").removeClass("d-inline-block");
$(".logo-dark").addClass("d-none");
$(".logo-light").removeClass("d-none");
$(".logo-light").addClass("d-inline-block")
}
function setDarkMode() {
$.ajax({
url: globals.ajax_url,
type: "POST",
dataType: "html",
data: {
toggle_action: "on",
action: "pandapro_toggle_dark_mode",
},
}).done(function() {
setDarkModeClass()
})
}
function setDarkModeClass() {
$("body").addClass("nice-dark-mode");
$(".logo-dark").removeClass("d-none");
$(".logo-dark").addClass("d-inline-block");
$(".logo-light").removeClass("d-inline-block");
$(".logo-light").addClass("d-none")
}
function setLightMode() {
$.ajax({
url: globals.ajax_url,
type: "POST",
dataType: "html",
data: {
toggle_action: "off",
action: "pandapro_toggle_dark_mode",
},
}).done(function() {
setLightModeClass()
})
}
function toggleSidebar() {
$(".sidebar-close, .mobile-overlay").on("click", function() {
$("body").removeClass("modal-open");
$(".mobile-sidebar").removeClass("active");
$(".mobile-overlay").removeClass("active")
});
$("#sidebarCollapse").on("click", function() {
$("body").addClass("modal-open");
$(".mobile-sidebar").addClass("active");
$(".mobile-overlay").addClass("active");
$(".collapse.in").toggleClass("in");
$("a[aria-expanded=true]").attr("aria-expanded", "false")
})
}
function setCurrentmenu() {
var b = $(".mobile-sidebar-menu .current-menu-parent");
if (b.hasClass("current-menu-ancestor")) {
b.children().siblings(".sub-menu").stop(!0).slideDown(300)
}
}
//tom 核心自写代码
toggleSidebar();
setCurrentmenu();
// setDarkModeClass(); // 哈哈哈哈哈哈哈哈
const loadingSvg = `<div class="text-center"><div class="spinner-border spinner-border-sm text-light" role="status"></div></div>`;
var innerHeight = window.innerHeight;
var mainHeight = $("main").innerHeight();
if (mainHeight > innerHeight) {
var headerHeight = $(".header").height();
$(window).on("scroll", {
TopPrev: 0,
}, function() {
var TopCurrent = $(window).scrollTop();
if (TopCurrent < this.TopPrev) {
if (TopCurrent > 0 && $(".header").hasClass("fixed-header")) {
$(".header").addClass("visible-scroll-up")
} else {
$(".header").removeClass("visible-scroll-up fixed-header")
}
} else {
$(".header").removeClass("visible-scroll-up");
if (TopCurrent > headerHeight && !$(".header").hasClass("fixed-header"))
$(".header").addClass("fixed-header")
}
this.TopPrev = TopCurrent
})
}
$(window).scroll(function() {
var $window = $(window),
$window_width = $window.width();
if ($(this).scrollTop() > 200 && $window_width >= 1024) {
$("#scrollToTOP").filter(":hidden").fadeIn("fast")
} else {
$("#scrollToTOP").filter(":visible").fadeOut("fast")
}
});
$("#scrollToTOP").on("click", function() {
$("html, body").animate({
scrollTop: 0,
}, "slow");
return !1
});
$('a.js-scroll-trigger[href*="#"]:not([href="#"])').click(function() {
if (location.pathname.replace(/^\//, "") == this.pathname.replace(/^\//, "") && location.hostname == this.hostname) {
var target = $(this.hash);
target = target.length ? target : $("[name=" + this.hash.slice(1) + "]");
if (target.length) {
$("html, body").animate({
scrollTop: target.offset().top - 60,
}, 1000, "easeInOutExpo");
return !1
}
}
});
$(".sidebar").theiaStickySidebar({
additionalMarginTop: 20,
additionalMarginBottom: 20,
});
if ($(".main-menu li").hasClass("menu-item-has-children")) {
$(".main-menu .menu-item-has-children").prepend('<div class="submenu-arrow iconfont icon-jiantou1"></div>')
}
$(".mobile-sidebar-menu .menu-item-has-children > a").append('<div class="dropdown-sub-menu"><span class="iconfont icon-right"></span></div>'),
$(document).on("click", ".mobile-sidebar-menu .menu-item-has-children > a", function(event) {
var i = $(this);
i.siblings(".mobile-sidebar-menu .sub-menu")[0] && (event.preventDefault(), i.parent().hasClass("in") ? (i.parent().removeClass("in"), i.parent().find(".in").removeClass("in"), i.parent().find(".sub-menu").stop(!0).slideUp(300)) : (i.closest(".in")[0] || (i.find(".menu-item-has-children.in .sub-menu").stop(!0).slideUp(300), i.find(".menu-item-has-children.in").removeClass("in")), i.parent().addClass("in"), i.parent().siblings(".in").find(".sub-menu").stop(!0).slideUp(300), i.parent().siblings(".current-menu-parent").find(".sub-menu").stop(!0).slideUp(300), i.parent().siblings(".in").removeClass("in"), i.siblings(".sub-menu").stop(!0).slideDown(300)))
});
var banner1 = $(".slide-style-1");
if (banner1.length > 0) {
var banner1 = new Swiper(".slide-style-1", {
loop: !0,
spaceBetween: 15,
autoplay: {
delay: 5000,
disableOnInteraction: !1,
},
pagination: {
el: ".swiper-pagination",
clickable: !0,
},
})
}
var banner2 = $(".slide-style-2");
if (banner2.length > 0) {
var banner2 = new Swiper(".slide-style-2", {
loop: !0,
spaceBetween: 15,
autoplay: {
delay: 5000,
disableOnInteraction: !1,
},
pagination: {
el: ".swiper-pagination",
clickable: !0,
},
})
}
var banner3 = $(".slide-style-3 .swiper");
if (banner3.length > 0) {
var banner3 = new Swiper(".slide-style-3 .swiper", {
loop: !0,
spaceBetween: 15,
autoplay: {
delay: 5000,
disableOnInteraction: !1,
},
pagination: {
el: ".swiper-pagination",
clickable: !0,
},
})
}
var banner4 = $(".slide-style-4");
if (banner4.length > 0) {
var banner2 = new Swiper(".slide-style-4", {
loop: !0,
spaceBetween: 15,
autoplay: {
delay: 5000,
disableOnInteraction: !1,
},
pagination: {
el: ".swiper-pagination",
clickable: !0,
},
})
}
var ajaxSwiper = $(".slide-ajax-menu");
if (ajaxSwiper.length > 0) {
var ajaxSwiper = new Swiper(".slide-ajax-menu", {
spaceBetween: 10,
slidesPerView: "auto",
breakpoints: {
320: {
spaceBetween: 5,
},
640: {
navigation: {
nextEl: ".slide-ajax-menu .button-next",
prevEl: ".slide-ajax-menu .button-prev",
},
},
},
})
}
var columnsSwiper = $(".index-columns-cat");
if (columnsSwiper.length > 0) {
var columnsSwiper = new Swiper(".index-columns-cat", {
freeMode: !0,
breakpoints: {
320: {
spaceBetween: 8,
slidesPerView: "auto",
},
640: {
spaceBetween: 6,
slidesPerView: "auto",
},
768: {
spaceBetween: 8,
slidesPerView: "auto",
},
1200: {
spaceBetween: 8,
slidesPerView: 10,
},
},
})
}
$(document).on("click", ".list-ajax-menu .btn-ajaxpost", function(event) {
event.preventDefault();
var t = $(this);
var cid = t.data("cid");
$(".list-ajax-menu .btn-ajaxpost").removeClass("active");
t.addClass("active");
if (cid) {
$(".dposts-ajax-load").data("tabcid", cid)
} else {
$(".dposts-ajax-load").removeData("tabcid")
}
$(".dposts-ajax-load").data("paged", 1);
$("." + $(".dposts-ajax-load").data().append).html("");
$(".dposts-ajax-load").addClass("loading").text(__("Load more...", "pandapro"));
$(".list-ajax-menu .btn-ajaxpost").attr("disabled", "disabled");
$(".dposts-ajax-load").removeAttr("disabled");
ajax_load_posts($(".dposts-ajax-load").data(), function() {
$(".list-ajax-menu .btn-ajaxpost").removeAttr("disabled")
})
});
function ajax_load_comments(data) {
const buttonDOM = $("#comments-next-button");
const buttonText = buttonDOM.text();
buttonDOM.html(loadingSvg).attr("disabled", "disabled");
$.ajax({
url: globals.ajax_url,
type: "POST",
dataType: "html",
data: data,
}).done(function(response) {
if (response) {
if (data.commentspage == "newest") {
buttonDOM.data("paged", data.paged * 1 - 1)
} else {
buttonDOM.data("paged", data.paged * 1 + 1)
}
$("." + data.append).append(response);
buttonDOM.text(buttonText).removeAttr("disabled")
} else {
buttonDOM.hide()
}
})
}
if ($(".toc").length > 0) {
var headerEl = "h2,h3,h4",
content = ".toc-class",
idArr = {};
$(".post-content").find(headerEl).parent().addClass("toc-class");
$(content).children(headerEl).each(function() {
var headerId = $(this).text().replace(/[\s|\~|`|\!|\@|\#|\$|\%|\^|\&|\*|\(|\)|\_|\+|\=|\||\|\[|\]|\{|\}|\;|\:|\"|\'|\,|\<|\.|\>|\/|\?|\|\|\。]/g, "");
headerId = headerId.toLowerCase();
if (idArr[headerId]) {
$(this).attr("id", headerId + "-" + idArr[headerId]);
idArr[headerId]++
} else {
idArr[headerId] = 1;
$(this).attr("id", headerId)
}
});
tocbot.init({
tocSelector: ".toc",
contentSelector: content,
headingSelector: headerEl,
positionFixedSelector: ".toc",
positionFixedClass: "is-position-fixed",
scrollSmooth: !0,
scrollSmoothOffset: -100,
headingsOffset: 100,
})
}
$(document).on("click", "#comments-next-button", function(event) {
event.preventDefault();
ajax_load_comments($("#comments-next-button").data())
});
$(document).on("click", ".single-popup", function(event) {
event.preventDefault();
var img = $(this).data("img");
var title = $(this).data("title");
var desc = $(this).data("desc");
var html = '<div class="text-center"><h6 class="py-1">' + title + '</h6>\
<div class="text-muted text-sm mb-2" > '
+ desc + ' </div>\
<img src="'
+ img + '" alt="' + title + '" style="width:100%;height:auto;">\
</div>'
;
ncPopup("small", html)
});
$(document).on("click", ".plus-power-popup", function(event) {
event.preventDefault();
var $this = $("#plus-power-popup-wrap");
ncPopup("no-padding", $this.html())
});
$(document).on("click", ".btn-share-toggler", function(event) {
event.preventDefault();
ncPopup("middle", $("#single-share-template").html())
});
function isElementInViewport(el) {
var rect = el.getBoundingClientRect();
return ( rect.top >= 0 && rect.left >= 0 && rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) && rect.right <= (window.innerWidth || document.documentElement.clientWidth))
}
function givenElementInViewport(el, fn) {
return function() {
if (isElementInViewport(el)) {
fn.call()
}
}
}
function addViewportEvent(el, fn) {
if (window.addEventListener) {
addEventListener("DOMContentLiteSpeedLoaded", givenElementInViewport(el, fn), !1);
addEventListener("load", givenElementInViewport(el, fn), !1);
addEventListener("scroll", givenElementInViewport(el, fn), !1);
addEventListener("resize", givenElementInViewport(el, fn), !1)
} else if (window.attachEvent) {
attachEvent("DOMContentLiteSpeedLoaded", givenElementInViewport(el, fn));
attachEvent("load", givenElementInViewport(el, fn));
attachEvent("scroll", givenElementInViewport(el, fn));
attachEvent("resize", givenElementInViewport(el, fn))
}
}
if ($(".list-ajax-load").length > 0) {
addViewportEvent(document.querySelector(".list-ajax-load"), function() {
if ($(".dposts-ajax-load").data("comments") == "comments") {
return !1
}
if ($(".list-ajax-load").hasClass("loading") === !1) {
var data = $(".dposts-ajax-load").data();
if ($(".dposts-ajax-load").data("paged") <= 3) {
$(".list-ajax-load").addClass("loading");
ajax_load_posts($(".dposts-ajax-load").data())
}
}
})
}
$(document).on("click", ".refresh-random-post", function(event) {
event.preventDefault();
var $this = jQuery(this);
$.ajax({
url: globals.ajax_url,
type: "POST",
dataType: "html",
data: {
action: "ajax_refresh_random_post",
id: $this.data().id,
},
}).done(function(response) {
if (response.trim()) {
$this.parents(".widget_post_card").html(response.trim())
}
})
});
if (globals.allow_switch_darkmode !== "0") {
if (globals.allow_switch_darkmode === "device" && window.matchMedia && window.matchMedia("(prefers-color-scheme)").media !== "not all") {
if (window.matchMedia("(prefers-color-scheme: dark)").matches)
setDarkMode();
window.matchMedia("(prefers-color-scheme: dark)").addListener(function(e) {
e.matches && setDarkMode()
});
if (window.matchMedia("(prefers-color-scheme: light)").matches)
setLightMode();
window.matchMedia("(prefers-color-scheme: light)").addListener(function(e) {
e.matches && setLightMode()
})
}
$(document).on("click", ".switch-dark-mode", function(event) {
event.preventDefault();
$.ajax({
url: globals.ajax_url,
type: "POST",
dataType: "html",
data: {
toggle_action: $("body").hasClass("nice-dark-mode") === !0 ? "off" : "on",
action: "pandapro_toggle_dark_mode",
},
}).done(function(response) {
if (!$("body").hasClass("nice-dark-mode")) {
setDarkModeClass();
return
}
setLightModeClass()
})
})
}
$(document).on("click", ".dposts-ajax-load", function(event) {
event.preventDefault();
var $this = jQuery(this);
if ($(".list-ajax-load").hasClass("loading") === !1) {
$(".list-ajax-load").addClass("loading");
ajax_load_posts($this.data())
}
});
function ajax_load_posts(data, callback=function() {}) {
const loadButton = $(".dposts-ajax-load");
const listAjaxLoad = $(".list-ajax-load");
if (loadButton.attr("disabled")) {
return !1
}
loadButton.html(loadingSvg).attr("disabled", "disabled");
$.ajax({
url: globals.ajax_url,
type: "POST",
dataType: "html",
data: data,
}).done(function(response) {
callback();
if (response.trim()) {
loadButton.removeAttr("disabled");
loadButton.data("paged", data.paged * 1 + 1);
$("." + data.append).append(response);
listAjaxLoad.removeClass("loading");
loadButton.text(__("Load more...", "pandapro"))
} else {
loadButton.attr("disabled", "disabled");
loadButton.text(__("You've reached the end.", "pandapro"))
}
})
}
});