音频端播放新文件

2024-05-03

我有一个webapp https://radio.repjesus.com当您使用 ajax/jquery 单击链接时加载并播放音轨。一切正常,但当曲目结束时,曲目将设置为循环,并且这种情况可以永远持续下去。我希望播放器从数据库中自动加载随机曲目并在一首曲目结束时播放。音频是这样设置的。

<div id="player"><audio title="Audio title" controls loop autoplay controlsList="nodownload" preload="auto" id="myAudio" /><source src="audio.mp3" type="audio/mp3" id="audioID"></div>

当您单击它时,我使用 jquery 将新曲目加载到 #player div 中。例如;

<a href="javascript:;" onClick="loadurl('player.php?play=audioID','player')">Track One</a>

<script type="text/javascript">

<!-- ajaxified -->
function loadurl(dest, targetID) {
    
var XMLHttpRequestObject = false; 
    if (window.XMLHttpRequest) { 
            XMLHttpRequestObject = new XMLHttpRequest(); 
        } else if (window.ActiveXObject) { 
            XMLHttpRequestObject = new 
            ActiveXObject("Microsoft.XMLHttp"); 
    } 

if(XMLHttpRequestObject) { 
            XMLHttpRequestObject.open("GET", dest); 
            XMLHttpRequestObject.onreadystatechange = function() { 
            
        if (XMLHttpRequestObject.readyState == 4 && 
            XMLHttpRequestObject.status == 200) { 
            document.getElementById(targetID).innerHTML = 
            XMLHttpRequestObject.responseText; 
            delete XMLHttpRequestObject; 
            XMLHttpRequestObject = null; 
            } 
        } 
        XMLHttpRequestObject.send(null); 
    } 
} 

</script>

在我的player.php 文件中,我有;

<?php  
.... fetch track from db where id = $_GET['play']; ......
?>

<audio title="Audio Title" controls loop autoplay controlsList="nodownload" preload="auto" id="myAudio" /> 
<source src="audio2.mp3" type="audio/mp3" id="audioID">

我已经尝试了这里和网上的一些建议,例如添加;

<script type="text/javascript">

const audio = document.querySelector('myAudio');

audio.onended = (event) => {
  console.log('Video stopped either because 1) it was over, ' +
      'or 2) no further data is available.');
};

</script>

和这个...

<script type="text/javascript">
const audio = document.querySelector('myAudio');

audio.addEventListener('ended', (event) => {
  console.log('Video stopped either because 1) it was over, ' +
      'or 2) no further data is available.');
});

</script>

和这个...

<script type="text/javascript">
myAudio.addEventListener("ended", function(){
     myAudio.currentTime = 0;
     console.log("ended");
     alert("ended");
});

</script>

但它们都不起作用。我究竟做错了什么?

UPDATE

感谢 @Roko C. Buljan 的贡献,我能够使用以下脚本将新曲目加载到 div#player 中。当曲目结束时,使用 ajax 函数 loadurl 模拟单击​​,并将新曲目加载到 #player 中。这会加载一个新曲目,但当该曲目结束时,它不会加载另一个曲目。我该如何解决这个问题?

<a href="javascript:;" id="randomplay" onClick="loadurl('player.php?random=1','player')"></a>
<script type="text/javascript">

const audio = document.querySelector('#myAudio');

audio.addEventListener("ended", () => {

        $("#randomplay").click();

    }); 

</script>

Tl;Dr: Use: audio.addEventListener("ended", playNextFn);

有两种可能:

1. 如果客户端没有完整的曲目列表:

在您的服务器上创建一条路由,该路由可以使用随机轨道进行响应,并通过 AJAX 将其以 JSON 形式发送回客户端{"src": "bazzz.mp3", "name": "", "group": "", "year": "", "cover": ""}.

const audio = new Audio(); // or: document.querySelector('#myAudio');

const playRandomFile = () => {
  fetch("/api/getRandomSong.php").then(res => res.json).then(data => {
    audio.src = data.src;
    audio.play();
  });
};

audio.addEventListener("ended", playRandomFile); // ♫♪♫...♪♫♪♫♪...♫♪!

希望您知道如何编写从数据库中获取随机条目的 PHP 代码songs表并将其作为 JSON 返回。

2. 如果客户预先知道所有曲目:

使用JS切换到随机曲目"ended" Event.

