javascript - 为什么使用 cloneNode() 创建多个音频文件会阻止我控制音频源的属性以及如何覆盖它

标签 javascript audio clonenode

我制作网页游戏已经有一段时间了,我很快注意到,一旦我使用 .cloneNode(true) 多次播放同一个音频文件,以避免重新下载该文件每次我想播放音频文件时,我都会失去对播放音量和播放速率等参数的控制,有谁知道我如何重新获得对音频文件每个副本的这些参数的控制?

I tried setting the parameters for the audio copies from the original file but no juice

In the HTML : 
<audio src = "sight.wav" id="sight"/>
<button onclick="playSound()">Play some audio</audio>

In the Js
var get = new Function("id", "return document.getElementById(id)");

function playSound()
{
  get(sight).volume = 0.30;
  get(sight).playbackRate = 0.40;
  get(sight).cloneNode(true).play();
};

对我来说看起来像是有效的代码,但就像我说的,没有果汁,克隆节点完全忽略音量和播放设置,只播放正常的音频。我该怎么办?

最佳答案

Node.cloneNode()当在元素上调用时,将创建一个与原始节点具有相同属性相同子类型的新元素。

这里您不会修改原始的属性,而只是修改一些未反射(reflect)的 IDL 属性,因此不会克隆。

const original = document.querySelector("audio");
console.log( "default", [...original.attributes].map( (att) => att.name ) ); // []
original.volume = 0.2;
console.log( "volume set", [...original.attributes].map( (att) => att.name ) ); // []
original.controls = true;
console.log( "controls set", [...original.attributes].map( (att) => att.name ) ); // [ "controls" ]

const clone = original.cloneNode();
console.log( "clone volume", clone.volume ); // 1
console.log( "clone controls", clone.controls ); // true
<audio></audio>

因此,您可以重写代码,以便设置克隆元素的 volumeplayBackRate,而不是设置原始节点的值,但请注意,如果您实际上会产生几个相同的音频,您应该使用 Web-Audio API 及其 AudioBuffer interface它对这些媒体的播放时间提供了更大的控制,并且比初始化 DOM MediaElements 占用的内存少得多。

关于javascript - 为什么使用 cloneNode() 创建多个音频文件会阻止我控制音频源的属性以及如何覆盖它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64397780/

相关文章:

javascript - 如果用户重新加载/重定向页面,js 发送 post 请求

javascript - 将子模块注入(inject)主模块

ios - 如何在 Swift 中以 wav 格式录制音频?

flash - Javascript音频/视频元素以编程方式控制音量?

javascript删除克隆节点父表

javascript - 为什么在 Node.js 上使用 superagent 尝试登录 reddit 失败?

javascript - 在数组对象中、在选定的键中过滤搜索

java - Android SoundPool load()返回null

javascript - documentFragment.cloneNode(true) 不会克隆 jQuery 数据