#javascript
#javascript
Вопрос:
Я новичок в javascript, и у меня следующая проблема. Выходные данные, когда я вызываю alert в моем скрипте, являются [Object объект]. При нажатии кнопки вызывается следующая функция( onClick
). В массиве есть [Object object]
элементы. И последняя строка кода не работает должным образом, я имею в виду, innerHtml
.
<!DOCTYPE HTML>
<html>
<head>
<link rel="stylesheet" href="styles.css">
</head>
<body>
<div class="center">
<h1 align="center">Shop Basket</h2>
<script type="text/javascript" src="external.js"></script>
<table align="center">
<tr>
<th align="left">Price</th>
<th>Product</th>
<th></th>
</tr>
<script>
let products = [{
20: "dysk ssd"
},
{
1100: "pralka"
},
{
219: "pad"
},
{
500: "monitor"
},
{
789: "i5 processor"
},
{
88: "soundblaster"
},
{
220: "mysz logitech"
},
{
219: "klawiatura modecom"
},
{
900: "gtx 1060"
},
{
823: "rx 570"
}
];
let shopBasket = [];
function addToBasket(value) {
shopBasket.push(value);
alert(shopBasket);
document.getElementById("change").innerHtml = "" shopBasket.length;
}
for (let i = 0; i < products.length; i ) {
for (let key in products[i]) {
document.write("<tr>");
document.write("<td>" key "</td>");
document.write("<td>" products[i][key] "</td>");
document.write('<td><input value="Add to ShopBakset" type="button" onClick="addToBasket('' products[i] '')"/></td>');
document.write("</tr>");
}
}
</script>
</table>
<center>
<a href="html-link.htm"><img src="shopbasket.jpg" title="basket" alt="basket"></a>
</center>
</div>
<p id="change"></p>
</body>
</html>
С уважением
Комментарии:
1. предоставьте также HTML
2.
innerHtml
должно бытьinnerHTML
3. Не могли бы вы, пожалуйста, объяснить, что вы хотите сделать?
4. @Ckappo выглядит так, как будто он пытается показать размер массива на странице — точно внутри
p
тега с идентификатором «изменить».5. @Adriani6 Итак, ваше исправление innerHTML должно быть решением 🙂
Ответ №1:
Я думаю, вам нужно выполнить JSON stringify в вашем HTML-файле следующим образом:
document.write('<td><input value="Add to ShopBakset" type="button" onClick="addToBasket('' JSON.stringify(products[i]) '')"/></td>');
Затем в вашем JS-коде добавьте синтаксический анализ JSON, как показано ниже:
shopBasket.push(JSON.parse(value));
Запустите фрагмент кода, просто записывая в консоль с помощью JSON.stringify и без него, вы можете увидеть разницу:
let products = [
{20: "dysk ssd"},
{1100: "pralka"},
{219: "pad"},
{500: "monitor"},
{789: "i5 processor"},
{88: "soundblaster"},
{220: "mysz logitech"},
{219: "klawiatura modecom"},
{900: "gtx 1060"},
{823: "rx 570"}
];
for (let i = 0; i < products.length; i ) {
for (let key in products[i]) {
console.log('Without using stringifiy', '<td><input value="Add to ShopBakset" type="button" onClick="addToBasket('' products[i] '')"/></td>');
console.log('With using stringifiy', '<td><input value="Add to ShopBakset" type="button" onClick="addToBasket('' JSON.stringify(products[i]) '')"/></td>');
}
// just to write only the first element
break;
}
И в вашей функции JavaScript, если вы снова проанализируете строку:
AddToBasket('{"20":"dysk ssd"}');
function AddToBasket(value) {
let parsedBasket = JSON.parse(value);
console.log(parsedBasket);
// your code
}
Обновление: Хорошо, итак, давайте переместим весь код JavaScript в ваш внешний файл и забудем о записи документа, сначала добавьте идентификатор в вашу таблицу:
<table id="productsTable" align="center">
Затем из внешнего JS-файла выполните следующее:
let table = document.getElementById('productsTable');
for (let i = 0; i < products.length; i ) {
for (let key in products[i]) {
table.innerHTML = "<tr>";
table.innerHTML = "<td>" key "</td>";
table.innerHTML = "<td>" products[i][key] "</td>";
table.innerHTML = "<td><input value="Add to ShopBakset" type="button" onClick="addToBasket(" formatProduct(products[i]) ")"/></td>";
table.innerHTML = "</tr>";
}
}
function formatProduct(product) {
return JSON.stringify(product).replace(/"/g, ''')
}
Это решит вашу неожиданную проблему с токеном.
В вашей функции addToBasket вы можете записать в консоль результат:
function addToBasket(value) {
console.log('json object', value);
// ... your code
}
Который напечатает следующий объект JSON:
Комментарии:
1. недопустимый или неожиданный токен в строке с тегом close </script>
2. Добавлен один пример для дальнейшего объяснения.
3. если бы я использовал неассоциативный массив, не было бы необходимости использовать stringify?
4. Если у вас в вашем массиве есть только строки, то нет необходимости использовать stringify. Пример: пусть products = [ «диск ssd», «пралка»];
5. Пожалуйста, рассмотрите возможность принятия в качестве ответа, если это решит вашу проблему, или дайте мне знать, если вам нужны дополнительные пояснения. Спасибо!