代码优化提交
This commit is contained in:
@@ -71,6 +71,8 @@ public class ApiDocGenerator {
|
||||
sb.append("<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n");
|
||||
sb.append("<title>API 接口文档</title>\n");
|
||||
appendCss(sb);
|
||||
// 图片复制依赖 html2canvas(联网时加载;离线自动降级为富文本)
|
||||
sb.append("<script src=\"https://cdnjs.cloudflare.com/ajax/libs/html2canvas/1.4.1/html2canvas.min.js\"></script>\n");
|
||||
sb.append("</head>\n<body>\n");
|
||||
|
||||
// 顶部栏(含搜索)
|
||||
@@ -150,7 +152,10 @@ public class ApiDocGenerator {
|
||||
sb.append(" <span class=\"api-name\">").append(escapeHtml(ci.className)).append("</span>\n");
|
||||
sb.append(" </div>\n");
|
||||
if (ci.methods != null) {
|
||||
sb.append(" <div class=\"api-header-right\">").append(ci.methods.size()).append(" 个方法</div>\n");
|
||||
sb.append(" <div class=\"api-header-right\">");
|
||||
sb.append("<button class=\"api-copy-btn img\" onclick=\"copyImage(this.closest('.api-card'),this)\" title=\"复制为图片(PNG)\">🖼 图片</button> ");
|
||||
sb.append("<button class=\"api-copy-btn txt\" onclick=\"copyRtfFromEl(this.closest('.api-card'),this)\" title=\"复制为 Word 富文本(RTF)\">📄 富文本</button> ");
|
||||
sb.append("<span>").append(ci.methods.size()).append(" 个方法</span></div>\n");
|
||||
}
|
||||
sb.append(" </div>\n");
|
||||
|
||||
@@ -194,6 +199,8 @@ public class ApiDocGenerator {
|
||||
if (mi.returnType != null) {
|
||||
sb.append(" <span class=\"method-return\">→ <code>").append(escapeHtml(mi.returnType)).append("</code></span>\n");
|
||||
}
|
||||
sb.append(" <button class=\"method-copy-btn img\" onclick=\"event.stopPropagation();copyImage(this.closest('.method-card'),this)\" title=\"复制为图片(PNG)\">🖼 图片</button>\n");
|
||||
sb.append(" <button class=\"method-copy-btn txt\" onclick=\"event.stopPropagation();copyRtfFromEl(this.closest('.method-card'),this)\" title=\"复制为 Word 富文本(RTF)\">📋 富文本</button>\n");
|
||||
sb.append(" </div>\n");
|
||||
|
||||
// 方法体
|
||||
@@ -516,6 +523,20 @@ public class ApiDocGenerator {
|
||||
sb.append(".copy-btn:hover{color:#fff;border-color:#888}\n");
|
||||
sb.append(".copy-btn.copied{color:#52c41a;border-color:#52c41a}\n");
|
||||
|
||||
// 接口/方法级复制按钮
|
||||
sb.append(".api-copy-btn{padding:4px 12px;border:1px solid #1677ff;border-radius:4px;background:#e8f3ff;color:#1677ff;font-size:12px;cursor:pointer;transition:.15s;font-family:inherit}\n");
|
||||
sb.append(".api-copy-btn:hover{background:#1677ff;color:#fff}\n");
|
||||
sb.append(".api-copy-btn.copied{background:#52c41a;border-color:#52c41a;color:#fff}\n");
|
||||
sb.append(".method-copy-btn{margin-left:auto;padding:3px 10px;border:1px solid #e5e6eb;border-radius:3px;background:#fff;color:#4e5969;font-size:11px;cursor:pointer;transition:.15s;font-family:inherit;flex-shrink:0}\n");
|
||||
sb.append(".method-copy-btn:hover{border-color:#1677ff;color:#1677ff;background:#e8f3ff}\n");
|
||||
sb.append(".method-copy-btn.copied{border-color:#52c41a;color:#52c41a;background:#f6ffed}\n");
|
||||
// 复制双按钮:图片为主,富文本为次
|
||||
sb.append(".api-copy-btn.txt{background:#fff;color:#1677ff}\n");
|
||||
sb.append(".api-copy-btn.txt:hover{background:#e8f3ff}\n");
|
||||
sb.append(".method-copy-btn.txt{color:#1677ff;border-color:#91caff;background:#f0f7ff}\n");
|
||||
sb.append(".method-copy-btn.img{background:#1677ff;color:#fff;border-color:#1677ff}\n");
|
||||
sb.append(".method-copy-btn.img:hover{background:#0958d9;border-color:#0958d9}\n");
|
||||
|
||||
// 参数块
|
||||
sb.append(".params-block{margin-bottom:12px}\n");
|
||||
sb.append(".params-block-title{font-size:13px;font-weight:600;color:#4e5969;margin-bottom:6px}\n");
|
||||
@@ -656,6 +677,208 @@ public class ApiDocGenerator {
|
||||
sb.append(" btn.textContent='\\u2714';btn.classList.add('copied');\n");
|
||||
sb.append(" setTimeout(function(){btn.textContent='\\u590D\\u5236';btn.classList.remove('copied');},1500);\n");
|
||||
sb.append("}\n");
|
||||
|
||||
// 复制用内联样式(保证粘贴到 Word 保留表格/缩进/配色,且可编辑)
|
||||
sb.append("var DOC_CSS=\"<style>\"");
|
||||
sb.append("+\"*{font-family:'Microsoft YaHei','Segoe UI',Arial,sans-serif;box-sizing:border-box}\"");
|
||||
sb.append("+\"body{margin:0;color:#1d1d1f;font-size:12px;line-height:1.6}\"");
|
||||
sb.append("+\".doc-facade,.doc-method{padding:2px 4px}\"");
|
||||
sb.append("+\"h2{font-size:18px;margin:0 0 4px;color:#1d1d1f}\"");
|
||||
sb.append("+\"h3{font-size:15px;margin:0 0 8px;color:#1d1d1f}\"");
|
||||
sb.append("+\".api-meta{color:#666;font-size:12px;margin-bottom:10px}\"");
|
||||
sb.append("+\".doc-method{margin-bottom:16px;border-bottom:1px solid #eee;padding-bottom:10px}\"");
|
||||
sb.append("+\".method-annotations{margin-bottom:8px}\"");
|
||||
sb.append("+\".anno-tag{display:inline-block;background:#e8f3ff;color:#1677ff;font-size:11px;padding:1px 7px;border-radius:3px;margin:0 4px 4px 0;font-family:Consolas,'Courier New',monospace}\"");
|
||||
sb.append("+\".method-desc{font-size:13px;color:#4e5969;padding:8px 12px;background:#fafbfc;border-radius:4px;margin-bottom:10px;border-left:3px solid #e5e6eb;white-space:pre-wrap}\"");
|
||||
sb.append("+\".method-signature{padding:10px 14px;background:#1e1e1e;border-radius:6px;margin-bottom:12px;font-family:Consolas,'Courier New',monospace;font-size:13px;color:#d4d4d4;white-space:pre-wrap;word-break:break-all}\"");
|
||||
sb.append("+\".method-signature code{color:#d4d4d4;font-family:Consolas,'Courier New',monospace}\"");
|
||||
sb.append("+\".params-block{margin-bottom:12px}\"");
|
||||
sb.append("+\".params-block-title{font-size:13px;font-weight:600;color:#4e5969;margin-bottom:6px}\"");
|
||||
sb.append("+\".dto-block{margin-bottom:10px;border:1px solid #e5e6eb;border-radius:6px;overflow:hidden}\"");
|
||||
sb.append("+\".dto-block-title{padding:8px 12px;background:#fafbfc;font-size:13px;font-weight:600;border-left:3px solid #1677ff}\"");
|
||||
sb.append("+\".dto-block-title small{font-weight:400;color:#86909c}\"");
|
||||
sb.append("+\".data-table{width:100%;border-collapse:collapse;font-size:12px}\"");
|
||||
sb.append("+\".data-table th{background:#fafbfc;text-align:left;padding:7px 10px;border:1px solid #e5e6eb;font-weight:600;color:#4e5969;white-space:nowrap}\"");
|
||||
sb.append("+\".data-table td{padding:7px 10px;border:1px solid #e5e6eb;color:#1d1d1f;vertical-align:top}\"");
|
||||
sb.append("+\".data-table code{font-family:Consolas,'Courier New',monospace;font-size:11px;background:#f2f3f5;padding:1px 5px;border-radius:2px;color:#1677ff}\"");
|
||||
sb.append("+\".data-table code.field-name{color:#d46b08}\"");
|
||||
sb.append("+\".field-row.d0 td{background:#fff}\"");
|
||||
sb.append("+\".field-row.d1 td{background:#f9fbff}\"");
|
||||
sb.append("+\".field-row.d2 td{background:#f6f9ff}\"");
|
||||
sb.append("+\".field-row.d3 td{background:#f3f6ff}\"");
|
||||
sb.append("+\".field-row.d1 td:first-child{border-left:3px solid #52c41a}\"");
|
||||
sb.append("+\".field-row.d2 td:first-child{border-left:3px solid #fa8c16}\"");
|
||||
sb.append("+\".field-row.d3 td:first-child{border-left:3px solid #722ed1}\"");
|
||||
sb.append("+\".type-complex{color:#722ed1;background:#f3e8ff}\"");
|
||||
sb.append("+\".type-custom{color:#0958d9;background:#e6f4ff;border:1px solid #91caff}\"");
|
||||
sb.append("+\".fqn{font-size:11px;color:#86909c;font-family:Consolas,'Courier New',monospace}\"");
|
||||
sb.append("+\".inherit-tag{font-size:11px;color:#86909c;font-style:italic}\"");
|
||||
sb.append("+\".throws-block{font-size:12px;color:#f53f3f;padding:6px 0}\"");
|
||||
sb.append("+\".throws-block code{background:#fff2f0;padding:2px 6px;border-radius:2px}\"");
|
||||
sb.append("+\"</style>\";\n");
|
||||
|
||||
// 复制按钮反馈
|
||||
sb.append("function markCopied(btn,msg){\n");
|
||||
sb.append(" if(!btn._orig)btn._orig=btn.innerHTML;\n");
|
||||
sb.append(" btn.classList.add('copied');\n");
|
||||
sb.append(" btn.textContent=msg||'\\u2714 已复制';\n");
|
||||
sb.append(" setTimeout(function(){if(btn._orig)btn.innerHTML=btn._orig;btn.classList.remove('copied');},2000);\n");
|
||||
sb.append("}\n");
|
||||
|
||||
// 去掉复制按钮等干扰元素
|
||||
sb.append("function cleanBody(body){\n");
|
||||
sb.append(" var t=document.createElement('div');t.innerHTML=body.innerHTML;\n");
|
||||
sb.append(" t.querySelectorAll('.copy-btn').forEach(function(b){if(b.parentNode)b.parentNode.removeChild(b);});\n");
|
||||
sb.append(" return t.innerHTML;\n");
|
||||
sb.append("}\n");
|
||||
|
||||
// 构建接口级富文本
|
||||
sb.append("function buildFacadeHtml(card){\n");
|
||||
sb.append(" var name=card.querySelector('.api-name').textContent;\n");
|
||||
sb.append(" var fqn=card.querySelector('.info-value.mono');\n");
|
||||
sb.append(" var fqnText=fqn?fqn.textContent:'';\n");
|
||||
sb.append(" var html='<div class=\"doc-facade\">'+DOC_CSS+'<h2>'+name+'</h2><div class=\"api-meta\">'+fqnText+'</div>';\n");
|
||||
sb.append(" card.querySelectorAll('.method-card').forEach(function(mc){\n");
|
||||
sb.append(" var wasCollapsed=mc.querySelector('.method-header.collapsed');\n");
|
||||
sb.append(" if(wasCollapsed)wasCollapsed.classList.remove('collapsed');\n");
|
||||
sb.append(" var body=mc.querySelector('.method-body');\n");
|
||||
sb.append(" if(body)html+='<div class=\"doc-method\">'+cleanBody(body)+'</div>';\n");
|
||||
sb.append(" if(wasCollapsed)mc.querySelector('.method-header').classList.add('collapsed');\n");
|
||||
sb.append(" });\n");
|
||||
sb.append(" html+='</div>';\n");
|
||||
sb.append(" return html;\n");
|
||||
sb.append("}\n");
|
||||
|
||||
// 构建方法级富文本
|
||||
sb.append("function buildMethodHtml(mc){\n");
|
||||
sb.append(" var name=mc.querySelector('.method-name').textContent;\n");
|
||||
sb.append(" var html='<div class=\"doc-method\">'+DOC_CSS+'<h3>'+name+'</h3>';\n");
|
||||
sb.append(" var wasCollapsed=mc.querySelector('.method-header.collapsed');\n");
|
||||
sb.append(" if(wasCollapsed)wasCollapsed.classList.remove('collapsed');\n");
|
||||
sb.append(" var body=mc.querySelector('.method-body');\n");
|
||||
sb.append(" if(body)html+=cleanBody(body);\n");
|
||||
sb.append(" if(wasCollapsed)mc.querySelector('.method-header').classList.add('collapsed');\n");
|
||||
sb.append(" html+='</div>';\n");
|
||||
sb.append(" return html;\n");
|
||||
sb.append("}\n");
|
||||
|
||||
// ===== 复制为 RTF(Word 还原度最高,纯离线、零依赖)=====
|
||||
// RTF 转义:中文用 \\u 十进制转义,规避编码问题;字体统一微软雅黑
|
||||
sb.append("function rtfEsc(s){\n");
|
||||
sb.append(" s=(s==null?'':String(s));var out='';\n");
|
||||
sb.append(" for(var i=0;i<s.length;i++){var c=s.charCodeAt(i);var ch=s.charAt(i);\n");
|
||||
sb.append(" if(ch==='\\\\'){out+='\\\\\\\\';}\n");
|
||||
sb.append(" else if(ch==='{'){out+='\\\\{';}\n");
|
||||
sb.append(" else if(ch==='}'){out+='\\\\}';}\n");
|
||||
sb.append(" else if(c<128){out+=ch;}\n");
|
||||
sb.append(" else{var v=c;if(v>32767)v-=65536;out+='\\\\u'+v+'?';}}\n");
|
||||
sb.append(" return out;\n");
|
||||
sb.append("}\n");
|
||||
// RTF 文档头(字体表/颜色表/默认段落),字号单位半磅
|
||||
sb.append("var RTF_HEAD=\"{\\\\rtf1\\\\ansi\\\\ansicpg936\\\\uc1\\\\deff0\\\\deflang1033\\\\deflangfe2052\"\n");
|
||||
sb.append(" +\"{\\\\fonttbl{\\\\f0\\\\fnil\\\\fcharset134\\\\fprq2 Microsoft YaHei;}}\"\n");
|
||||
sb.append(" +\"{\\\\colortbl;\\\\red102\\\\green102\\\\blue102;\\\\red22\\\\green119\\\\blue255;\\\\red212\\\\green107\\\\blue8;\\\\red245\\\\green63\\\\blue63;\\\\red82\\\\green196\\\\blue26;\\\\red250\\\\green140\\\\blue22;\\\\red114\\\\green46\\\\blue209;\\\\red29\\\\green29\\\\blue29;}\"\n");
|
||||
sb.append(" +\"\\\\viewkind4\\\\uc1\\\\pard\\\\sa80\\\\sl240\\\\slmult1\\\\f0\\\\fs21\\\\cf0\\\\widctlpar\\\\hyphpar0\\\\par\";\n");
|
||||
sb.append("var RTF_TAIL=\"}\";\n");
|
||||
// 段落
|
||||
sb.append("function rtfP(o,t){o=o||{};var b=o.b?'\\\\b ':'';var col=o.cf!=null?'\\\\cf'+o.cf+' ':'';var li=o.li||0;var sz=o.sz||21;\n");
|
||||
sb.append(" t=(t==null?'':String(t)).replace(/\\r?\\n/g,'\\\\line ');\n");
|
||||
sb.append(" return '\\\\pard\\\\li'+li+'\\\\sa80\\\\sl240\\\\slmult1 '+b+col+'\\\\f0\\\\fs'+sz+' '+rtfEsc(t)+'\\\\par';\n");
|
||||
sb.append("}\n");
|
||||
// 表格(含边框),left 为整体左缩进(twips)
|
||||
sb.append("function rtfTable(tableEl,left){\n");
|
||||
sb.append(" left=left||0;var rows=tableEl.querySelectorAll('tr');if(!rows.length)return '';\n");
|
||||
sb.append(" var n=rows[0].querySelectorAll('th,td').length;var total=8800;var w=Math.floor(total/n);var cx=[];for(var k=0;k<n;k++)cx.push((k+1)*w);\n");
|
||||
sb.append(" var r='',br='\\\\clbrdrt\\\\brdrs\\\\brdrw10\\\\clbrdrl\\\\brdrs\\\\brdrw10\\\\clbrdrb\\\\brdrs\\\\brdrw10\\\\clbrdrr\\\\brdrs\\\\brdrw10 ';\n");
|
||||
sb.append(" for(var ri=0;ri<rows.length;ri++){\n");
|
||||
sb.append(" var cells=rows[ri].querySelectorAll('th,td');var isHead=ri===0;\n");
|
||||
sb.append(" r+='\\\\trowd\\\\trgaph50\\\\trleft'+left+'\\\\trbrdrt\\\\brdrs\\\\brdrw10\\\\trbrdrl\\\\brdrs\\\\brdrw10\\\\trbrdrb\\\\brdrs\\\\brdrw10\\\\trbrdrr\\\\brdrs\\\\brdrw10\\\\trpaddl50\\\\trpaddr50\\\\trpaddfl3\\\\trpaddfr3';\n");
|
||||
sb.append(" for(var k=0;k<n;k++)r+=br+'\\\\cellx'+cx[k];\n");
|
||||
sb.append(" for(var k=0;k<n;k++){var txt=cells[k]?cells[k].textContent:'';var st=isHead?'\\\\b \\\\cf1 \\\\fs20 ':'\\\\fs20 ';r+='\\\\pard\\\\intbl\\\\li'+left+'\\\\sa0\\\\sl220\\\\slmult1 '+st+rtfEsc(txt)+'\\\\cell';}\n");
|
||||
sb.append(" r+='\\\\row';\n");
|
||||
sb.append(" }return r;\n");
|
||||
sb.append("}\n");
|
||||
// 单个方法的 RTF
|
||||
sb.append("function rtfForMethod(mc){\n");
|
||||
sb.append(" var name=mc.querySelector('.method-name').textContent;var r='';\n");
|
||||
sb.append(" r+=rtfP({b:true,sz:28},name);\n");
|
||||
sb.append(" var annos=mc.querySelectorAll('.method-annotations .anno-tag');if(annos.length){var a=[];annos.forEach(function(x){a.push(x.textContent);});r+=rtfP({sz:18,cf:2},a.join(' '));}\n");
|
||||
sb.append(" var desc=mc.querySelector('.method-desc');if(desc)r+=rtfP({sz:21},desc.textContent);\n");
|
||||
sb.append(" var sig=mc.querySelector('.method-signature code');if(sig)r+=rtfP({sz:20,li:200,cf:8},sig.textContent);\n");
|
||||
sb.append(" mc.querySelectorAll('.params-block').forEach(function(pb){\n");
|
||||
sb.append(" var t=pb.querySelector('.params-block-title');if(t)r+=rtfP({b:true,sz:21},t.textContent);\n");
|
||||
sb.append(" var tbl=pb.querySelector('table');if(tbl)r+=rtfTable(tbl,0);\n");
|
||||
sb.append(" });\n");
|
||||
sb.append(" mc.querySelectorAll('.dto-block').forEach(function(db){\n");
|
||||
sb.append(" var depth=0,p=db.parentElement;while(p){if(p.classList&&p.classList.contains('dto-block'))depth++;p=p.parentElement;}\n");
|
||||
sb.append(" var t=db.querySelector('.dto-block-title');if(t)r+=rtfP({b:true,sz:21,cf:2,li:depth*300},t.textContent.replace(/\\s+/g,' '));\n");
|
||||
sb.append(" var tbl=db.querySelector('table');if(tbl)r+=rtfTable(tbl,depth*300);\n");
|
||||
sb.append(" });\n");
|
||||
sb.append(" var th=mc.querySelector('.throws-block');if(th)r+=rtfP({sz:20,cf:4},th.textContent);\n");
|
||||
sb.append(" return r;\n");
|
||||
sb.append("}\n");
|
||||
// 整个接口的 RTF
|
||||
sb.append("function rtfForFacade(card){\n");
|
||||
sb.append(" var name=card.querySelector('.api-name').textContent;var fqn=card.querySelector('.info-value.mono');var r='';\n");
|
||||
sb.append(" r+=rtfP({b:true,sz:32},name);\n");
|
||||
sb.append(" if(fqn)r+=rtfP({sz:18,cf:1},fqn.textContent);\n");
|
||||
sb.append(" card.querySelectorAll('.method-card').forEach(function(mc){\n");
|
||||
sb.append(" var wasCollapsed=mc.querySelector('.method-header.collapsed');if(wasCollapsed)wasCollapsed.classList.remove('collapsed');\n");
|
||||
sb.append(" r+=rtfForMethod(mc);\n");
|
||||
sb.append(" if(wasCollapsed)mc.querySelector('.method-header').classList.add('collapsed');\n");
|
||||
sb.append(" });\n");
|
||||
sb.append(" return RTF_HEAD+r+RTF_TAIL;\n");
|
||||
sb.append("}\n");
|
||||
// 复制为 RTF(写入剪贴板 text/rtf);不支持时降级 HTML
|
||||
sb.append("function copyRtfFromEl(el,btn){\n");
|
||||
sb.append(" var rtf=el.classList.contains('api-card')?rtfForFacade(el):(RTF_HEAD+rtfForMethod(el)+RTF_TAIL);\n");
|
||||
sb.append(" var plain=(el.textContent||'').replace(/\\s+/g,' ').trim();\n");
|
||||
sb.append(" if(navigator.clipboard&&window.ClipboardItem){\n");
|
||||
sb.append(" try{var rb=new Blob([rtf],{type:'text/rtf'});var pb=new Blob([plain],{type:'text/plain'});\n");
|
||||
sb.append(" navigator.clipboard.write([new ClipboardItem({'text/rtf':rb,'text/plain':pb})]).then(function(){markCopied(btn,'\\u2714 已复制');}).catch(function(){fallbackRich(el,btn);});\n");
|
||||
sb.append(" return;}catch(e){}\n");
|
||||
sb.append(" }\n");
|
||||
sb.append(" fallbackRich(el,btn);\n");
|
||||
sb.append("}\n");
|
||||
sb.append("function fallbackRich(el,btn){\n");
|
||||
sb.append(" var html=el.classList.contains('api-card')?buildFacadeHtml(el):buildMethodHtml(el);\n");
|
||||
sb.append(" legacyRich(html,btn);\n");
|
||||
sb.append("}\n");
|
||||
|
||||
// 旧浏览器降级:选区 + execCommand
|
||||
sb.append("function legacyRich(html,btn){\n");
|
||||
sb.append(" var ta=document.createElement('div');ta.innerHTML=html;ta.style.position='fixed';ta.style.left='-9999px';\n");
|
||||
sb.append(" document.body.appendChild(ta);var r=document.createRange();r.selectNode(ta);\n");
|
||||
sb.append(" var s=window.getSelection();s.removeAllRanges();s.addRange(r);\n");
|
||||
sb.append(" document.execCommand('copy');s.removeAllRanges();document.body.removeChild(ta);\n");
|
||||
sb.append(" markCopied(btn,'\\u2714 已复制');\n");
|
||||
sb.append("}\n");
|
||||
|
||||
// 复制为图片(PNG)。依赖 html2canvas;离线/不支持时降级为富文本
|
||||
sb.append("function copyImage(srcEl,btn){\n");
|
||||
sb.append(" var html=srcEl.classList.contains('api-card')?buildFacadeHtml(srcEl):buildMethodHtml(srcEl);\n");
|
||||
sb.append(" if(!window.html2canvas){\n");
|
||||
sb.append(" legacyRich(html,btn);markCopied(btn,'\\u26A0 离线·已复制富文本');return;\n");
|
||||
sb.append(" }\n");
|
||||
sb.append(" var clone=srcEl.cloneNode(true);\n");
|
||||
sb.append(" clone.querySelectorAll('.method-header.collapsed,.dto-block-title.collapsed').forEach(function(t){t.classList.remove('collapsed');});\n");
|
||||
sb.append(" clone.querySelectorAll('.field-row').forEach(function(r){r.style.display='';});\n");
|
||||
sb.append(" clone.querySelectorAll('.field-expand-toggle').forEach(function(t){t.classList.add('open');});\n");
|
||||
sb.append(" clone.querySelectorAll('.copy-btn,.api-copy-btn,.method-copy-btn').forEach(function(b){if(b.parentNode)b.parentNode.removeChild(b);});\n");
|
||||
sb.append(" clone.style.position='fixed';clone.style.left='-9999px';clone.style.top='0';clone.style.margin='0';clone.style.background='#fff';\n");
|
||||
sb.append(" document.body.appendChild(clone);\n");
|
||||
sb.append(" window.html2canvas(clone,{backgroundColor:'#ffffff',scale:2,logging:false}).then(function(canvas){\n");
|
||||
sb.append(" if(clone.parentNode)document.body.removeChild(clone);\n");
|
||||
sb.append(" canvas.toBlob(function(blob){\n");
|
||||
sb.append(" if(blob&&navigator.clipboard&&window.ClipboardItem){\n");
|
||||
sb.append(" navigator.clipboard.write([new ClipboardItem({'image/png':blob})]).then(function(){markCopied(btn,'\\u2714 已复制图片');}).catch(function(){markCopied(btn,'\\u26A0 图片复制失败');});\n");
|
||||
sb.append(" }else{markCopied(btn,'\\u26A0 浏览器不支持图片');}\n");
|
||||
sb.append(" });\n");
|
||||
sb.append(" }).catch(function(){\n");
|
||||
sb.append(" if(clone.parentNode)document.body.removeChild(clone);\n");
|
||||
sb.append(" legacyRich(html,btn);markCopied(btn,'\\u26A0 已复制富文本');\n");
|
||||
sb.append(" });\n");
|
||||
sb.append("}\n");
|
||||
sb.append("</script>\n");
|
||||
}
|
||||
|
||||
|
||||
@@ -68,3 +68,4 @@ D:/bestpay-srdcloud/ft-blockchain-prod=https://srd17321104074@code.srdcloud.cn/b
|
||||
D:/bestpay-srdcloud/ft-collateral-core=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/ft-collateral-core.git
|
||||
D:/bestpay-srdcloud/ft-commodity-core=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/ft-commodity-core.git
|
||||
D:/bestpay-srdcloud/ft-commonservice=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/ft-commonservice.git
|
||||
D:/bestpay-srdcloud/ft-deposit-core=https://srd17321104074@code.srdcloud.cn/bestpay-cf/cf/ft-deposit-core
|
||||
|
||||
Reference in New Issue
Block a user