Передача одного элемента массива функции щелчка?

#javascript #html #parameter-passing

#javascript #HTML #передача параметров

Вопрос:

У меня есть объект, который я получаю с сервера, и я хотел бы как-то отобразить. С чем я борюсь, так это передать один элемент одной кнопке. На веб-странице я буду отображать список вещей, связанных с одиночным проигрывателем и кнопкой. Что я хотел бы сделать, так это то, что если я нажму на кнопку какого-либо проигрывателя, я хотел бы передать информацию, относящуюся к этому объекту. Но javascript говорит, что у меня есть неожиданный идентификатор как ошибка. Как я могу передать один объект массива, когда я нажимаю эту кнопку?

  • Пример объекта player
 [
    {"player":"something", "help":"", "secOnTask":12}, 
    {"player":"ran", "help":"", "secOnTask":13}
]
 
 function trialtry(player) {
    alert('hello');
    console.log(player);
}

//function that receives object players from the server
function setTPlayerTemplate(players) {
    var playerHtml = [];
    for (let index = 0; index < players.length; index  ) {
        playerHtml[index] = 
            '<div class = "user">
                <button onclick="trialtry(' players[index] ')">' players[index].player '</button>
                <ul class="list-group">
                    <li class="list-group-item">Time: ' players[index].secOnTask '</li>
                </ul>
            </div>'
    }
    return playerHtml;
}
 

Ответ №1:

Делая '...' players[index] '...' это, вы фактически преобразуете объект в строку. Если ваша players переменная является глобальной, вы можете просто вставить имя переменной в html:

 playerHtml[index] = '<div class = "user">
            <button onclick="trialtry(players[index])">'   // Note here there are no ''
 players[index].player '</button>
             <ul class="list-group">
             <li class="list-group-item">Time: ' players[index].secOnTask '</li>
            </ul>
            </div> '
 

В противном случае (и предпочтительнее) вы можете создать свою структуру элементов (с помощью ванили или библиотек) и ввести свою переменную в обратный вызов кнопки.

С ванилью было бы так:

 function createPlayerElement(player) {
  var $user = document.createElement('div');
  $user.classList.add('user');

  var $button = document.createElement('button');
  button.addEventListener('click', function() { trialtry(player); });
  button.innerText = player.player;

  var $ul = document.createElement('ul');
  $ul.classList.add('list-group');

  var $li = document.createElement('li');
  $li.classList.add('list-group-item');
  $li.innerText = 'Time: '   player.secOnTask;

  $ul.appendChild($li);
  $user.appendChild($button);
  $user.appendChild($ul);

  return $user;

}

function setTPlayerTemplate(players) {
        var playerHtml = [];
        for (let index = 0; index < players.length; index  ) {
            playerElements.push(createPlayerElement(players[i]));
        }
        // Here we don't return flat HTML but the elements to be appended to your container
        return playerHtml; 
}