Как сделать вывод json в html по нажатию на кнопки

Мне нужно что бы была информация в json на 3 товара (название, описание) В самом html есть 3 кнопки и по нажатию на кнопку 1 выводился название товара 1 и его описание в html и так далее

КАК ЭТО РЕАЛИЗОВАТЬ НЕ ЗНАЮ. ПОМОГИТЕ ПОЖАЛУЙСТА

var myObject = {
  "catalogo": [{
      "id": 0,
      "name": "one",
      "description": "111"
    },
    {
      "id": 1,
      "name": "two",
      "description": "222"
    },
    {
      "id": 2,
      "name": "three",
      "description": "333"
    }
  ]
};

let name = document.getElementById('name')
let description = document.getElementById('description')

const bnt1 = document.getElementById('bnt1')
const bnt2 = document.getElementById('bnt2')
const bnt3 = document.getElementById('bnt3')
<div>
  <h1 id="name"></h1>
  <p id="description"></p>
  <div>
    <button id="bnt1">1</button>
    <button id="bnt2">2</button>
    <button id="bnt3">3</button>
  </div>
</div>


Ответы (1 шт):

Автор решения: SwaD

Самое первое решение, которое напрашивается "в лоб", это для каждой кнопки создать свой обработчик клика и в явном виде прописать, что надо выводить(захардкодить значения):

const myObject = {
  "catalogo": [
    {"id": 0, "name": "one", "description": "111"},
    {"id": 1, "name": "two", "description": "222"},
    {"id": 2, "name": "three", "description": "333"}
  ]
};

let name = document.getElementById('name')
let description = document.getElementById('description')

const bnt1 = document.getElementById('bnt1')
const bnt2 = document.getElementById('bnt2')
const bnt3 = document.getElementById('bnt3')

bnt1.addEventListener('click', () => {
  name.innerText = myObject.catalogo[0].name;
  description.innerText = myObject.catalogo[0].description;
})

bnt2.addEventListener('click', () => {
  name.innerText = myObject.catalogo[1].name;
  description.innerText = myObject.catalogo[1].description;
})

bnt3.addEventListener('click', () => {
  name.innerText = myObject.catalogo[2].name;
  description.innerText = myObject.catalogo[2].description;
})
<div>
  <h1 id="name"></h1>
  <p id="description"></p>
  <div>
    <button id="bnt1">1</button>
    <button id="bnt2">2</button>
    <button id="bnt3">3</button>
  </div>
</div>

Это довольно плохой вариант, однако в рамках обучения, "на троечку", подойдет.

Далее, "На четверочку", можно улучшить код. Мы видим в нем в явном виде дубликат кода. Вынесем обработчик клика в отдельную функцию

const myObject = {
  "catalogo": [
    {"id": 0, "name": "one", "description": "111"},
    {"id": 1, "name": "two", "description": "222"},
    {"id": 2, "name": "three", "description": "333"}
  ]
};

let name = document.getElementById('name')
let description = document.getElementById('description')

const bnt1 = document.getElementById('bnt1')
const bnt2 = document.getElementById('bnt2')
const bnt3 = document.getElementById('bnt3')

function btnClick(id) {
  name.innerText = myObject.catalogo[id].name;
  description.innerText = myObject.catalogo[id].description;
}

bnt1.addEventListener('click', () => {
  btnClick(0)
})

bnt2.addEventListener('click', () => {
  btnClick(1)
})

bnt3.addEventListener('click', () => {
  btnClick(2)
})
<div>
  <h1 id="name"></h1>
  <p id="description"></p>
  <div>
    <button id="bnt1">1</button>
    <button id="bnt2">2</button>
    <button id="bnt3">3</button>
  </div>
</div>

Однако опять же у нас есть незначительный дубликат кода и остались захардкоженные значения. Улучшаем!

Выберем все элементы button на странице и в цикле, каждой кнопке назначим обработчик, передавая событие щелчка мышки. Так же модифицируем функцию обработчик. Будем считать, что названия кнопок это номер позиции элемента

const myObject = {
  "catalogo": [
    {"id": 0, "name": "one", "description": "111"},
    {"id": 1, "name": "two", "description": "222"},
    {"id": 2, "name": "three", "description": "333"}
  ]
};

let name = document.getElementById('name')
let description = document.getElementById('description')

function btnClickC(event) {
  const id = +event.target.innerText -1;
  name.innerText = myObject.catalogo[id].name;
  description.innerText = myObject.catalogo[id].description;
}

document.querySelectorAll('button').forEach(button => {
  button.addEventListener('click', btnClickC)
});
<div>
  <h1 id="name"></h1>
  <p id="description"></p>
  <div>
    <button id="bnt1">1</button>
    <button id="bnt2">2</button>
    <button id="bnt3">3</button>
  </div>
</div>

Ну или можно воспользоваться bind и передавать в this индекс кнопки

const myObject = {
  "catalogo": [
    {"id": 0, "name": "one", "description": "111"},
    {"id": 1, "name": "two", "description": "222"},
    {"id": 2, "name": "three", "description": "333"}
  ]
};

let name = document.getElementById('name')
let description = document.getElementById('description')

function btnClickU() {
  name.innerText = myObject.catalogo[this].name;
  description.innerText = myObject.catalogo[this].description;
}

document.querySelectorAll('button').forEach((button, index) => {
  button.addEventListener('click', btnClickU.bind(index))
});
<div>
  <h1 id="name"></h1>
  <p id="description"></p>
  <div>
    <button id="bnt1">1</button>
    <button id="bnt2">2</button>
    <button id="bnt3">3</button>
  </div>
</div>

Наверное самый правильный вариант, это создавать кнопки под каждый элемент массива:

const myObject = {
  "catalogo": [
    {"id": 0, "name": "one", "description": "111"},
    {"id": 1, "name": "two", "description": "222"},
    {"id": 2, "name": "three", "description": "333"}
  ]
};

let name = document.getElementById('name')
let description = document.getElementById('description')

const container = document.getElementById('btnCont');

myObject.catalogo.forEach((elem, index) => {
  const btn = document.createElement('button');
  btn.innerText = elem.id + 1;
  btn.addEventListener('click', function() {
    name.innerText = elem.name;
    description.innerText = elem.description;
  })
  container.appendChild(btn);
})
<div>
  <h1 id="name"></h1>
  <p id="description"></p>
  <div id='btnCont'></div>
</div>

В таком случае, при изменении количества элементов в массиве, править код не надо будет

→ Ссылка