怎么快速插入音频,并设置锚文本点击即播放?

本贴最后更新于 416 天前,其中的信息可能已经天翻地覆

在学外语,做笔记梳理时,想给句子加上音频,已经有句子文本和音频文件名的对应文本,怎么能快速将句子设置为音频的锚文本,并点击锚文本即播放呢?

直接插入音频后,会直接显示音频控件,占据的位置太大了,而且也没找到在哪里设置锚文本。

通过超链接设置句子为锚文本后,点击文本会在另一个标签弹出音频控件,然后再点击才能播放,而且要一句一句去设置填写,也比较麻烦。

想问问有没有能直接通过某种格式把我的句子和音频直接转换成点击即播放的形式吗?

Screenshot20241101162557org.b3log.siyuan.jpg

  • 思源笔记

    思源笔记是一款隐私优先的个人知识管理系统,支持完全离线使用,同时也支持端到端加密同步。

    融合块、大纲和双向链接,重构你的思维。

    28448 引用 • 119792 回帖
  • Q&A

    提问之前请先看《提问的智慧》,好的问题比好的答案更有价值。

    11156 引用 • 50667 回帖 • 52 关注

相关帖子

被采纳的回答
  • 方法一,使用 HTML 块实现(编辑器输入 /html,把代码粘贴到对话框即可)

    需要开启 设置 》编辑器 》允许执行 HTML 块内脚本

    <!-- mp3 列表 -->
    <a onclick="playAudio(event,this.href);" href="file:///youpath/demo1.mp3" >demo1</a><br>
    <a onclick="playAudio(event,this.href);" href="file:///youpath/demo2.mp3">demo2</a><br>
    
    <!-- js 代码 -->
    <script>
        var audio;
        function playAudio(event,mp3) {
            event.preventDefault();
            if(!audio){
                audio = document.createElement('audio');
                document.body.appendChild(audio);
            }
            audio.src = mp3;
            audio.play();
        }
    </script>
    

    方法二,使用 SQL 查询块实现(编辑器输入 {{}},把代码粘贴到对话框即可)

    //!js
    return (async () => {
        // 这里配置mp3列表
        const mp3List = {
            "demo1": "file:///youpath/demo1.mp3",
            "demo2": "file:///youpath/demo2.mp3",
        };
    
        // 代码逻辑区
        let list = [];
        for (let key in mp3List) {
            list.push(`<div><span data-type="a" data-mp3="${mp3List[key]}">${key}</span></div>`);
        }
        return render(`<div class="mp3List-wrapper">${list.join('')}</div>`, (embed) => {
            embed.querySelector('.mp3List-wrapper').addEventListener('click', (event) => {
                const mp3 = event.target?.dataset?.mp3;
                if (mp3) {
                    playAudio(mp3);
                }
            });
        });
        var audio;
        function playAudio(mp3) {
            if(!audio){
                audio = document.createElement('audio');
                document.body.appendChild(audio);
            }
            audio.src = mp3;
            audio.play();
        }
        function render(html, callback) {
            onRender('.b3-form__space--small').then((container) => {
                const wysiwygEmbed = container.parentElement;
                wysiwygEmbed.style.backgroundColor = 'transparent';
                wysiwygEmbed.style.borderLeft='none';
                container.outerHTML = html;
                if(callback) callback(wysiwygEmbed);
            });
            return [];
        }
        function onRender(selector) {
            return new Promise(resolve => {
                const check = () => {
                    let el = item.querySelector(selector);
                    if (el) resolve(el); else requestAnimationFrame(check);
                };
                check();
            });
        }
    })();
    

    效果

    image.png

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • 方法一,使用 HTML 块实现(编辑器输入 /html,把代码粘贴到对话框即可)

    需要开启 设置 》编辑器 》允许执行 HTML 块内脚本

    <!-- mp3 列表 -->
    <a onclick="playAudio(event,this.href);" href="file:///youpath/demo1.mp3" >demo1</a><br>
    <a onclick="playAudio(event,this.href);" href="file:///youpath/demo2.mp3">demo2</a><br>
    
    <!-- js 代码 -->
    <script>
        var audio;
        function playAudio(event,mp3) {
            event.preventDefault();
            if(!audio){
                audio = document.createElement('audio');
                document.body.appendChild(audio);
            }
            audio.src = mp3;
            audio.play();
        }
    </script>
    

    方法二,使用 SQL 查询块实现(编辑器输入 {{}},把代码粘贴到对话框即可)

    //!js
    return (async () => {
        // 这里配置mp3列表
        const mp3List = {
            "demo1": "file:///youpath/demo1.mp3",
            "demo2": "file:///youpath/demo2.mp3",
        };
    
        // 代码逻辑区
        let list = [];
        for (let key in mp3List) {
            list.push(`<div><span data-type="a" data-mp3="${mp3List[key]}">${key}</span></div>`);
        }
        return render(`<div class="mp3List-wrapper">${list.join('')}</div>`, (embed) => {
            embed.querySelector('.mp3List-wrapper').addEventListener('click', (event) => {
                const mp3 = event.target?.dataset?.mp3;
                if (mp3) {
                    playAudio(mp3);
                }
            });
        });
        var audio;
        function playAudio(mp3) {
            if(!audio){
                audio = document.createElement('audio');
                document.body.appendChild(audio);
            }
            audio.src = mp3;
            audio.play();
        }
        function render(html, callback) {
            onRender('.b3-form__space--small').then((container) => {
                const wysiwygEmbed = container.parentElement;
                wysiwygEmbed.style.backgroundColor = 'transparent';
                wysiwygEmbed.style.borderLeft='none';
                container.outerHTML = html;
                if(callback) callback(wysiwygEmbed);
            });
            return [];
        }
        function onRender(selector) {
            return new Promise(resolve => {
                const check = () => {
                    let el = item.querySelector(selector);
                    if (el) resolve(el); else requestAnimationFrame(check);
                };
                check();
            });
        }
    })();
    

    效果

    image.png

    2 回复
  • 其他回帖
  • 你的理解没错,思源的 HTML 没有其他笔记的那么直观,虽然思源不支持手动输入 HTML 代码,但粘贴 HTML 代码是可以的,所以建议你在外部编辑好后直接粘贴到文档里。

    但要注意思源的 HTML 代码必须以一个 div 标签包裹才行,比如

    <div>
    <p>hello world</p>
    <p>hello world</p>
    </div>
    

    这样粘贴就没问题,不会转换为实体

    但下面这种粘贴就会转换为 HTML 实体

    <p>hello world</p>
    <p>hello world</p>
    
    或
    
    <ul>
    <li>hello world</li>
    <li>hello world</li>
    </ul>
    

    解决办法就是在他们前面添加 div 包裹就没问题了,比如改成

    <div>
    <p>hello world</p>
    <p>hello world</p>
    </div>
    
    或
    
    <div>
    <ul>
    <li>hello world</li>
    <li>hello world</li>
    </ul>
    </div>
    

    有了上面的知识,那么批量修改你的代码就很方便了,比如修改成下面这样,然后再粘贴

    <div>
    <div>英语学习</div>
    <script>
        var audio;
        function playAudio(event,mp3) {
            event.preventDefault();
            if(!audio){
                audio = document.createElement('audio');
                document.body.appendChild(audio);
            }
            audio.src = mp3;
            audio.play();
        }
    </script>
    </div>
    
    描述1
    <div><a onclick="playAudio(event,this.href);" href="file:///yourpath/demo1.mp3" >demo1</a></div>
    
    描述2
    <div><a onclick="playAudio(event,this.href);" href="file:///yourpath/demo2.mp3" >demo2</a></div>
    
    

    这里的 <script> 标签页可以放到任意一个链接的 HTML 代码块中,这样就不用单独的占一个块了。

    如果你的版本不支持,也可以安装 vscode 插件,然后使用源码粘贴。

    当然,还有好的方法,比如通过插件或 js 片段魔改 audio 块等,太过复杂,仅供兴趣研究。

    1 回复
  • towfd

    太感谢你了,彻底解决了我的问题。

  • towfd

    感谢 🙏

  • 查看全部回帖

