【问题标题】:Can I change an index in a loop?我可以在循环中更改索引吗?
【发布时间】:2016-03-10 18:37:17
【问题描述】:

我有一系列<div>s,每个<div>s 都有一个颜色名称的ID,例如<div id="white"></div>,它加载一个音频文件并用从ajax 调用收集的艺术家和曲目标题填充几个标题标签,当div 是点击了

HTML

<audio id="song" preload="none">
</audio>
<div id="white"></div>
<div id="pink"></div>
<div id="play" onclick="document.getElementById('song').play()"></div>
<div>
  <h2 id="title"></h2>
  <h3 id="artist"></h3>
</div>`  

Javascript

$("#white").click(function(){
    $("#song").attr('src',data[0].songSrc);
    $("h2").html(data[0].title)
    $("h3").html(data[0].artist)
}); 

$("#pink").click(function(){
    $("#song").attr('src',data[1].songSrc);
    $("h2").html(data[1].title)
    $("h3").html(data[1].artist)
}); 

我可以使用 for 循环或 $.each,而不是重复相同的代码并手动更改 19 项中的每一项的 div id 和项的索引吗?

这是我正在解决这个问题的垃圾箱:jsbin

相关 HTML:

<div id="play" onclick="document.getElementById('song').play()"></div>

【问题讨论】:

  • 我猜你根本做错了! :(
  • @Praveen,你能说得更具体点吗?
  • 这就是我仍在努力理解的。 :(

标签: javascript jquery for-loop each html5-audio


【解决方案1】:

为什么不给所有颜色一个通用类,然后将对象索引存储在数据属性中。然后,您只需单击一次事件即可填充正确的数据。像这样的:

$("div.color").click(function(){
  var index = $(this).data('src');
  $("#song").attr('src',data[index].songSrc);
  $("h2").html(data[index].title);
  $("h3").html(data[index].artist);
}); 
<div id="white" class="color" data-src="0"></div>
<div id="pink" class="color" data-src="1"></div>

【讨论】:

  • 知道了,谢谢!我想我必须添加一个通用类,但被困在其余部分
【解决方案2】:

是的,你可以。您必须同时重构 html 和 js。 在 HTML 中,您必须替换具有 id 的静态 div。取而代之的是,使用将附加所有歌曲的容器。

在 JS 中,为每首歌曲创建 DOM 元素,并将其附加到歌曲容器中。之前,请确保所有元素都具有带有歌曲特定数据的“单击”事件处理程序。利用“绑定”

HTML

  <div class="songs"></div>

  <div id="play" onclick="document.getElementById('song').play()"></div>
  <div>
    <h2 id="title"></h2>
    <h3 id="artist"></h3>
  </div> 
</div> 

JS

myUrl='http://meyecare.herokuapp.com/api/v1/songs';
$(window).load(function(){
  $.ajax({ 
    url: myUrl,
    type: 'GET',
    dataType: 'jsonp',
    success: function(data) {
      $.each(data, function(index,item){
        var element = $( "<div id='" + item.color + "'></p>" );
        element.on('click', function(){
          $("#song").attr('src',this.songSrc);
          $("h2").html(this.title);
          $("h3").html(this.artist);
        }.bind(item)); 
        element.appendTo(".songs");    
      }); 
    }, 
    error: function(){
      console.log('Shnope!');
    },
  });
});

【讨论】:

    【解决方案3】:

    我不完全确定你想要什么,但这应该会让你朝着正确的方向前进。

    HTML

    <div id="content">
      <audio id="song" preload="none"></audio>
    </div>
    <div class="songs"></div>
    

    然后使用 Javascript/jQuery

    var html = '';
    //Create a div for each fetched song
    $.each(data, function(index,item){
      html += '<div class="song" data-song-id="'+index+'" data-artist="'+item.artist+'" data-src="'+item.songSrc+'"></div>';
    });
    // and add them to the div element with the class songs
    $('.songs').html(html);
    
    //Listen to clicks on all divs with the class song
    $('.songs').on('click', '.song' function(e){
      var $this = $(this);
      var songId = $this.data('song-id');
      var artist = $this.data('artist');
      var src = $this.data('src');
      $("#song").attr('src',src);
    })
    

    【讨论】:

    • 我认为 OP 希望增加用于访问 data 数组的索引。在您的情况下,您将始终使用该数组中的相同项目。
    • $.each 函数将遍历响应数据并增加索引
    • @Andy 我更新了代码问题,希望它有助于澄清。我不确定如何表达我的要求。基本上我想使用一个循环(如果可能的话),所以我不必为页面上的每个 19 个 div 重复 .click 函数
    • 上面的代码就是这样做的。您只有一个事件处理程序来监听我们添加到 dom 的所有 div 上的单击事件。只要有类名song
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-20
    • 2015-07-17
    • 2021-11-25
    • 1970-01-01
    • 2015-06-08
    • 2020-02-05
    • 2017-07-28
    相关资源
    最近更新 更多