メール欄があるレスだけ表示するボタンを追加します(同じメールアドレスのレスは最新のものだけ表示します)
当前为
// ==UserScript==
// @name メール欄があるレスだけ表示
// @version 2.4
// @grant none
// @include https://*.2chan.net/*/res/*
// @description メール欄があるレスだけ表示するボタンを追加します(同じメールアドレスのレスは最新のものだけ表示します)
// @namespace https://gf.qytechs.cn/users/114367
// ==/UserScript==
// ----------------------------------------
// CSS
// [✉]ボタン
document.styleSheets[0].insertRule(`
.mail-list-btn {
cursor: pointer;
}
`);
document.styleSheets[0].insertRule(`
.mail-list-btn-on {
color: #00f;
}
`);
// リストの表示位置とか
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(`
.res {
background: #0002;
border-radius: 5px;
color: #800;
margin: 5px;
padding: 5px;
}
`);
// メールアドレス
document.styleSheets[0].insertRule(`
.res-mail {
color: #00f;
}
`);
// レス本文
document.styleSheets[0].insertRule(`
.res-blockquote {
font-size: 90%;
margin: 0;
padding-left: 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', 'res-list-button', '[✉]');
// ----------------------------------------
// Main
var lastCount = 0;
var searchRess = () => {
var beforeCount = lastCount;
var rtds = document.getElementsByClassName('rtd');
lastCount = rtds.length;
if (beforeCount === lastCount) return false
var result = false;
var newMails = [];
var ignores = ['sage', '[sage]'];
for (var i = lastCount - 1, rtd; rtd = rtds[i]; i --) {
if (rtd.getAttribute('data-mail-searched')) break;
rtd.setAttribute('data-mail-searched', '1');
var mailElement =
rtd.querySelector('[href^="mailto:"]') || // default
rtd.getElementsByClassName('KOSHIAN_meran')[0] || // kosian
rtd.querySelector('[color="#005ce6"]'); // futakuro
if (!mailElement) continue;
result = true;
var mail = mailElement.href ? decodeURI(mailElement.href).replace('mailto:', '') : mailElement.textContent;
if (ignores.indexOf(mail) !== -1) continue;
if (!resList[mail]) newMails.unshift(mail);
var blockQuote = rtd.getElementsByTagName('BLOCKQUOTE')[0].cloneNode(true);
blockQuote.classList.add('res-blockquote');
resList[mail] = { mailElement: mailElement, blockQuote: blockQuote };
ignores.push(mail);
}
mails = mails.concat(newMails);
return result;
};
var refleshList = () => {
var isUpdated = searchRess();
if (!isUpdated) return;
refreshResListCountLabel();
mails.forEach(mail => {
var resText = document.getElementById('res_text_' + mail);
if (resText) {
resText.replaceChild(resList[mail].blockQuote, resText.firstChild);
return;
}
resText = newElement('DIV', 'res-text', '');
resText.id = 'res_text_' + mail;
resText.insertBefore(resList[mail].blockQuote, null);
var res = newElement('DIV', 'res', '');
res.insertBefore(newElement('DIV', 'res-mail', mail), null);
res.insertBefore(resText, null);
resListContainer.insertBefore(res, resListCountLabel);
});
};
// ----------------------------------------
// List ON OFF
var timer;
var listOff = () => {
clearInterval(timer);
timer = null;
resListContainer.classList.add('res-list-transparent');
mailButton.classList.remove('mail-list-btn-on');
};
var listOn = () => {
listOff();
refleshList();
resListContainer.classList.remove('res-list-transparent');
mailButton.classList.add('mail-list-btn-on');
timer = setInterval(refleshList, 1500);
};
var toggle = e => {
if (timer) {
listOff();
} else {
listOn();
}
};
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 !
// wait for futakuro
setTimeout(addMailButton, 500);
// リストONで初めたい場合は↓の「//」削除する
//listOn();
QingJ © 2025
镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址