You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Summernote自定义插件中实现选中图片复制到剪贴板功能

Summernote选中图片复制到剪贴板实现方案

你现有的自定义插件已经正确拿到了当前选中的图片对象,只需要补充图片转二进制、写入系统剪贴板的逻辑即可,修改后的完整插件代码如下:

$.extend($.summernote.plugins, {
    'imageCopy': function (context) {
        var self = this;
        var ui = $.summernote.ui,
        $editable = context.layoutInfo.editable,
        options = context.options,
        $editor = context.layoutInfo.editor,
        lang = options.langInfo,
        $note = context.layoutInfo.note;

        context.memo('button.imageCopy', function () {
            var button = ui.button({
                contents: options.imageCopy.icon,
                container: false,
                tooltip: lang.imageCopy.tooltip,
                click: async function () {
                    const $targetImg = $($editable.data('target'));
                    // 校验选中元素是否为图片
                    if ($targetImg[0]?.nodeName !== 'IMG') return;
                    try {
                        // 加载原图资源
                        const img = new Image();
                        img.crossOrigin = 'anonymous';
                        img.src = $targetImg.attr('src');
                        await new Promise((resolve, reject) => {
                            img.onload = resolve;
                            img.onerror = reject;
                        });
                        // 绘制图片到canvas
                        const canvas = document.createElement('canvas');
                        canvas.width = img.naturalWidth;
                        canvas.height = img.naturalHeight;
                        const ctx = canvas.getContext('2d');
                        ctx.drawImage(img, 0, 0);
                        // canvas转png格式Blob
                        const imgBlob = await new Promise((resolve) => canvas.toBlob(resolve, 'image/png'));
                        // 写入系统剪贴板
                        await navigator.clipboard.write([
                            new ClipboardItem({
                                [imgBlob.type]: imgBlob
                            })
                        ]);
                        // 成功提示(可选)
                        context.invoke('editor.createTooltip', lang.imageCopy.success || '图片已复制', 'success');
                        setTimeout(() => context.invoke('editor.hideTooltip'), 2000);
                    } catch (err) {
                        console.error('复制失败:', err);
                        // 失败提示(可选)
                        context.invoke('editor.createTooltip', lang.imageCopy.error || '复制失败,请检查图片权限', 'error');
                        setTimeout(() => context.invoke('editor.hideTooltip'), 2000);
                    }
                }
            });
            return button.render();
        });
    }
});

必要配置与注意事项

  • 初始化Summernote时需要将自定义按钮加入图片弹出层配置:
$('.summernote').summernote({
    // 其他原有配置
    popover: {
        image: [
            ['image', ['resizeFull', 'resizeHalf', 'resizeQuarter', 'resizeNone']],
            ['float', ['floatLeft', 'floatRight', 'floatNone']],
            ['remove', ['removeMedia']],
            ['custom', ['imageCopy']] // 新增自定义复制按钮
        ]
    },
    // 自定义按钮图标配置,可根据使用的图标库修改
    imageCopy: {
        icon: '<i class="fa fa-copy"></i>'
    },
    // 中文提示配置
    lang: 'zh-CN',
    langInfo: {
        zhCN: {
            imageCopy: {
                tooltip: '复制图片',
                success: '图片已复制到剪贴板',
                error: '图片复制失败'
            }
        }
    }
});
  • 浏览器兼容性:该方案依赖Clipboard API,支持Chrome 66+、Firefox 63+、Safari 13.1+版本,老旧浏览器无法使用
  • 跨域资源要求:如果要复制的图片存储在第三方域名,需要对应资源服务器配置CORS允许当前站点访问,否则canvas绘制会触发跨域污染报错
  • 运行环境要求:Clipboard API仅在HTTPS域名、localhost本地开发环境下可用,HTTP公网环境无法调用

内容的提问来源于stack exchange,提问作者user754730

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 08:06:03