Greasemonkey脚本输出DOM节点属性信息的跨域及输出方法问询
针对你的两个问题,我整理了适配新版Firefox Greasemonkey环境的实用方案:
问题1:无需修改原DOM的大文本输出方案(支持复制)
如果不想改动原页面DOM,这几个方案都很靠谱:
直接用Data URL打开纯文本窗口
把要输出的内容编码后,通过data:text/plain协议打开新窗口,窗口里就是可直接复制的纯文本,完全不碰原页面DOM,也没有跨域问题。示例代码:const domSummary = "你的DOM节点属性详细摘要文本..."; // 编码文本避免特殊字符问题 const encodedText = encodeURIComponent(domSummary); window.open(`data:text/plain;charset=utf-8,${encodedText}`, '_blank', 'width=900,height=700');这个窗口里的内容可以直接全选复制,体验和普通文本文件一致。
一键复制到剪贴板+提示
如果不需要额外窗口,直接把内容复制到剪贴板,再用简单提示告知用户。适合内容特别大但用户只需要复制的场景:const domSummary = "你的DOM节点属性详细摘要文本..."; navigator.clipboard.writeText(domSummary) .then(() => { alert("DOM摘要已复制到剪贴板!"); }) .catch(err => { console.error("复制失败:", err); // 兜底方案:剪贴API失败时用Data URL打开窗口 const encodedText = encodeURIComponent(domSummary); window.open(`data:text/plain;charset=utf-8,${encodedText}`, '_blank'); });建议把这个逻辑绑定到Greasemonkey的菜单命令(用
GM_registerMenuCommand),让用户主动触发,避免浏览器剪贴板权限限制。生成可下载的文本文件
同样不修改原DOM,直接生成文本文件触发浏览器下载,用户可以保存后随时查看或复制:const domSummary = "你的DOM节点属性详细摘要文本..."; const blob = new Blob([domSummary], { type: 'text/plain;charset=utf-8' }); const url = URL.createObjectURL(blob); // 模拟点击下载,无需插入DOM const a = document.createElement('a'); a.href = url; a.download = 'dom-node-summary.txt'; const clickEvent = new MouseEvent('click', { bubbles: true, cancelable: true }); a.dispatchEvent(clickEvent); URL.revokeObjectURL(url);
问题2:在Greasemonkey中创建窗口并写入内容(解决跨域问题)
如果一定要创建空白窗口再写入内容,核心是避开跨域限制,试试这两种方法:
创建窗口后立即写入内容
利用about:blank窗口创建初期与原脚本同源的特性,在窗口加载完成前直接用document.write写入内容:const domSummary = "你的DOM节点属性详细摘要文本..."; const newWin = window.open('', '_blank', 'width=800,height=600'); // 转义HTML特殊字符,避免破坏页面结构 const safeText = domSummary.replace(/</g, '<').replace(/>/g, '>'); newWin.document.write(`<html><body><pre>${safeText}</pre></body></html>`); newWin.document.close(); // 必须调用close完成写入用GM_openInTab打开Data URL
Greasemonkey的GM_openInTabAPI可以直接打开指定URL的标签页,把内容转成Data URL后调用该API,既符合安全策略,又能直接显示内容:// 先在脚本元数据里声明权限:@grant GM_openInTab const domSummary = "你的DOM节点属性详细摘要文本..."; const encodedText = encodeURIComponent(domSummary); const dataUrl = `data:text/plain;charset=utf-8,${encodedText}`; GM_openInTab(dataUrl, { active: true }); // active设为true会激活新标签页这个方法不需要处理跨域问题,Data URL本身就是独立的安全上下文,完全适配Greasemonkey的规则。
内容的提问来源于stack exchange,提问作者Michael Cormier

