view image conveniently
// ==UserScript==
// @name E-hentai Image-Viewer
// @namespace http://tampermonkey.net/
// @version 20240519
// @description view image conveniently
// @author You
// @match https://e-hentai.org/g/*
// @icon https://www.google.com/s2/favicons?sz=64&domain=e-hentai.org
// @grant unsafeWindow
// @grant GM_download
// @license MIT
// ==/UserScript==
(function() {
'use strict';
// Your code here...
let arrDoms = document.querySelectorAll(".gdtm");
// create menu
let id_menu = "menu";
let id_new_tab = "new_tab";
let id_show_directly = "show_directly";
let id_download = "download";
let menu_width = 0;
let menu_height = 0;
{
let rect = arrDoms[1].getBoundingClientRect();
menu_width = rect.width;
menu_height = rect.height;
// let menu_style = `style = "width: ${width}px; height: ${height}px;"`;
let button_sytle = ` style = "display:block; width:${menu_width}px; height:${
menu_height / 3
}px;line-height:${menu_height / 3}px;font-size: 12px; "`;
document.querySelector("body").insertAdjacentHTML(
"beforeend",
`
<div class="menu" id=${id_menu}>
<div><button id="${id_new_tab}" ${button_sytle}>新标签页中打开</a></div>
<div><button id="${id_show_directly}" ${button_sytle}>直接显示</a></div>
<div><button id="${id_download}" ${button_sytle}>下载</a></div>
</div>
`
);
}
let menu = document.querySelector("#" + id_menu);
let menu_new_tab = document.querySelector("#" + id_new_tab);
let menu_show_directly = document.querySelector("#" + id_show_directly);
let menu_download = document.querySelector("#" + id_download);
menu.style.display = "none";
menu.style.position = "absolute";
menu.style.top = 0;
menu.style.left = 0;
menu.style.width = String(menu_width) + "px";
menu.style.height = String(menu_height) + "px";
menu.style.backgroundColor = "gainsboro";
menu.style.opacity = 0.7;
async function SetSrc() {
let parent = menu.parentNode;
if (!parent.getAttribute("src")) {
let url = parent.querySelector("a").href;
let img_url = await fetchImageSrc(url);
parent.setAttribute("src", String(img_url));
return img_url;
}
return parent.getAttribute("src");
}
menu_new_tab.onclick = async function () {
let img_url = await SetSrc();
if (img_url) {
// console.log("menu_new_tab" + img_url);
window.open(img_url);
}
};
// create hint
let idHint = "hintEle";
{
let maxHeight = parseInt(window.innerHeight * 0.7);
let maxWidth = window.innerWidth;
let url = "";
// ‘beforeend’:插入元素内部的最后一个子节点之后。
document.querySelector("body").insertAdjacentHTML(
"beforeend",
`
<img src="${url}";
id = "${idHint}";
style="
max-width: ${maxWidth}px;
max-height: ${maxHeight}px;
position: absolute;
top: 0px;
left: 0px;
z-index: 999;
display: none;
">
`
);
}
let hintEle = document.querySelector("#" + idHint);
hintEle.onload = function()
{
hintEle.style.display = "block";
let left = parseInt(hintEle.style.left);
let offset = window.innerWidth < hintEle.offsetWidth + left ? -(hintEle.offsetWidth + left - window.innerWidth): 0;
//console.log(`hintEle.style.width: ${hintEle.style.width}, window.innerWidth: ${window.innerWidth}`);
// console.log(`left: ${left}, offset: ${offset}, left+= offset: ${left + offset}`);
left += offset;
hintEle.style.left = String(left) + "px";
}
menu_show_directly.onclick = async function () {
let img_url = await SetSrc();
show_hint();
};
function show_hint() {
if (menu.parentNode.getAttribute("src")) {
hintEle.src = menu.parentNode.getAttribute("src");
}
}
// add handlers
for (let dom of arrDoms) {
dom.onmouseover = function () {
dom.style.backgroundColor = "black";
let rect = this.getBoundingClientRect();
hintEle.style.top = String(rect.bottom + window.scrollY) + "px";
hintEle.style.left = String(rect.left + window.scrollX ) + "px";
dom.style.position = "relative";
dom.appendChild(menu);
menu.style.display = "block";
if (dom.getAttribute("src")) {
/*hintEle.style.display = "block";
hintEle.src = dom.getAttribute("src");*/
show_hint();
}
}; // if (!menu.src)
dom.onmouseout = function () {
dom.style.backgroundColor = "";
hintEle.style.display = "none";
menu.style.display = "none";
};
}
// 创建一个异步函数来获取网页内容
async function fetchImageSrc(url) {
try {
// 使用 Fetch API 发起请求
const response = await fetch(url);
// 确认响应状态为成功
if (!response.ok) {
throw new Error("请求图片失败");
}
// 解析响应的 HTML 内容
const html = await response.text();
// 创建一个虚拟 DOM 对象
const parser = new DOMParser();
const doc = parser.parseFromString(html, "text/html");
// 获取指定元素的内容
const imgUrl = doc.querySelector("#i3 img").src;
// 返回获取到的图片 URL
console.log("fetchImageSrc: 获取图片地址成功");
return imgUrl;
} catch (error) {
console.error("在进行获取页面的时候, 发生了这样的问题:", error);
return null;
}
}
/*
// 调用函数并处理结果
fetchImageSrc()
.then((imgUrl) => {
if (imgUrl) {
console.log("The image URL is:", imgUrl);
} else {
console.log("Failed to retrieve image URL.");
}
})
.catch((err) => {
console.error("Error occurred:", err);
});
*/
menu_download.onclick = async function () {
let img_url = await SetSrc();
GM_download(img_url, "pic"+String(Math.ceil(Math.random()*10000)));
};
})();