const songs = [
  {src: "xyz.mp3", name: "", group: "", year:"", cover: ""},
  {src: "foo.mp3", name: "", group: "", year:"", cover: ""},
  {src: "bar.mp3", name: "", group: "", year:"", cover: ""},
];

const audio = new Audio(); // or: document.querySelector('#myAudio');

const playRandomFile = () => {
  audio.src = songs[~~(Math.random() * songs.length)].src;
  audio.play();
};

audio.addEventListener("ended", playRandomFile); // ♫♪♫...♪♫♪♫♪...♫♪!

每日提示:您可以直接在 JS 中生成 HTMLsongs array.

完整示例

包含 Wikimedia 音频文件和 HTML<audio>元素:

const songs = [
  {src: "https://upload.wikimedia.org/wikipedia/en/4/45/ACDC_-_Back_In_Black-sample.ogg", name: "", group: "", year:"", cover: ""},
  {src: "https://upload.wikimedia.org/wikipedia/en/3/39/Metallica_-_Enter_Sandman.ogg", name: "", group: "", year:"", cover: ""},
  {src: "https://upload.wikimedia.org/wikipedia/en/5/5e/U2_One.ogg", name: "", group: "", year:"", cover: ""},
];

const audio = document.querySelector('#myAudio');
const getRandomSong = () => songs[~~(Math.random() * songs.length)];

audio.addEventListener("ended", () => {
  audio.src = getRandomSong().src
  audio.play()
}); 

audio.src = getRandomSong().src // on DOM ready
<audio id="myAudio" controls></audio>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

