马黑黑 发表于 2026-5-14 18:35

Squire 编辑器实现音视频的插入功能

<style>
        .artBox { font: normal 18px/1.5 sans-serif; overflow: auto; position: relative; }
        .artBox p { margin: 10px 0; }
        .artBox code, .artBox pre { background: #f7f4f3; padding: 2px 6px; tab-size: 4; }
        .artBox pre { padding: 10px 20px; white-space: pre-wrap; word-wrap: break-word; }
        .artBox pre code { padding: 0; background: none; }
        .artBox blockquote { margin: 10px 20px; padding: 2px 15px; border-left: 3px solid skyblue; background: #e7e5e3; }
</style>

<div class="artBox">
<p>开发一款符合现代浏览器标准所见即所得的Web在线编辑器是一件相当复杂、难度极大的工作,好在有各种库为我们提供便利,借助它们,在网页中嵌入自定义的WYSIWYG编辑器变得相对简单。众多此类JS库中,Squire值得关注。</p>
<p>Squire为处理邮件中的HTML而开发,它虽然亮丽,也因对标问题存在一定的局限性,例如插入 h1~h6 标题 API 都没有提供,处理音视频的 API 更没有。插入音视频是当代Web页的刚需,Squire 不提供相应的API,我们可以变通实现。</p>
<p><strong>首先</strong>需要让 Square 支持音视频所见即所得的渲染,唯一的途径是修改源码,让音视频进入“白名单”,否则即使插入成功,也不能在编辑器中呈现出效果来。打开下载的 Squire 源码,找到 <code>var allowedBlock = /.../</code> 的语句,这是一个正则表达式,我们只需在表达式的后面加入 <code>|VIDEO|AUDIO</code> 即可,改变后的语句如下:</p>
<pre><code>var allowedBlock = /^(?:A(?:DDRESS|RTICLE|SIDE|UDIO)|BLOCKQUOTE|CAPTION|D(?:|IV)|F(?:IGURE|IGCAPTION|OOTER)|H|HEADER|L(?:ABEL|EGEND|I)|O(?:L|UTPUT)|P(?:RE)?|SECTION|T(?:ABLE|BODY|D|FOOT|H|HEAD|R)|COL(?:GROUP)?|UL|VIDEO|AUDIO)$/;
</code></pre>
<p>保存后,音、视频将可以在编辑器中正常渲染。</p>
<p><strong>其次</strong>引入 Squire 库(假设修改后的源码已经上传到可用的空间):</p>
<pre><code>&lt;script src="https://638183.freep.cn/638183/web/js/squire.min.js"&gt;&lt;/script&gt;
</code></pre>
<p><strong>接着</strong>我们就可以编写插入音视频的相关代码了。下面是一个可插入音、视频到编辑器中的完整案例:</p>
<div class="codebox" data-prev="1">
&lt;style&gt;
        #edDiv { width: 1000px; height: 600px; border: 1px solid gray; overflow: auto; padding: 8px 16px; margin: 20px auto; }
        #toolbar { width: 1000px; margin: auto; }
&lt;/style&gt;

&lt;div id="edDiv"&gt;&lt;/div&gt;
&lt;div id="toolbar"&gt;
        &lt;button id="addAudio" type="button" value="audio"&gt;插入音频&lt;/button&gt;
        &lt;button id="addVideo" type="button" value="video"&gt;插入视频&lt;/button&gt;
&lt;/div&gt;

&lt;script src="https://638183.freep.cn/638183/web/js/squire.min.js"&gt;&lt;/script&gt;
&lt;script&gt;
        // 创建 Squire 实例并链式插入空行然后令编辑器获得焦点
        const editor = new Squire(document.querySelector('#edDiv'), {
                blockTag: 'p', // 使用p标签换行
        }).setHTML('&lt;p&gt;&lt;br&gt;&lt;/p&gt;').focus();
       
        // 插入音、视频按钮点击事件
        const btns = document.querySelectorAll('#toolbar &gt; button');

        btns.forEach(btn =&gt; {
                btn.onclick = () =&gt; {
                        editor.moveCursorToEnd(); // 移动输入光标至文档末尾
                        const src = prompt('请输入媒体地址:', ''); // 获取媒体地址
                        if (!src) return; // 点击了取消按钮
                        // 媒体配置
                        const opt = {
                                src: src.trim(),      // 地址(去除头尾空白)
                                controls: 'controls', // 控制界面
                                autoplay: 'autoplay', // 自动播放
                                loop: 'loop'          // 循环播放
                        };
                        editor.focus(); // 输入框回去的焦点
                        // 使用insertHTML API插入媒体标签
                        editor.insertHTML(createMediaCode(btn.value, opt));
                };
        });

        // 函数 : 创建媒体HTML代码
        function createMediaCode(name, params) {
                let attrStr = `&lt;${name}`; // 媒体标签
                // 遍历配置获取并设置媒体属性
                Object.entries(params).forEach(() =&gt; {
                        attrStr += ` ${k}="${v}"`;
            });
            attrStr += `&gt;&lt;/${name}&gt;`; // 媒体标签闭合
            return attrStr; // 返回结果
        }
&lt;/script&gt;
</div>
<p>以上案例,createMediaCode() 函数本质上与 Squire 无关,它只是根据传参创建媒体标签的HTML代码。核心在按钮的点击事件中,共两点:其一,使用 moveCursorToEnd API 处理待插入媒体的位置以防止前边的标签被覆盖,其二,使用 InsertHTML API 将 createMediaCode() 函数返回的结果(媒体标签代码)插入到当前输入光标所在处。</p>
<p>媒体标签可以插入,其它标签如果没有相应 API 或不合适使用的,也可以仿造本案例加以实现(我们自定义的函数 createMediaCode() 可以改个名称以便令其名副其实)。</p>
</div>

<script>
   function loadLineNumFile() {
       const script = document.createElement('script');
       script.charset = 'utf-8';
       script.src = 'https://638183.freep.cn/638183/web/helight/linenumber-2026.js';
       script.defer = true;
       script.onload = () => addLineNumber();
       document.head.appendChild(script);
   }

   loadLineNumFile();
</script>

红影 发表于 2026-5-14 19:12

我插入一个熊猫的视频,看着好小啊,不能放大么{:4_204:}

红影 发表于 2026-5-14 19:24

也试着插入一个音乐,都能完美实现。
媒体配置里的这个 src: src.trim(),      // 地址(去除头尾空白)倒是不知道呢,其他的知道点。{:4_187:}

红影 发表于 2026-5-14 19:26

“Squire为处理邮件中的HTML而开发,”现在被黑黑灵活运用,可以加入音频视频了,黑黑厉害{:4_199:}

马黑黑 发表于 2026-5-14 19:35

红影 发表于 2026-5-14 19:26
“Squire为处理邮件中的HTML而开发,”现在被黑黑灵活运用,可以加入音频视频了,黑黑厉害

这个不算啥,毕竟,它有 insertHTML API

马黑黑 发表于 2026-5-14 19:36

红影 发表于 2026-5-14 19:24
也试着插入一个音乐,都能完美实现。
媒体配置里的这个 src: src.trim(),      // 地址(去除头尾空白)倒 ...

JS 中,对字符串可以使用 trim() 方法剔除头尾空白

马黑黑 发表于 2026-5-14 19:38

红影 发表于 2026-5-14 19:12
我插入一个熊猫的视频,看着好小啊,不能放大么

理论上,这是视频的原始大小(所有的视频文件都有自己初设的尺寸)。一楼的案例作为演示,没有加入宽高设置

霜染枫丹 发表于 2026-5-14 21:44

看不懂,{:4_173:}看不懂是正常的,看懂我就成仙了,键盘支持!

红影 发表于 2026-5-14 21:50

马黑黑 发表于 2026-5-14 19:35
这个不算啥,毕竟,它有 insertHTML API

你看得懂觉得不算啥,我这玩意不懂的就觉得太厉害了{:4_187:}

红影 发表于 2026-5-14 21:51

马黑黑 发表于 2026-5-14 19:36
JS 中,对字符串可以使用 trim() 方法剔除头尾空白

这个之前一点不知道呢{:4_173:}

红影 发表于 2026-5-14 21:53

马黑黑 发表于 2026-5-14 19:38
理论上,这是视频的原始大小(所有的视频文件都有自己初设的尺寸)。一楼的案例作为演示,没有加入宽高设 ...

所以就自动显示原始尺寸了。

马黑黑 发表于 2026-5-14 22:20

红影 发表于 2026-5-14 21:53
所以就自动显示原始尺寸了。

是的。

另外,视频标签是行内标签,如果它之前有同一行的内容,其尺寸可能也会受到影响。一般来说,先打一个回车键再发布视频标签可能会好一些

马黑黑 发表于 2026-5-14 22:21

红影 发表于 2026-5-14 21:51
这个之前一点不知道呢

没有系统学习过一般都不知道的

马黑黑 发表于 2026-5-14 22:21

红影 发表于 2026-5-14 21:50
你看得懂觉得不算啥,我这玩意不懂的就觉得太厉害了

入门了就不会酱紫

马黑黑 发表于 2026-5-14 22:22

霜染枫丹 发表于 2026-5-14 21:44
看不懂,看不懂是正常的,看懂我就成仙了,键盘支持!

感谢支持

小辣椒 发表于 2026-5-14 22:37

感谢黑黑分享{:4_171:}

马黑黑 发表于 2026-5-15 18:33

小辣椒 发表于 2026-5-14 22:37
感谢黑黑分享

阔气阔气

红影 发表于 2026-5-15 22:44

马黑黑 发表于 2026-5-14 22:20
是的。

另外,视频标签是行内标签,如果它之前有同一行的内容,其尺寸可能也会受到影响。一般来说,先 ...

嗯嗯,可能就会大一点了。

红影 发表于 2026-5-15 22:45

马黑黑 发表于 2026-5-14 22:21
没有系统学习过一般都不知道的

只在这里跟着黑黑学了{:4_173:}

红影 发表于 2026-5-15 22:45

马黑黑 发表于 2026-5-14 22:21
入门了就不会酱紫

入门还早呢{:4_173:}
页: [1] 2
查看完整版本: Squire 编辑器实现音视频的插入功能