Files
2024-07-05 21:01:19 +08:00

253 lines
9.2 KiB
JavaScript

let selectTextNow = "";
const selectText = () => {
selectTextNow = document.selection
? document.selection.createRange().text
: window.getSelection() + "" || "";
};
document.onmouseup = document.ondbclick = selectText;
const rm = {
mask: document.getElementById("rightmenu-mask"),
menu: document.getElementById("rightMenu"),
get width() {
return this.menu.offsetWidth;
},
get height() {
return this.menu.offsetHeight;
},
domhref: "",
domsrc: "",
globalEvent: null,
menuItems: {
other: document.getElementsByClassName("rightMenuOther"),
plugin: document.getElementsByClassName("rightMenuPlugin"),
back: document.getElementById("menu-backward"),
forward: document.getElementById("menu-forward"),
refresh: document.getElementById("menu-refresh"),
top: document.getElementById("menu-top"),
copy: document.getElementById("menu-copytext"),
paste: document.getElementById("menu-pastetext"),
comment: document.getElementById("menu-commenttext"),
new: document.getElementById("menu-newwindow"),
copyLink: document.getElementById("menu-copylink"),
copyImg: document.getElementById("menu-copyimg"),
downloadImg: document.getElementById("menu-downloadimg"),
search: document.getElementById("menu-search"),
barrage: document.getElementById("menu-commentBarrage"),
mode: document.getElementById("menu-darkmode"),
translate: document.getElementById("menu-translate"),
music: [
document.getElementById("menu-music-toggle"),
document.getElementById("menu-music-back"),
document.getElementById("menu-music-forward"),
document.getElementById("menu-music-copyMusicName"),
],
},
showRightMenu(e, x = 0, y = 0) {
this.menu.style.top = y + "px";
this.menu.style.left = x + "px";
this.menu.style.display = e ? "block" : "none";
e ? stopMaskScroll() : (this.mask.style.display = "none");
},
hideRightMenu() {
rm.showRightMenu(false);
rm.mask.style.display = "none";
},
reLoadSize() {
this.menu.style.display = "block";
this.menu.style.display = "none";
},
copyText(e) {
navigator.clipboard && navigator.clipboard.writeText(e);
utils.snackbarShow(GLOBAL_CONFIG.lang.copy.success, false, 2000);
this.hideRightMenu();
},
async downloadImage(imageUrl = this.domsrc, filename = "photo") {
try {
const response = await fetch(imageUrl);
const blob = await response.blob();
const url = URL.createObjectURL(blob);
const link = document.createElement("a");
link.href = url;
link.download = filename || "image.jpg";
link.style.display = "none";
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
URL.revokeObjectURL(url);
} catch (error) {
utils.snackbarShow(GLOBAL_CONFIG.right_menu.img_error, false, 2000);
}
},
copyImage(imgUrl = this.domsrc) {
window.open(imgUrl);
},
mode(darkmode) {
darkmode
? (document.querySelector(".menu-darkmode-text").textContent =
GLOBAL_CONFIG.right_menu.mode.light)
: (document.querySelector(".menu-darkmode-text").textContent =
GLOBAL_CONFIG.right_menu.mode.dark);
this.hideRightMenu();
},
barrage(enable) {
enable
? (document.querySelector(".menu-commentBarrage-text").textContent =
GLOBAL_CONFIG.right_menu.barrage.open)
: (document.querySelector(".menu-commentBarrage-text").textContent =
GLOBAL_CONFIG.right_menu.barrage.close);
this.hideRightMenu();
},
};
function stopMaskScroll() {
utils.addEventListenerPjax(rm.menu, "mousewheel", rm.hideRightMenu);
utils.addEventListenerPjax(rm.mask, "mousewheel", rm.hideRightMenu);
utils.addEventListenerPjax(rm.mask, "click", rm.hideRightMenu);
}
window.oncontextmenu = (ele) => {
if (document.body.clientWidth <= 768) return;
let x = ele.clientX + 10;
let y = ele.clientY;
Array.from(rm.menuItems.other).forEach((item) => (item.style.display = "block"));
rm.globalEvent = ele;
let display = false;
let link = ele.target.href;
let src = ele.target.currentSrc;
if (selectTextNow && window.getSelection()) {
display = true;
rm.menuItems.copy.style.display = "block";
GLOBAL_CONFIG.comment && (rm.menuItems.comment.style.display = "block");
rm.menuItems.search && (rm.menuItems.search.style.display = "block");
} else {
rm.menuItems.copy.style.display = "none";
GLOBAL_CONFIG.comment && (rm.menuItems.comment.style.display = "none");
rm.menuItems.search && (rm.menuItems.search.style.display = "none");
}
if (link) {
display = true;
rm.menuItems.new.style.display = "block";
rm.menuItems.copyLink.style.display = "block";
rm.domhref = link;
} else {
rm.menuItems.new.style.display = "none";
rm.menuItems.copyLink.style.display = "none";
}
if (src) {
display = true;
rm.menuItems.copyImg.style.display = "block";
rm.menuItems.downloadImg.style.display = "block";
rm.domsrc = src;
} else {
rm.menuItems.copyImg.style.display = "none";
rm.menuItems.downloadImg.style.display = "none";
}
let tagName = ele.target.tagName.toLowerCase();
if (tagName === "input" || tagName === "textarea") {
display = true;
rm.menuItems.paste.style.display = "block";
} else {
rm.menuItems.paste.style.display = "none";
}
if (tagName === "meting-js") {
display = true;
rm.menuItems.music.forEach((item) => (item.style.display = "block"));
} else {
rm.menuItems.music[0] &&
rm.menuItems.music.forEach((item) => (item.style.display = "none"));
}
Array.from(display ? rm.menuItems.other : rm.menuItems.plugin).forEach(
(item) => (item.style.display = "none")
);
Array.from(display ? rm.menuItems.plugin : rm.menuItems.other).forEach(
(item) => (item.style.display = "block")
);
rm.reLoadSize();
x + rm.width > window.innerWidth && (x -= rm.width + 10);
y + rm.height > window.innerHeight && (y -= y + rm.height - window.innerHeight);
rm.mask.style.display = "flex";
rm.showRightMenu(true, x, y);
return false;
};
(function () {
const addEventListener = (element, event, handler) =>
element.addEventListener(event, handler);
addEventListener(rm.menuItems.back, "click", () =>
window.history.back() || rm.hideRightMenu()
);
addEventListener(rm.menuItems.forward, "click", () =>
window.history.forward() || rm.hideRightMenu()
);
addEventListener(rm.menuItems.refresh, "click", () =>
window.location.reload()
);
addEventListener(rm.menuItems.top, "click", () =>
sco.toTop() || rm.hideRightMenu()
);
if (GLOBAL_CONFIG.right_menu.music) {
addEventListener(rm.menuItems.music[0], "click", () => {
sco.musicToggle();
rm.hideRightMenu();
});
addEventListener(rm.menuItems.music[1], "click", () => {
document.querySelector("meting-js").aplayer.skipBack();
rm.hideRightMenu();
});
addEventListener(rm.menuItems.music[2], "click", () => {
document.querySelector("meting-js").aplayer.skipForward();
rm.hideRightMenu();
});
addEventListener(rm.menuItems.music[3], "click", () => {
const title = Array.from(document.querySelectorAll(".aplayer-title")).map(
(e) => e.innerText
)[0];
rm.copyText(title);
});
}
addEventListener(rm.menuItems.copy, "click", () => {
if (GLOBAL_CONFIG.copyright) {
const { limit, author, link, source, info } = GLOBAL_CONFIG.right_menu;
if (selectTextNow.length > limit) {
selectTextNow = `${selectTextNow}\n\n${author}\n${link}${window.location.href}\n${source}\n${info}`;
}
}
rm.copyText(selectTextNow);
rm.hideRightMenu();
});
if (utils.saveToLocal.get("commentBarrageSwitch") !== null) {
rm.menuItems.barrage && rm.barrage(!utils.saveToLocal.get("commentBarrageSwitch"));
}
addEventListener(rm.menuItems.paste, "click", () =>
rm.pasteText() && rm.hideRightMenu()
);
GLOBAL_CONFIG.comment &&
addEventListener(rm.menuItems.comment, "click", () =>
rm.hideRightMenu() || sco.toTalk(selectTextNow)
);
addEventListener(rm.menuItems.new, "click", () =>
window.open(rm.domhref) && rm.hideRightMenu()
);
addEventListener(rm.menuItems.downloadImg, "click", () =>
rm.downloadImage() && rm.hideRightMenu()
);
addEventListener(rm.menuItems.copyImg, "click", () =>
rm.copyImage() && rm.hideRightMenu()
);
addEventListener(rm.menuItems.copyLink, "click", () =>
rm.copyText(rm.domhref) && rm.hideRightMenu()
);
})();