<li> 使用 jquery 在循环中设置数据属性



我已经为此挣扎了一天左右,我是Java脚本的新手,并为我的最终项目建立了我的第一个GUI,以实现我的资格。

我正在尝试构建音乐播放网络应用程序。

我坚持的一部分是当我执行搜索时,我的jQuery会生成一个新的UL元素,其中liising lising the the歌曲标题。

我试图做的是让LI持有歌曲所独有的数据属性("主要是后端的文件路径和图像路径")

这是我到目前为止的代码。

$("#searchButton").click(() => {
const input = $("#search").val();
const requestURL = "music/" + input.replace(/s+/g, '%20');
$.ajax({
    url: requestURL,
type: "GET",
dataType: "json",
success: (data) => {
    if(data){ 
        $('ul,li').remove();
        $('<ul class="searchHeader"> </li>').text("Songs").appendTo('#songs');
        $('<ul class="albumHeader"> </ul>').text("Albums").appendTo('#albums');
        $('<ul class="artistHeader"> </ul>').text("Artist").appendTo('#artist');

        $(data).each(function(i) {
            $('<li class="results" </li>').text(data[i].songtitle).appendTo('#songsection')
        })

        --------//this is where i am having issues!!!!! -----
        $(".results").each(function (fp){
            $(this).attr("data-file", data[fp].filepath);
        })

        $(".results").click(() => {
            loadAudio($(".results").attr("data-file"));
            play();
        })
        var albumArray = [];
        for(var i = 0; i < data.length; i++){
            if(albumArray.indexOf(data[i].albumtitle) == -1){
                albumArray.push(data[i].albumtitle);  
            }
        }
        for(var i = 0; i < albumArray.length; i++){
        $('<li class="results" onclick=""> </li>').text(albumArray[i]).appendTo('#albumsection');
        }
        var artistArray = [];
        for(var i = 0; i < data.length; i++){
            if(artistArray.indexOf(data[i].name) == -1){
                artistArray.push(data[i].name);  
            }
        }
        for(var i = 0; i < artistArray.length; i++){
        $('<li class="results" onclick=""> </ul>').text(artistArray[i]).appendTo('#artistsection');
         }
        }
    } 
  })
})

您可能会猜测我为每个LI获得相同的数据属性,

任何帮助将不胜感激。

谢谢

代码上的问题是

$(".results").click(() => {
  loadAudio($(".results").attr("data-file"));
  play();
})

click处理程序中,其中$(".results")是所有匹配的选择器的集合,而.attr("data-file")仅获取传递给jQuery()的选择器的第一个值。

您可以使用$(this)$(event.target)来引用派遣事件的$(".results")集合中的当前元素。

loadAudio($(this).attr("data-file"));
play();

HTML的关闭标签传递给jQuery()。多个循环不是必需的。使用.each()

的正确参数

$(function() {
  var data = [{
    songtitle: 0,
    filepath: 0
  }, {
    songtitle: 1,
    filepath: 1
  }];
  $(data).each(function(i, value) {
    $("<li>", {
      "class": "results",
      text: "click " + value.songtitle,
      attr: {
        ["data-file"]: value.filepath
      },
      appendTo: "#songsection",
      on: {click: function(event) {
                    console.log(event.target.dataset.file, $(this)[0].outerHTML);
                    /*
                    // use built-in `event.target.dataset` or jQuery version
                    loadAudio($(event.target).attr("data-file"));
                    play();
                    */
                  }
          }
    })
  });
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<ul id="songsection">

最新更新