Могу ли я назначить несколько значений идентификатора данных одному атрибуту в одном элементе? - PullRequest
0 голосов
/ 15 мая 2018

Я использую WordPress. У меня есть аудиоплеер на моем сайте. Когда пользователь нажимает кнопку воспроизведения на отдельной песне, он будет воспроизводить песню. Идентификатор поста - это то, как игрок определяет, какую песню проигрывать.

Таким образом, в DIV, который оборачивает тег кнопки, я назначаю атрибут: data-id, который является идентификатором записи песни. Затем мое приложение получает файл MP3, связанный с этим идентификатором записи. Простой.

Мой тег кнопки воспроизведения по сути такой:

<div class="item item-action" data-id="1161">
  <button class="btn-playpause"></button>
</div>

Ниже приведены важные части моего файла player.js, который обрабатывает событие click и воспроизводит песню:

Имитация кнопки воспроизведения

// simulate the play btn
  $(document).on('click.btn', '.btn-playpause, .btn-queque', function(e){
      e.stopPropagation();
      var self = $(this),
          item = $(this).closest('.item'),
          id = item.attr('data-id'),
          type = item.data('user-id') ? 'user' : 'post',
          play = true;

      if(!player){
        getItem(id, type).done(function(obj){
          if(obj.status == 'success'){
            mep.mepPlaylistTracks = obj.tracks;
            initPlayer();
            player && player.mepSelect(0, true);
          }
        });
        return;
      }

      if(self.is('.btn-queque')){
        play = false;
        self.parent().dropdown('toggle');
      }
      if( self.hasClass('is-playing') ){
        self.removeClass('is-playing');
        player.pause();
      }else{
        var index = player.find(id);
        if( index !== -1){
          var track = player.mepGetCurrentTrack();
          if(track && track.id == id && !play) return;
          player.mepSelect(index, true);
        }else{
          getItem(id, type).done(function(obj){
            if(obj.status == 'success'){
              addToPlay(obj.tracks, play);
            }
          });
        }
      }
  });

Функция getItem ()

function getItem(id, type){
    return $.ajax({
       type : "post",
       dataType : "json",
       url : ajax.ajax_url,
       data : {action: "ajax_music", id : id, type: type, nonce: ajax.nonce}
    });
  }

функция addToPlay ()

function addToPlay(obj, play){
    if(obj.length == 1){
      player.mepAdd( obj[0], play );
    }else if(obj.length > 1){
      if(play){
        player.options.mepPlaylistTracks = obj;
        player.updatemepList();
        player.mepSelect(0, true);
      }else{
        for(var i=0; i<obj.length; i++){
          player.mepAdd( obj[i] );
        }
      }
    }
  }

Вы можете видеть, что как только я нажимаю кнопку воспроизведения, в зависимости от условия запускается функция getItem(). getItem () принимает атрибут data-id, определенный ранее как переменную id, и начинает воспроизведение песни.

Функция addToPlay() добавит еще одну песню в список воспроизведения, если уже есть экземпляр открытого проигрывателя. И когда пользователь нажимает другую кнопку воспроизведения, он добавляет эту новую песню в список и начинает воспроизводить эту песню.

Можно ли изменить этот код, чтобы я мог добавить несколько значений идентификатора данных в код кнопки, чтобы мой сценарий распознал, что существует более одного идентификатора песни, и добавил их в мой список воспроизведения, используя функцию addToPlay()

Я бы хотел сделать что-то вроде этого

<div class="item item-action" data-id="1161, 1288, 1456">
  <button class="btn-playpause"></button>
</div>

Причина, по которой я хочу это сделать, заключается в том, что я хотел бы добавить функцию, которая позволит моим пользователям воспроизводить все песни на текущей странице, которую они просматривают. Некоторые из наших страниц, например страница каталога, отображают десятки песен, которые соответствуют определенным критериям, и я хотел бы, чтобы опция воспроизводила все песни на странице.

Может кто-нибудь помочь подтолкнуть меня в правильном направлении?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 02 февраля 2019

Здесь я представляю альтернативный метод.

В вашей разметке вы можете установить атрибут data-id='[1234] как закодированный массив. Затем вы можете собрать эти свойства и установить их как свойство идентификатора данных для данного элемента, используя jQuery, как я проиллюстрирую здесь:

