fix(Bangumi_Topic_Share): use isolated iframe for capture to fix Chrome screenshot hang, bump version to 4.8
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -1,7 +1,7 @@
|
|||||||
// ==UserScript==
|
// ==UserScript==
|
||||||
// @name Bangumi Topic Share
|
// @name Bangumi Topic Share
|
||||||
// @namespace http://tampermonkey.net/
|
// @namespace http://tampermonkey.net/
|
||||||
// @version 4.7
|
// @version 4.8
|
||||||
// @description Bangumi 话题分享工具:生成分享卡片,支持图片复制/下载、一键复制分享文案、可选 AI 标签
|
// @description Bangumi 话题分享工具:生成分享卡片,支持图片复制/下载、一键复制分享文案、可选 AI 标签
|
||||||
// @author Chang ji
|
// @author Chang ji
|
||||||
// @contributor Stardream
|
// @contributor Stardream
|
||||||
@@ -275,19 +275,37 @@
|
|||||||
setTimeout(async () => {
|
setTimeout(async () => {
|
||||||
if (cancelled) return;
|
if (cancelled) return;
|
||||||
let canvas;
|
let canvas;
|
||||||
|
let iframe = null;
|
||||||
try {
|
try {
|
||||||
const timeout = new Promise((_, reject) => setTimeout(() => reject(new Error('timeout')), 10000));
|
const timeout = new Promise((_, reject) => setTimeout(() => reject(new Error('timeout')), 10000));
|
||||||
|
const captureEl = document.querySelector('#capture-area');
|
||||||
|
|
||||||
|
// 将卡片注入独立 iframe,避免 html2canvas 克隆整个 Bangumi 页面 DOM
|
||||||
|
iframe = document.createElement('iframe');
|
||||||
|
iframe.style.cssText = 'position:fixed;top:0;left:0;border:0;opacity:0;pointer-events:none;z-index:99999;';
|
||||||
|
iframe.style.width = captureEl.offsetWidth + 'px';
|
||||||
|
iframe.style.height = captureEl.offsetHeight + 'px';
|
||||||
|
document.body.appendChild(iframe);
|
||||||
|
|
||||||
|
const iDoc = iframe.contentDocument;
|
||||||
|
const iStyle = iDoc.createElement('style');
|
||||||
|
iStyle.textContent = style.innerHTML;
|
||||||
|
iDoc.head.appendChild(iStyle);
|
||||||
|
iDoc.body.style.cssText = 'margin:0;padding:0;background:transparent;';
|
||||||
|
iDoc.body.innerHTML = captureEl.innerHTML;
|
||||||
|
|
||||||
|
await new Promise(r => requestAnimationFrame(() => requestAnimationFrame(r)));
|
||||||
|
|
||||||
canvas = await Promise.race([
|
canvas = await Promise.race([
|
||||||
html2canvas(document.querySelector('#capture-area'), {
|
html2canvas(iDoc.body, { scale: 2, backgroundColor: null }),
|
||||||
scale: 2, backgroundColor: null, useCORS: true,
|
|
||||||
ignoreElements: (el) => el.tagName === 'CANVAS' && el !== document.querySelector('#capture-area')
|
|
||||||
}),
|
|
||||||
timeout
|
timeout
|
||||||
]);
|
]);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
|
iframe?.remove();
|
||||||
showToast('✗ 截图失败,请刷新后重试');
|
showToast('✗ 截图失败,请刷新后重试');
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
iframe?.remove();
|
||||||
if (cancelled) return;
|
if (cancelled) return;
|
||||||
|
|
||||||
const copyBtn = document.getElementById('bgm-copy-btn');
|
const copyBtn = document.getElementById('bgm-copy-btn');
|
||||||
|
|||||||
Reference in New Issue
Block a user