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

如何克隆Trix编辑器默认链接按钮实现YouTube视频嵌入?

给Trix编辑器添加YouTube视频嵌入按钮

1. 添加自定义工具栏按钮

先在Trix的工具栏中插入YouTube嵌入按钮,并绑定点击事件触发输入模态框:

// 监听Trix初始化事件
document.addEventListener("trix-initialize", function(event) {
  const toolbarElement = event.target.toolbarElement;
  // 构建YouTube按钮的HTML结构
  const youtubeButtonHTML = `
    <button type="button" class="trix-button" data-trix-action="insert-youtube" title="插入YouTube视频">
      YouTube
    </button>
  `;
  // 将按钮插入到链接按钮所在的工具栏组中
  toolbarElement.querySelector(".trix-button-group--links").insertAdjacentHTML("beforeend", youtubeButtonHTML);

  // 给按钮绑定点击事件
  toolbarElement.querySelector('[data-trix-action="insert-youtube"]').addEventListener("click", openYoutubeModal);
});

2. 创建输入模态框

模仿Trix默认链接模态框的交互逻辑,创建一个用于输入YouTube链接的模态框:

<!-- 模态框容器,可放在页面任意位置 -->
<div id="youtube-modal" style="display: none; position: fixed; top: 50%; left: 50%; transform: translate(-50%, -50%); padding: 20px; background: white; border-radius: 4px; box-shadow: 0 0 10px rgba(0,0,0,0.2); z-index: 1000;">
  <label>YouTube视频链接</label>
  <input type="text" id="youtube-url" placeholder="输入YouTube视频链接">
  <div style="margin-top: 10px;">
    <button id="confirm-youtube">插入</button>
    <button id="cancel-youtube">取消</button>
  </div>
</div>
<!-- 模态框遮罩层 -->
<div id="youtube-modal-overlay" style="display: none; position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: rgba(0,0,0,0.5); z-index: 999;"></div>

然后编写模态框的显示/隐藏逻辑:

function openYoutubeModal() {
  document.getElementById("youtube-modal").style.display = "block";
  document.getElementById("youtube-modal-overlay").style.display = "block";
  document.getElementById("youtube-url").focus();
  
  // 绑定确认、取消按钮的事件
  document.getElementById("confirm-youtube").addEventListener("click", insertYoutubeEmbed);
  document.getElementById("cancel-youtube").addEventListener("click", closeYoutubeModal);
}

function closeYoutubeModal() {
  document.getElementById("youtube-modal").style.display = "none";
  document.getElementById("youtube-modal-overlay").style.display = "none";
  // 清空输入框内容
  document.getElementById("youtube-url").value = "";
}

3. 实现链接验证与嵌入逻辑

验证输入的YouTube链接格式,插入带自定义属性的不可编辑内容:

function insertYoutubeEmbed() {
  const urlInput = document.getElementById("youtube-url");
  const youtubeUrl = urlInput.value.trim();
  
  // 简单验证YouTube链接格式
  const youtubeRegex = /^(https?:\/\/)?(www\.)?(youtube\.com|youtu\.be)\/.+$/;
  if (!youtubeRegex.test(youtubeUrl)) {
    alert("请输入有效的YouTube链接");
    return;
  }

  // 获取当前Trix编辑器实例
  const editor = document.querySelector("trix-editor").editor;
  
  // 创建带自定义属性的元素,标记YouTube链接
  const youtubeElement = document.createElement("span");
  youtubeElement.setAttribute("data-youtube", youtubeUrl);
  youtubeElement.textContent = `YouTube视频:${youtubeUrl.split("/").pop()}`;
  // 设置为不可编辑
  youtubeElement.setAttribute("contenteditable", "false");
  // 可自定义样式,匹配Trix默认链接风格
  youtubeElement.style.color = "#0066cc";
  youtubeElement.style.cursor = "pointer";

  // 将元素插入编辑器
  editor.insertHTML(youtubeElement.outerHTML);
  
  // 关闭模态框
  closeYoutubeModal();
}

4. 移除默认取消链接按钮(可选)

如果不需要取消链接功能,可在初始化时移除对应按钮:

document.addEventListener("trix-initialize", function(event) {
  const toolbarElement = event.target.toolbarElement;
  const unlinkButton = toolbarElement.querySelector('[data-trix-action="removeLink"]');
  if (unlinkButton) unlinkButton.remove();
});

补充说明

如果需要在前端渲染YouTube视频,可以监听Trix的trix-change事件,读取元素的data-youtube属性,将其替换为<iframe>标签实现视频播放。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 13:50:03