let someElement = $('.item');
let setItems = someElement.data('id');
let thisItem = someElement.attr('data-id');

ВАЖНО: someElement.data('id') возвращает то же самое, что и someElement.attr('data-id') (кроме строки), ЕСЛИ ничего для этого элемента не было установлено с someElement.data('id',[567,890]);, который устанавливает свойство id для someElement. Итак, однажды установив этот путь

let x = someElement.data('id'); // returns the array 567,890
let org = someElement.attr('data-id'); // still returns the [1234]

Этот код иллюстрирует:

let someElement = $('.item').first();
let setItems = someElement.data('id');
let thisItemS = someElement.attr('data-id');
// make an array of the string
let thisItem = JSON.parse(thisItemS);
console.log(typeof setItems, setItems, typeof thisItemS, thisItemS, typeof thisItem, thisItem);
someElement.data('id', [567, 890]);
let x = someElement.data('id'); // returns and gets the array 567,890
let org = JSON.parse(someElement.attr('data-id')); // still returns the string [1234] made into an array
// merge with no duplicates, in the other code I used .map()
let z = Array.from(new Set(x.concat(org)));
console.log(x, org, z);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>

<div class='item' data-id='[1234]'>me the item</div>

Этот код показывает набор элементов с использованием представленных выше концепций плюс:

  • Установите несколько флажков для выбора
  • Получить значения (все)
  • Получить значения (флажок установлен)

Вы можете комбинировать все это для своей первоначальной цели, но вам нужно будет управлять добавлением значений новых элементов (и, возможно, впоследствии, как удалить) для данного элемента. Вы можете даже добавить элемент <select>, чтобы пользователь мог выбрать некоторые из них для удаления, возможно ...

function showPicks(choicedata) {
  let ul = $('#choices').append('<ul />');
  //ul.remove('li');
  ul.html('empty');
  ul.text('choices:');
  $.each(choicedata, function(index, choice) {
    let c = $('<li/>').html(choice);
    ul.append(c);
  });
}
$(function() {
  let mydata = $('.item').map(function() {
    return $(this).data('id');
  }).get();
  $('.all-items').data("id", mydata);
  showPicks(mydata); //now do what is desired
});

$('item.item-action').filter(':not(".some-items")')
  .on('click', '.btn-playpause', function() {
    let setItems = $(this).closest('.item').data('id');
    let thisItem = $(this).closest('.item').attr('data-id');
    // do what you wish here, I show them
    showPicks(setItems);
  });
$('.some-items').on('click', '.btn-playpause', function(event) {
  let mydata = $('.item-select').filter(':checked')
    .add(this) // set an additional one from the button
    .closest('.item')
    .map(function() {
      return $(this).data('id');
    }).get();
  $(event.delegatedTarget).data("id", mydata);
  let setItems = $(event.delegatedTarget).data('id');
  // the original pick
  let thisItem = $(event.delegatedTarget).attr('data-id');
  // do what you wish here
  showPicks(mydata);
});
  .btn-playpause {
  height: 2em;
  )
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
<div class="item item-action" data-id="[1161]">
  <button class="btn-playpause" type="button"></button>
  <input type="checkbox" class="item-select" />
</div>
<div class="item item-action" data-id="[1163]">
  <button class="btn-playpause"></button>
  <input type="checkbox" class="item-select" />
</div>
<div class="item item-action" data-id="[9961,7744]">
  <button class="btn-playpause" type="button"></button>
  <input type="checkbox" class="item-select" />
</div>
<div class="item item-action all-items" data-id="[42]">
  <button class="btn-playpause" type="button">Play All</button>
</div>
<div class="item item-action some-items" data-id="[95]">
  <button class="btn-playpause" type="button">Play selected</button>
</div>
<div id="choices">none</div>
0 голосов
/ 15 мая 2018

Вы можете сохранить JSON-кодированный массив в теге data-id.Например:

<div class="item item-action" data-id='[1161, 1288, 1456]'>
  <button class="btn-playpause"></button>
</div>

Затем вы можете проанализировать массив и перебрать его содержимое, добавив каждый идентификатор в очередь.

См. Пример разбора здесь: https://gist.github.com/charliepark/4266921

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...