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

如何在Summernote富文本编辑器中集成Roxy Fileman图片管理器?

如何在Summernote富文本编辑器中集成Roxy Fileman图片管理器?

看起来你已经走对了方向——自定义按钮的思路完全没问题,只是在弹窗调用和回调逻辑上需要调整下。Summernote确实没有专门的自定义弹窗API,但我们可以用原生弹窗或者模态框来加载Roxy Fileman,再通过回调把选中的图片插入到编辑器里。下面给你具体的实现步骤:

第一步:完善自定义按钮的点击逻辑

先把你写的按钮代码调整得更清晰,直接关联弹窗打开函数:

// 自定义Roxy Fileman按钮
var RoxyButton = function (context) {
  var ui = $.summernote.ui;

  // 创建按钮
  var button = ui.button({
    contents: '<i class="fa fa-child"></i>',
    tooltip: '插入图片',
    click: function() {
      // 点击按钮时打开Roxy Fileman弹窗,传入当前编辑器上下文
      openRoxyFileman(context);
    }
  });

  return button.render(); // 返回按钮的jQuery对象
}

第二步:实现弹窗打开与图片插入回调

这里提供两种常用的方案,你可以根据项目情况选择:

方案1:使用原生弹窗(简单直接)

这种方式不需要额外依赖,直接用window.open打开Roxy Fileman,通过全局回调函数接收图片URL:

function openRoxyFileman(context) {
  // 定义全局回调函数,Roxy Fileman选择图片后会调用它
  window.insertImageFromRoxy = function(imageUrl) {
    // 调用Summernote的API插入图片到编辑器
    context.invoke('editor.insertImage', imageUrl);
    // 关闭弹窗
    roxyWindow.close();
    // 清理全局函数(可选)
    delete window.insertImageFromRoxy;
  };

  // 拼接Roxy Fileman的访问地址,指定回调函数和图片类型
  var roxyFilemanUrl = '@Url.Content("~/lib/Roxy_Fileman/index.html")?type=image&func=insertImageFromRoxy';
  // 打开弹窗
  var roxyWindow = window.open(roxyFilemanUrl, 'RoxyFileman', 'width=850,height=650,scrollbars=yes');
}

方案2:嵌入到Bootstrap模态框(风格统一)

如果你的项目用了Bootstrap,可以把Roxy Fileman放到模态框里,通过postMessage传递图片URL(更优雅,避免全局函数):

function openRoxyFileman(context) {
  // 创建Bootstrap模态框的HTML
  var modalHtml = `
    <div class="modal fade" id="roxyImageModal" tabindex="-1" role="dialog" aria-hidden="true">
      <div class="modal-dialog modal-lg">
        <div class="modal-content">
          <div class="modal-header">
            <h5 class="modal-title">选择图片</h5>
            <button type="button" class="close" data-dismiss="modal" aria-label="Close">
              <span aria-hidden="true">&times;</span>
            </button>
          </div>
          <div class="modal-body p-0">
            <iframe src="@Url.Content("~/lib/Roxy_Fileman/index.html")?type=image" frameborder="0" width="100%" height="550"></iframe>
          </div>
        </div>
      </div>
    </div>
  `;
  // 添加模态框到页面
  $('body').append(modalHtml);

  // 监听iframe发送的消息
  window.addEventListener('message', function(event) {
    // 验证消息来源(可选,增强安全性)
    if (event.origin !== window.location.origin) return;
    
    // 接收Roxy Fileman传来的图片URL
    if (event.data?.type === 'roxyImageSelected') {
      context.invoke('editor.insertImage', event.data.url);
      // 关闭并移除模态框
      $('#roxyImageModal').modal('hide');
      $('#roxyImageModal').remove();
    }
  });

  // 显示模态框
  $('#roxyImageModal').modal('show');
}

⚠️ 用这个方案需要先在Roxy Fileman的conf.json里开启postMessage支持,添加配置:"postMessage": true

第三步:保持Summernote的配置不变

你原来的toolbar和buttons配置是正确的,直接保留即可:

toolbar: [
  ['mybutton', ['roxy']],
],
buttons: {
    roxy: RoxyButton
},

关键注意点

  • 确保@Url.Content("~/lib/Roxy_Fileman/index.html")生成的路径是正确的,能正常访问到Roxy Fileman的页面
  • 如果用方案1,全局回调函数要确保在Roxy Fileman的页面能访问到(不要放在局部作用域里)
  • 测试时注意跨域问题,如果Roxy Fileman和你的项目不在同一域名下,需要额外配置跨域许可

备注:内容来源于stack exchange,提问作者DmitriyKulagin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 17:04:29