【问题标题】:Dynamically create multiple wavesurfer objects with unique names动态创建具有唯一名称的多个 wavesurfer 对象
【发布时间】:2018-05-28 15:30:41
【问题描述】:

不确定我的措辞是否正确,但这就是我想要做的。

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

开箱即用,这很简单,因为您只需声明每个单独的 wavesurfer 实例:

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

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

但我正在预加载 JSON 存储的波形数据,而不是在页面加载时加载任何音频文件,只有当用户单击播放按钮时才会加载音频文件。此外,实例的数量和它们的 id 将被动态创建。

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

在渲染每个 wavesurfer 实例的函数中,我们有这个(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();

})

这可行,但由于 wavesurfer 的每个实例都声明为 wavesurfer,因此无论单击哪个播放按钮,它都会将音频加载到每个实例中。

我认为我可以做的是在渲染函数中声明每个 wavesurfer 实例,并使用动态生成的名称,即:

// `id` is passed to the function

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

然后:

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

但这不起作用(而且我什至认为从我所读到的关于动态变量名的内容中这是不可能的)。

我还读到我可能应该将哈希图用于这样的事情,但不知道如何使用它们,所以如果是这样的话,或者你可以看到另一种我可以完成这项工作的方法,我将不胜感激一些指针。

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

【问题讨论】:

    标签: javascript jquery wavesurfer.js


    【解决方案1】:

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

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

    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>
    

    【讨论】:

      猜你喜欢
      • 2013-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多