Мне нужна помощь, потому что я немного застрял, и я не уверен, что я делаю неправильно.
Я создал таблицу с кнопками в каждой строке. Я хочу дать каждой кнопке уникальный идентификатор. Идентификатор будет 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
.
Не уверен, как заставить это работать. Любая помощь будет оценена! Огромное спасибо заранее!
Привет @KienHT, я не запускаю его в браузере. Я использую yelp fusion API, и при запуске в браузере возникает ошибка политики cors. Я запускаю это на физическом устройстве. Пока работает отлично и не зависает.
Переместите прослушиватель событий для 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
поможет вам избежать подобных недоразумений.
Привет! Спасибо за помощь! Я переместил прослушиватель событий внутрь и изменил цикл for на let
, однако последний идентификатор businesses[9].id
по-прежнему используется для всех кнопок.
Вы уже поменяли var btn = ...
на let btn = ...
? Замени все var
на let
.
@RockySims Спасибо! Это сработало. Я привык использовать var
все время и никогда не использую let
спасибо!
@lm_margaux Рокки прав, вам следует начать использовать let
вместо var
. Это хорошая практика. С подъемом var
сложнее отлаживать
Отвечает ли это на ваш вопрос? Закрытие JavaScript внутри циклов — простой практический пример