推荐标签 标签

  • 分享

    有什么新发现就分享给大家吧!

    251 引用 • 1801 回帖 • 1 关注
  • Linux

    Linux 是一套免费使用和自由传播的类 Unix 操作系统,是一个基于 POSIX 和 Unix 的多用户、多任务、支持多线程和多 CPU 的操作系统。它能运行主要的 Unix 工具软件、应用程序和网络协议,并支持 32 位和 64 位硬件。Linux 继承了 Unix 以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。

    960 引用 • 946 回帖
  • 996
    13 引用 • 200 回帖 • 7 关注
  • Firefox

    Mozilla Firefox 中文俗称“火狐”(正式缩写为 Fx 或 fx,非正式缩写为 FF),是一个开源的网页浏览器,使用 Gecko 排版引擎,支持多种操作系统,如 Windows、OSX 及 Linux 等。

    7 引用 • 30 回帖 • 367 关注
  • SSL

    SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS 与 SSL 在传输层对网络连接进行加密。

    70 引用 • 193 回帖 • 405 关注
  • Gzip

    gzip (GNU zip)是 GNU 自由软件的文件压缩程序。我们在 Linux 中经常会用到后缀为 .gz 的文件,它们就是 Gzip 格式的。现今已经成为互联网上使用非常普遍的一种数据压缩格式,或者说一种文件格式。

    9 引用 • 12 回帖 • 203 关注
  • 叶归
    25 引用 • 100 回帖 • 37 关注
  • Visio
    1 引用 • 2 回帖 • 1 关注
  • sts
    2 引用 • 2 回帖 • 260 关注
  • Chrome

    Chrome 又称 Google 浏览器,是一个由谷歌公司开发的网页浏览器。该浏览器是基于其他开源软件所编写,包括 WebKit,目标是提升稳定性、速度和安全性,并创造出简单且有效率的使用者界面。

    63 引用 • 289 回帖 • 1 关注
  • FreeMarker

    FreeMarker 是一款好用且功能强大的 Java 模版引擎。

    23 引用 • 20 回帖 • 475 关注
  • SendCloud

    SendCloud 由搜狐武汉研发中心孵化的项目,是致力于为开发者提供高质量的触发邮件服务的云端邮件发送平台,为开发者提供便利的 API 接口来调用服务,让邮件准确迅速到达用户收件箱并获得强大的追踪数据。

    2 引用 • 8 回帖 • 545 关注
  • Rust

    Rust 是一门赋予每个人构建可靠且高效软件能力的语言。Rust 由 Mozilla 开发,最早发布于 2014 年 9 月。

    60 引用 • 22 回帖
  • 锤子科技

    锤子科技(Smartisan)成立于 2012 年 5 月,是一家制造移动互联网终端设备的公司,公司的使命是用完美主义的工匠精神,打造用户体验一流的数码消费类产品(智能手机为主),改善人们的生活质量。

    4 引用 • 31 回帖 • 3 关注
  • API

    应用程序编程接口(Application Programming Interface)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。

    79 引用 • 431 回帖 • 1 关注
  • 持续集成

    持续集成(Continuous Integration)是一种软件开发实践,即团队开发成员经常集成他们的工作,通过每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现集成错误。

    15 引用 • 7 回帖
  • 星云链

    星云链是一个开源公链,业内简单的将其称为区块链上的谷歌。其实它不仅仅是区块链搜索引擎,一个公链的所有功能,它基本都有,比如你可以用它来开发部署你的去中心化的 APP,你可以在上面编写智能合约,发送交易等等。3 分钟快速接入星云链 (NAS) 测试网

    3 引用 • 16 回帖
  • 程序员

    程序员是从事程序开发、程序维护的专业人员。

    599 引用 • 3541 回帖
  • 大数据

    大数据(big data)是指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合,是需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产。

    91 引用 • 113 回帖
  • RESTful

    一种软件架构设计风格而不是标准,提供了一组设计原则和约束条件,主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。

    30 引用 • 114 回帖 • 9 关注
  • 阿里巴巴

    阿里巴巴网络技术有限公司(简称:阿里巴巴集团)是以曾担任英语教师的马云为首的 18 人,于 1999 年在中国杭州创立,他们相信互联网能够创造公平的竞争环境,让小企业通过创新与科技扩展业务,并在参与国内或全球市场竞争时处于更有利的位置。

    43 引用 • 221 回帖 • 11 关注
  • SEO

    发布对别人有帮助的原创内容是最好的 SEO 方式。

    36 引用 • 200 回帖 • 54 关注
  • Kubernetes

    Kubernetes 是 Google 开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。

    119 引用 • 54 回帖
  • 尊园地产

    昆明尊园房地产经纪有限公司,即:Kunming Zunyuan Property Agency Company Limited(简称“尊园地产”)于 2007 年 6 月开始筹备,2007 年 8 月 18 日正式成立,注册资本 200 万元,公司性质为股份经纪有限公司,主营业务为:代租、代售、代办产权过户、办理银行按揭、担保、抵押、评估等。

    1 引用 • 22 回帖 • 838 关注
  • 阿里云

    阿里云是阿里巴巴集团旗下公司,是全球领先的云计算及人工智能科技公司。提供云服务器、云数据库、云安全等云计算服务,以及大数据、人工智能服务、精准定制基于场景的行业解决方案。

    85 引用 • 324 回帖
  • Sublime

    Sublime Text 是一款可以用来写代码、写文章的文本编辑器。支持代码高亮、自动完成,还支持通过插件进行扩展。

    10 引用 • 5 回帖 • 1 关注
  • SpaceVim

    SpaceVim 是一个社区驱动的模块化 vim/neovim 配置集合,以模块的方式组织管理插件以
    及相关配置,为不同的语言开发量身定制了相关的开发模块,该模块提供代码自动补全,
    语法检查、格式化、调试、REPL 等特性。用户仅需载入相关语言的模块即可得到一个开箱
    即用的 Vim-IDE。

    3 引用 • 31 回帖 • 121 关注