自动帮你点击 Pixiv 评论区的 “查看后续” 与 “查看回复” 按钮,解放双手——
// ==UserScript==
// @name Pixiv 自动展开折叠评论/回复
// @namespace https://blog.sxjeru.top/
// @version 1.0
// @description 自动帮你点击 Pixiv 评论区的 “查看后续” 与 “查看回复” 按钮,解放双手——
// @author sxjeru
// @icon https://blog.sxjeru.top/favicon.ico
// @grant none
// @license GPL-3.0
// @match *://www.pixiv.net/*
// ==/UserScript==
(function() {
'use strict';
const targetText = '查看回复';
var observer = new IntersectionObserver(function(entries) { // 自动点击“查看后续”
entries.forEach(function(entry) {
if (entry.isIntersecting) {
clickButton(entry.target);
}
});
});
var observer2 = new IntersectionObserver((entries, observer) => { // 自动点击“查看回复”
entries.forEach(entry => {
if (entry.isIntersecting && entry.target.textContent === targetText) {
setTimeout(function() {
entry.target.parentNode.click();
}, 300); // 延迟点击
observer.unobserve(entry.target);
}
});
}, { rootMargin: '0px', threshold: 0.1 });
function clickButton(element) {
var button = document.querySelector('button[aria-controls="' + element.id + '"]');
if (button) {
setTimeout(function() {
button.click();
}, 300); // 延迟点击
observer.unobserve(element);
}
}
// 创建一个MutationObserver实例来监视DOM的变化
var mutationObserver = new MutationObserver(function(mutations) {
mutations.forEach(function(mutation) {
if (mutation.type === 'childList') {
var newElements = mutation.target.querySelectorAll('[id^="expandable-paragraph-"], div');
for (var i = 0; i < newElements.length; i++) {
var element = newElements[i];
if (element.id && element.id.startsWith('expandable-paragraph-')) {
observer.observe(element);
} else if (element.textContent === targetText) {
observer2.observe(element);
}
// 立即检查新元素是否已经在可视区域内
var rect = element.getBoundingClientRect();
if (rect.top >= 0 && rect.left >= 0 && rect.bottom <= window.innerHeight && rect.right <= window.innerWidth) {
if (element.id && element.id.startsWith('expandable-paragraph-')) {
clickButton(element);
} else if (element.textContent === targetText) {
element.click();
}
}
}
}
});
});
// 开始监视整个文档的DOM变化
mutationObserver.observe(document.body, { childList: true, subtree: true });
})();