您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Adds a button to copy tables to the clipboard in HTML format for pasting into Word with full borders.
// ==UserScript== // @name Copy table // @namespace http://tampermonkey.net/ // @version 1.0 // @description Adds a button to copy tables to the clipboard in HTML format for pasting into Word with full borders. // @author Bui Quoc Dung // @match *://*/* // @grant GM_addStyle // ==/UserScript== (function() { 'use strict'; // Add some CSS for the copy button GM_addStyle(` .copy-table-btn { margin-top: 5px; padding: 5px 10px; font-size: 13px; background: #333333; color: white; border: none; border-radius: 3px; cursor: pointer; } `); // Function to add the "Copy to Word" button below a table element function addCopyButtonToTable(table) { // Avoid adding duplicate buttons if (table.nextElementSibling && table.nextElementSibling.classList.contains('copy-table-btn')) { return; } // Ensure all table cells have borders table.style.borderCollapse = 'collapse'; table.querySelectorAll('th, td').forEach(cell => { cell.style.border = '1px solid black'; cell.style.padding = '4px'; }); // Create the button element const btn = document.createElement('button'); btn.textContent = 'Copy'; btn.className = 'copy-table-btn'; btn.addEventListener('click', function(e) { e.stopPropagation(); e.preventDefault(); copyTableToClipboard(table); }); // Insert button after the table table.parentElement.insertBefore(btn, table.nextSibling); } // Function that copies the table's HTML to the clipboard function copyTableToClipboard(table) { const html = table.outerHTML; // Try using the Clipboard API with HTML support if (navigator.clipboard && navigator.clipboard.write) { const type = "text/html"; const blob = new Blob([html], { type: type }); const data = [new ClipboardItem({ [type]: blob })]; navigator.clipboard.write(data).catch(err => { console.error('Error copying table: ', err); fallbackCopy(html); }); } else { fallbackCopy(html); } } // Fallback copy function using a temporary element and execCommand function fallbackCopy(html) { const tempDiv = document.createElement('div'); tempDiv.style.position = 'absolute'; tempDiv.style.left = '-9999px'; tempDiv.innerHTML = html; document.body.appendChild(tempDiv); const range = document.createRange(); range.selectNodeContents(tempDiv); const sel = window.getSelection(); sel.removeAllRanges(); sel.addRange(range); try { document.execCommand('copy'); } catch (err) { console.error('Fallback: Unable to copy', err); } sel.removeAllRanges(); document.body.removeChild(tempDiv); } // Observe the document for new tables (for dynamically loaded content) const observer = new MutationObserver(mutations => { mutations.forEach(mutation => { mutation.addedNodes.forEach(node => { if (node.nodeType === 1) { // ELEMENT_NODE if (node.tagName === 'TABLE') { addCopyButtonToTable(node); } else { const tables = node.querySelectorAll('table'); tables.forEach(addCopyButtonToTable); } } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); // Initially add buttons to any tables already on the page document.querySelectorAll('table').forEach(addCopyButtonToTable); })();