メール欄があるレスだけ表示するボタンを追加します
当前为
// ==UserScript==
// @name メール欄があるレスだけ表示
// @version 2.12.1
// @grant none
// @include https://*.2chan.net/*/res/*
// @description メール欄があるレスだけ表示するボタンを追加します
// @namespace https://gf.qytechs.cn/users/114367
// ==/UserScript==
// ----------------------------------------
// 設定
var CONFIG = {
showListOnPageLoaded: true,
showListEvenWithoutMails: false,
ignoreRegex: /^sage$/
};
// ----------------------------------------
// CSS
// [✉]ボタン
document.styleSheets[0].insertRule(`
.mail-list-btn {
cursor: pointer;
}
`);
document.styleSheets[0].insertRule(`
.mail-list-btn-on {
color: #00e;
}
`);
// リストの表示位置とか
document.styleSheets[0].insertRule(`
.res-list-container {
bottom: 20px;
display: block;
font-size: 12px;
position: fixed;
right: 5px;
transition: .2s;
width: 300px;
z-index: 99;
}
`);
// 件数表示
document.styleSheets[0].insertRule(`
.res-count-label {
display: block;
}
`);
// レス全体
document.styleSheets[0].insertRule(`
@keyframes res-fadein {
0% { opacity: 0; }
100% { opacity: 1; }
}
`)
document.styleSheets[0].insertRule(`
.res {
animation: res-fadein .2s;
background: #ccc9;
border-radius: 5px;
color: #800;
margin: 5px;
padding: 5px;
}
`);
// メールアドレス
document.styleSheets[0].insertRule(`
.res-mail {
color: #00f;
cursor: pointer;
}
`);
// レス本文
document.styleSheets[0].insertRule(`
.res-text {
animation: res-fadein .5s;
border-top: 1px dotted #0005;
font-size: 90%;
margin: 0;
max-height: 7em;
overflow: auto;
padding: 5px;
width: auto;
}
`);
// リストOFF時
document.styleSheets[0].insertRule(`
.res-list-transparent {
opacity: 0;
pointer-events: none;
}
`)
// ----------------------------------------
// Utils
var newElement = (tag, clazz, text) => {
var e = document.createElement(tag);
e.className = clazz;
if (text) {
e.textContent = text;
}
return e;
};
// ----------------------------------------
// Properties
var mails = [];
var resList = {};
// ----------------------------------------
// Add elements
var resListContainer = newElement('DIV', 'res-list-container res-list-transparent', '');
document.body.insertBefore(resListContainer, null);
resListContainer.addEventListener('click', e => {
if (e.target.classList.contains('res-mail')) {
resList[e.target.textContent].mailElement.scrollIntoView({ behavior: 'smooth'});
}
});
var resListCountLabel = newElement('DIV', 'res res-count-label', '');
var refreshResListCountLabel = () => { resListCountLabel.textContent = '✉ x ' + mails.length; };
refreshResListCountLabel();
resListContainer.insertBefore(resListCountLabel, null);
var mailButton = newElement('SPAN', 'mail-list-btn', '[✉]');
// ----------------------------------------
// Main
var refleshList = isForceShowList => {
var rtds = document.getElementsByClassName('rtd');
var newRtds = [];
for (var i = rtds.length - 1, newRtd; newRtd = rtds[i]; i --) {
if (newRtd.getAttribute('data-mail-searched')) break;
newRtd.setAttribute('data-mail-searched', '1');
newRtds.unshift(newRtd);
}
newRtds.forEach(rtd => {
var mailElement =
rtd.querySelector('[href^="mailto:"]') || // default
rtd.getElementsByClassName('KOSHIAN_meran')[0] || // kosian
rtd.querySelector('[color="#005ce6"]'); // futakuro
if (!mailElement) return;
var mail = mailElement.href ? decodeURI(mailElement.href).replace('mailto:', '') : mailElement.textContent.replace(/^\[|\]$/g, '');
if (mail.match(CONFIG.ignoreRegex)) return;
var res = resList[mail];
if (!res) {
mails.push(mail);
refreshResListCountLabel();
res = { resContainer: newElement('DIV', 'res', '') };
resList[mail] = res;
res.resContainer.appendChild(newElement('DIV', 'res-mail', mail));
resListContainer.insertBefore(res.resContainer, resListCountLabel);
}
res.mailElement = mailElement;
// BLOCKQUOTEタグを変なところにコピーすると一部のアドオンの動作がおかしくなるので本文はDIVにコピーする
var text = newElement('DIV', 'res-text', '');
var n = rtd.getElementsByTagName('BLOCKQUOTE')[0].firstChild;
while (n) {
text.appendChild(n.cloneNode(true));
n = n.nextSibling;
}
res.resContainer.appendChild(text);
});
if (CONFIG.showListEvenWithoutMails || mails.length) {
resListContainer.classList.remove('res-list-transparent');
}
};
// ----------------------------------------
// DOMの監視
var timer;
var observer = new MutationObserver(rec => {
clearTimeout(timer);
timer = setTimeout(refleshList, 1000);
});
// ----------------------------------------
// List ON OFF
var listOn = () => {
refleshList();
mailButton.classList.add('mail-list-btn-on');
observer.observe(document.body, { childList: true, subtree: true });
};
var listOff = () => {
observer.disconnect();
resListContainer.classList.add('res-list-transparent');
mailButton.classList.remove('mail-list-btn-on');
};
var toggle = e => {
if (resListContainer.classList.contains('res-list-transparent')) {
CONFIG.showListEvenWithoutMails = true;
listOn();
} else {
listOff();
}
};
var addMailButton = () => {
mailButton.addEventListener('click', toggle);
var futakuroBorderArea = document.getElementById('border_area');
if (futakuroBorderArea) {
futakuroBorderArea.insertBefore(mailButton, null);
} else {
document.getElementById('contres').insertBefore(mailButton, document.getElementById('contdisp').nextSibling);
}
};
// ----------------------------------------
// Start HERE !
setTimeout(() => {
addMailButton();
if (CONFIG.showListOnPageLoaded) {
listOn();
}
}, 500); // wait for futakuro
QingJ © 2025
镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址