音频端播放新文件 的相关文章

  • 如何循环遍历对象数组并生成键值对?

    我有一个像这样的对象数组 let someObj items id 12 value true id 34 value true id 56 value false 我想将其添加到现有对象中 其中 id 是该对象的键 如下所示 let ob
  • 避免在 ES6 的函数内定位 this 的对象作用域

    例如 我正在使用 D3 js 运行一个项目 导入特定模块并调用它们的函数 Setup TypeScript ES6 导入特定的 D3 组件 角6 我有一个对象 在本例中是一个角度指令 并在 SVG 画布上绘制一些圆圈 并希望它们在拖动事件上
  • “|”是什么意思(单管道)在 JavaScript 中做什么?

    console log 0 5 0 0 console log 1 0 1 console log 1 0 1 为什么0 5 0返回零 但任何整数 包括负数 都返回输入整数 单管道 有什么作用 这是一个按位或 https developer
  • 使用 yum 和 pear 安装 php-soap 均失败

    我正在尝试在 Centos 6 4 服务器上安装 PHP 的 SOAP 扩展 我对包管理器 从 CLI 安装包并在 PHP 中配置它们相当不熟悉 我相当有能力管理 php ini 和其他 PHP 配置文件 soap ini 等 我尝试使用以
  • 带有 mkdocs 的本地 mathjax

    我想在无法访问互联网的计算机上使用 MathJax 和 Mkdocs 因此我不能只调用 Mathjax CDN Config mkdocs yml site name My Docs extra javascript javascripts
  • 使(文本到图像)图像具有一定的宽度但无限的长度?

    我有下面的代码 可以用大量文本生成图像 我希望该图像的宽度为 700 像素 我还希望它保留字符串所具有的段落结构 该字符串来自 MySQL 数据库 我怎样才能实现这一点 font 2 width imagefontwidth font st
  • 扩展构建器中的“映射到现有表”显示 TYPO3 中的奇怪问题

    在我的扩展中MyExt 我映射了模型Page to pagesTYPO3 中的表 首先它向我展示了type mismatch错误 无论如何我继续保存它 会发生以下情况 我的页面树变成这样 我的新记录表单仅显示 UID 而不显示标题 My P
  • 如何知道浏览器空闲时间?

    如何跟踪浏览器空闲时间 我用的是IE8 我没有使用任何会话管理 也不想在服务器端处理它 这是纯 JavaScript 方法来跟踪空闲时间 并在达到一定限制时执行一些操作 var IDLE TIMEOUT 60 seconds var idl
  • 将 window.location 传递给 Flask url_for

    我正在使用 python 在我的页面上 当匿名用户转到登录页面时 我想将一个变量传递到后端 以便它指示用户来自哪里 发送 URL 因此 当用户单击此锚链接时 a href Sign in a 我想发送用户当前所在页面的当前 URL
  • 使用 file_get_content 发布数据

    我已经做了一些关于如何使用的研究file get content与帖子 我也读过this one https stackoverflow com questions 2445276 how to post data in php using
  • 是否可以将请求标头添加到 CORS 预检请求中?

    我有一个从外部服务器 不是服务器 访问 API 的网站 为网站提供服务 通过简单的XmlHttpRequest 见下文 那个API 需要将用于访问服务的 API 密钥添加为请求标头 然而 正如这些CORS https developer m
  • JavaScript 提升解释

    下面的片段有什么区别 var a 0 function b a 10 return function a b console log a gt 10 and var a 0 function b a 10 return function a
  • Aurelia - 仅 HTML 自定义元素的内联定义

    我的 Aurelia 视图模型中有一个递归对象 如下所示 Class BottomlessPit Name string MorePits BottomlessPit null 因此 我想在 Aurelia 视图中使用递归模板 它只会在一个
  • 不使用控件时,视频元素在 Chrome 中消失

    So I think这是一个浏览器错误 它出现在一个更复杂的设计 网站中 但我已经进行了很好的尝试 简化了我的代码和设计等 并发现了以下内容 嵌入时
  • if/else 简写来定义变量

    我很难理解 if else 的 php 简写是如何描述的here https stackoverflow com questions 20233207 php if shorthand and echo in one line possib
  • AngularJS 在指令运行之前通过 AJAX 检索数据

    我正在使用 AngularUIuiMap http angular ui github com directives map实例化谷歌地图的指令 uiMap 指令非常适合处理硬编码数据 mapOptions and myMarkers 但是
  • 禁用 WooCommerce 手动/编辑订单的电子邮件通知

    需要 WooCommerce 专业知识 我需要禁用手动创建的订单的电子邮件通知 我必须使用处理状态 由于处理订单状态的自定义挂钩 我无法创建自定义状态 理想情况下 手动订单页面中可以勾选一个复选框 勾选后 它将禁止在每种状态下向客户发送电子
  • PHP条件,如果当前页面,则链接突出显示[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我有一个带
  • 如何获得 JavaScript 阶乘程序的循环来显示所使用的工作?

    你好 我面临着用 JavaScript 编写一个程序的挑战 尽管我对它不太了解 但它要求用户输入一个数字 然后计算该数字的阶乘 我使用了已经提出的问题并设法使计算正常工作 但无法获得所需的输出 我必须在以下输出中获取它 而不使用任何花哨的库
  • 用javascript调用外部网页(跨域)

    我正在尝试使用以下网络服务来验证提要这个问题 https stackoverflow com questions 11996430 check if a url is a valid feed 但浏览器不允许我向另一台服务器发送 ajax

随机推荐

  • 无需 JavaScript 的图像翻转

    我试图找到一种不使用 javascript 的方法 该方法允许您将鼠标悬停在较小的 div 或图像 上来更改较大 div 的背景 纯粹使用 HTML 和 CSS 可以吗 该示例有 2 个问题 1 仅滚动其中一个 div 有效 因为它紧随其后
  • 什么时候汇编比C更快? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的
  • 我需要帮助理解 java 中 Timer 类的 ScheduleAtFixedRate 方法

    作为一个粉丝番茄工作法 http www pomodorotechnique com 我正在为自己制作一个倒计时器 以保证我完成作业 然而 这个特定的项目不是家庭作业 Stack 有很多关于使用计时器来控制用户输入之前的延迟等问题 但关于独
  • InnoSetup:不卸载更改的文件

    如何告诉 InnoSetup 不要卸载已被用户更改的 文本 文件 与 InnoSetup 安装的文件不同 或者可能更困难 在现有版本上安装新版本时 InnoSetup 应该询问用户是否覆盖更改的文件 但在纯粹卸载时 它应该在不询问的情况下卸
  • 在 Android Kotlin 项目上使用 Java 11 库

    我有以下使用 Java 11 的 HttpClient 编写的 POST 请求 但 Android Studio 无法识别这些库 import java net URI import java net http HttpClient imp
  • 从多个视图控制器使用自定义 UIView

    我创建了一个自定义 UIView 我想在 iPhone 应用程序中的多个不同视图控制器上使用它 目前 我已从第一个视图控制器的 nib 文件中复制了包含控件的 UIView 将其粘贴到其他视图控制器中 然后将所有操作连接到每个视图控制器 这
  • PostgreSQL 列“foo”不存在

    我有一个表 其中有 20 个整数列和 1 个名为 foo 的文本列 如果我运行查询 SELECT from table name where foo is NULL 我收到错误 ERROR column foo does not exist
  • 使用Optional验证输入

    我有一个 CreateOrder 实例 其中包含一些 String Integer 和 Double 状态 当我在 JUnit 测试中为 CreateOrder 创建一个对象并将其发送出去时 我可以使用可选 API 验证 String 属性
  • 缺少 python 配置

    我正在安装一个程序 需要安装 python config 唯一的问题是我目前没有 python config 而且我似乎不知道如何获取它 经过搜索后 我应该可以通过以下方式安装它 yum install python devel 然而 这样
  • System.out 什么时候不会出现在 Java 控制台中?

    我明白任何要标准化的东西 System out 将出现在 Java 控制台窗口中 启用时 我在某个地方发现 在某些情况下可能无法尝试这样做 例如 在 Swing 应用程序中 是这样吗 基本上 什么情况或设置我不希望在控制台中看到标准输出 例
  • 用户空间栈和堆的内存布局

    最近在研究OS 网上有一张图 展示了用户空间和内核空间的内存布局 以及栈 堆等的布局 在这个图中我看到栈位于用户空间的最高内存地址 高于堆 数据段等 为了检查这一点 我在调试视图下使用了 vs2012 中的内存观察器窗口 这是我的代码 in
  • Java并发中的AbstractQueuedSynchronizer

    What is AbstractQueuedSynchronizer在Java中concurrent locks包用来做什么 有人可以阐明它的方法吗doAcquireInterruptibly and parkAndCheckInterru
  • 在 Go 中将 float 转换为 int 时如何舍入到最近的 int

    将 float 转换为 int 时 小数点将被丢弃 有什么干净的方法可以将其四舍五入到最接近的整数 x int 3 6 应等于 4 而不是 3 int f 0 5 如果 gt 5 将导致向上舍入
  • 让线程休眠的更好方法

    我一直在编写有关 Java 8 中 2D 图形的教程 当时 NetBeans 给了我一个提示 Thread Sleep会影响性能 然而 尽管我已经找到了几种更好的方法 但我还没有找到一种方法来包含它们而不弄乱代码 package platf
  • SQL Server 超时是否被记录?

    SQL Server 超时 特别是 SELECT 查询 是否记录在 ERRORLOG 文件中 背景是一位客户的网站偶尔会出现 请求超时 消息 我认为超时是由数据库超时引起的 相关错误日志中没有超时错误 不可以 您需要使用 SQL Profi
  • 如何快速使用 CoreLocation?

    我尝试过将 CoreLocation 与我的 Swift 应用程序一起使用 但没有运气 我有以下非常简单的代码 我已经链接了 CoreLocation 库 import UIKit import CoreLocation UIApplica
  • 如何在此彩票功能中显示所有猜中的号码?

    我用 JS 创建了一些简单的彩票功能 一切正常 我面临的唯一问题是如何显示所有已猜到的数字 我有 6 个独立的空间 其中必须提供数字 我的目标是显示随机空间中的滚动数字 它必须仅在 6 个空间之一中提供 这对我有用 但只显示 1 个数字 我
  • Phonegap html5视频无法播放

    我正在尝试在 iPad 上的phonegap 应用程序中播放视频 该视频给了我错误 MEDIA ERR SRC NOT SUPPORTED 我尝试播放的视频不是本地的 当我在该视频上使用curl I 时 这是它带来的信息 HTTP 1 1
  • 如何使错误冒泡,以便可以在同一个 try/catch 块中捕获它们?

    我有一个带有抛出错误的函数的对象 myObj ini function this f f function throw new Error 但我只想捕获创建对象的异常 try var o new myObj catch err alert
  • 音频端播放新文件

    我有一个webapp https radio repjesus com当您使用 ajax jquery 单击链接时加载并播放音轨 一切正常 但当曲目结束时 曲目将设置为循环 并且这种情况可以永远持续下去 我希望播放器从数据库中自动加载随机曲