动态创建具有唯一名称

时间:2018-05-28 15:30:41

标签: javascript jquery wavesurfer.js

我不确定我的措辞是否正确,但这是我正在尝试做的事情。

我正在使用一个函数在页面上呈现wavesurfer的多个实例。

开箱即用,这是直截了当的,因为你只是宣布每个单独的waveurfer实例:

var wavesurfer1 = WaveSurfer.create({
  container: domEl,
  barWidth: 3,
  .....

var wavesurfer2 = WaveSurfer.create({
  container: domEl,
  barWidth: 3,
  .....

但是我预加载JSON存储的波形数据并且不在页面加载时加载任何音频文件,只有当用户点击播放按钮时才应加载音频文件。此外,还将动态创建实例数量及其ID。

我的逻辑工作正常,但我无法定位每个独特的waveurfer实例,因为它们并不是唯一的 - 因此我的问题,我无法找到任何信息关于针对个别实例的官方网站(或git)。我认为container可以实现,但无法找到有关如何执行此操作的任何信息,因此我会尝试另一种方式。

在渲染waveurfer的每个实例的函数中,我们有这个(domEl被传递到函数中并为每个波形容器创建一个唯一的divid

var wavesurfer = WaveSurfer.create({
  container: domEl,
  barWidth: 3,
  waveColor: '#CCC',
  progressColor: 'white',
  backend: 'MediaElement',
  mediaType:'audio',
  height: 80,
  cursorColor: 'white',
  responsive: true,
  hideScrollbar: true
});

加载实际音频的功能:

$('.m-btn-player').on('click', function() {

  id = $(this).data("id");
  var url = "/play?id="+id;
  wavesurfer.load(url);
  wavesurfer.play();

})

这是有效的,但是当waveurfer的每个实例都声明为wavesurfer时,无论点击哪个播放按钮,它都会将音频加载到每个实例中。

我认为我可以做的是使用动态生成的名称在render函数中声明每个waveurfer实例,例如:

// `id` is passed to the function

var wavesurfer+id = WaveSurfer.create({
container: domEl,
barWidth: 3,
....

然后:

wavesurfer+id.load(url);
wavesurfer+id.play();

但这并不起作用(我甚至认为可以从我读过的关于动态变量名的内容中找到它。)

我还读过我应该使用hashmaps这样的东西,但不知道如何使用它们,所以如果是这样,或者你可以看到另一种方式我可以做这个工作我会真的很感激一些指示。

如果这种方法完全错误,我如何在不声明每个waveurfer的对象名称的情况下定位waveurfer的多个实例?我无法找到解释如何在任何地方执行此操作的任何内容。

1 个答案:

答案 0 :(得分:3)

经过多次反复试验,我破解了它。

您需要设置一个对象数组:

var wavesurfer = [];

然后在渲染函数中创建每个实例时将每个id传递给它:

function render(id, selector, peaks, url) {

  var domEl = document.createElement('div');
  domEl.setAttribute("id", "t-"+id);
  document.querySelector(selector).appendChild(domEl);

  trackid = "t"+id;

  wavesurfer[trackid] = WaveSurfer.create({
    container: domEl,
    barWidth: 3,
    waveColor: '#CCC',
    progressColor: 'white',
    backend: 'MediaElement',
    mediaType:'audio',
    height: 80,
    cursorColor: 'white',
    responsive: true,
    hideScrollbar: true
  });

  // Make sure you reference each method the same way...

  wavesurfer[trackid].drawBuffer();
  wavesurfer[trackid].load(url, peaks, false); //false prevents preload of audio file

  return wavesurfer[trackid];
}

调用渲染功能:

render(1, ".tk1", [....], 'http://example.com/file.mp3');

然后你可以使用对象标识符来定位每个玩家,在这个例子中,传递给函数的id是1

wavesurfer[t1].playPause();

所以用例可能是:

<div class="tk1">
  <button type="button" onClick="wavesurfer['t1'].playPause();">PLAY</button>
  <script>
  render(1, ".tk1", [-0.39,0.4,-0.9,0.91,-0.32,0.34,-0.95,0.98,-0.54,0.74,-0.9,0.91,-0.33,0.37,-0.96,0.98,-0.9,0.91,-0.79,0.76,-0.95,0.95,-0.88,0.87,-0.91,0.94,-0.55,0.6,-0.97,0.96,-0.43,0.43,-0.91,0.91,-0.51,0.4,-0.98,0.94,-0.55,0.76,-0.91,0.91,-0.33,0.37,-0.98,0.98,-0.39,0.41,-0.92,0.91,-0.31,0.34], 'http://example.com/file.mp3');
  </script>
</div>

<div class="tk2">
  <button type="button" onClick="wavesurfer['t2'].playPause();">PLAY</button>
  <script>
  render(2, ".tk2", [-0.39,0.4,-0.9,0.91,-0.32,0.34,-0.95,0.98,-0.54,0.74,-0.9,0.91,-0.33,0.37,-0.96,0.98,-0.9,0.91,-0.79,0.76,-0.95,0.95,-0.88,0.87,-0.91,0.94,-0.55,0.6,-0.97,0.96,-0.43,0.43,-0.91,0.91,-0.51,0.4,-0.98,0.94,-0.55,0.76,-0.91,0.91,-0.33,0.37,-0.98,0.98,-0.39,0.41,-0.92,0.91,-0.31,0.34], 'http://example.com/file2.mp3');
  </script>
</div>