Как присвоить уникальный идентификатор кнопкам в javascript

Мне нужна помощь, потому что я немного застрял, и я не уверен, что я делаю неправильно.

Я создал таблицу с кнопками в каждой строке. Я хочу дать каждой кнопке уникальный идентификатор. Идентификатор будет JSONObject, который я получил при вызове API. Вот мой код:

function display(data){

    var resultdiv = document.getElementById('resultdiv');
    var table = document.createElement('TABLE');
    table.style.margin = "auto";

    var tbody = document.createElement('TBODY');
    table.appendChild(tbody);

        for (var i=0; i<10; i++){

        var store_is = "Closed";
        if (data.businesses[i].is_closed == false){
            store_is = "Open";
        }
        
        var tr = document.createElement('TR');
        var td1 = document.createElement('TD');
        var td2 = document.createElement('TD');
        var td3 = document.createElement('TD');
        var td4 = document.createElement('TD');

        var img = document.createElement("img");
        img.src = data.businesses[i].image_url;
        img.style.width = "100px";
        img.style.height = "100px";

        var btn = document.createElement('button');
        btn.innerHTML = "<i class='fas fa-angle-double-right' style='color:#7E3131;'></i>";
        btn.style.borderRadius = "8px";
        btn.style.backgroundColor = "#F0B27A";
        btn.style.borderColor = "#F0B27A";
        btn.style.marginLeft = "5px;"
        btn.id = data.businesses[i].id;

        td1.appendChild(img);
        td2.appendChild(document.createTextNode(data.businesses[i].name));
        td3.appendChild(document.createTextNode(store_is));
        td4.appendChild(btn);

        tr.appendChild(td1);
        tr.appendChild(td2);
        tr.appendChild(td3);
        tr.appendChild(td4);
        tbody.appendChild(tr);
   
    }
    resultdiv.appendChild(table);

    
    btn.addEventListener("click" ,function(){

        switch(btn.id){
            case data.businesses[0].id:
                alert(data.businesses[0].name);
                break;
            case data.businesses[1].id:
                alert(data.businesses[1].name);
                break;
            case data.businesses[2].id:
                alert(data.businesses[2].name);
                break;
            case data.businesses[3].id:
                alert(data.businesses[3].name);
                break;
            case data.businesses[4].id:
                alert(data.businesses[4].name);
                break;
            case data.businesses[5].id:
                alert(data.businesses[5].name);
                break;
            case data.businesses[6].id:
                alert(data.businesses[6].name);
                break;
            case data.businesses[7].id:
                alert(data.businesses[7].name);
                break;
            case data.businesses[8].id:
                alert(data.businesses[8].name);
                break;
            case data.businesses[9].id:
                alert(data.businesses[9].name);
                break;
            default:
                alert("Error Sorry");
        }

    })
    
}

Теперь я также хочу иметь EventListener, который, когда я нажимаю кнопку, будет предупреждать назначенный ему идентификатор. Проблема у меня в том, что все кнопки не работают, а только последняя кнопка с идентификатором data.businesses[9].id Когда я добавляю прослушиватель событий внутри цикла, все кнопки работают, но оповещение для всех кнопок тоже data.businesses[9].id.

Не уверен, как заставить это работать. Любая помощь будет оценена! Огромное спасибо заранее!

Отвечает ли это на ваш вопрос? Закрытие JavaScript внутри циклов — простой практический пример

Elan Hamburger 12.12.2020 17:38

Привет @KienHT, я не запускаю его в браузере. Я использую yelp fusion API, и при запуске в браузере возникает ошибка политики cors. Я запускаю это на физическом устройстве. Пока работает отлично и не зависает.

margaux_xx 12.12.2020 17:58
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
2
214
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Переместите прослушиватель событий для btn внутрь for loop и вместо использования var в for loop используйте let следующим образом:

for (let i=0; i<10; i++){

    //your codes

}

Как уже упоминал @Elan, вы столкнулись с проблемой закрытия в Javascript. Это для справки: https://www.w3schools.com/js/js_function_closures.asp

@Im_margaux Я бы пошел еще дальше и рекомендовал бы использовать исключительно let. Нет никаких причин использовать var, а использование вместо этого let поможет вам избежать подобных недоразумений.

Rocky Sims 12.12.2020 17:58

Привет! Спасибо за помощь! Я переместил прослушиватель событий внутрь и изменил цикл for на let, однако последний идентификатор businesses[9].id по-прежнему используется для всех кнопок.

margaux_xx 12.12.2020 17:59

Вы уже поменяли var btn = ... на let btn = ...? Замени все var на let.

Rocky Sims 12.12.2020 18:00

@RockySims Спасибо! Это сработало. Я привык использовать var все время и никогда не использую let спасибо!

margaux_xx 12.12.2020 18:03

@lm_margaux Рокки прав, вам следует начать использовать let вместо var. Это хорошая практика. С подъемом var сложнее отлаживать

KienHT 12.12.2020 18:09

Другие вопросы по теме