#javascript #html #jquery #json
#javascript #HTML #jquery #json
Вопрос:
Я создаю систему заказа еды.Теперь мне нужно создать страницу корзины таким образом, чтобы товар добавлялся к ней, как только я нажимаю на нее.Я создал файл json, содержащий все элементы, и файл js, который его запускает.Я не получаю никаких ошибок, но вывод не приходит, вот мой код json:
[
{
"id": 0,
"name": "Lasagna",
"picture": "images/lasagna.jpg",
"price": 500
},
{
"id": 1,
"name": "Mexican Pizza",
"picture": "images/mpizza.jpg",
"price": 310
},
{
"id": 2,
"name": "Tiramisu Shake",
"picture": "images/tiramisu.jpg",
"price": 290
},
{
"id": 3,
"name": "Penne Pasta",
"picture": "images/ppizza.jpg",
"price": 280
},
{
"id": 4,
"name": "Classic Maggi",
"picture": "images/maggi.jpg",
"price": 120
},
{
"id": 5,
"name": "Nachos",
"picture": "images/nachos.jpg",
"price": 250
},
{
"id": 6,
"name": "Margarita Pizza",
"picture": "images/margarita.jpg",
"price": 220
},
{
"id": 7,
"name": "Kitkat Shake",
"picture": "images/kitkat.jpg",
"price": 310
},
]
И вот мой js-код:
$.getJSON('food.json', function(data) {
var foodRow = $('#foodRow');
var foodTemplate = $('#foodTemplate');
for (i = 0; i < data.length; i ) {
foodTemplate.find('.panel-title').text(data[i].name);
foodTemplate.find('img').attr('src', data[i].picture);
foodTemplate.find('.price').text(data[i].price);
foodTemplate.find('.btn-success').attr('data-id', data[i].id);
console.log(data[i].id)
foodRow.append(foodTemplate.html());
}
});
$("button").click(function(){
var i = $(this).attr("data-id");
console.log(i);
('$out').text(i)
});
html-код:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Foodzie</title>
<script src="jquery-3.5.1.min.js"></script>
<!-- FONT AWESOME -->
<script src="https://kit.fontawesome.com/887e6e97bd.js" crossorigin="anonymous"></script>
<!-- CSS STYLESHEET -->
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css" integrity="sha384-9aIt2nRpC12Uk9gS9baDl411NQApFmC26EwAOH8WgZl5MYYxFfc NcPb1dKGj7Sk" crossorigin="anonymous">
<!-- FONTS -->
<link href="https://fonts.googleapis.com/css2?family=Montserrat:wght@900amp;family=Ubuntu:wght@500amp;display=swap" rel="stylesheet">
<link rel="stylesheet" href="css/styles.css">
<script src="food.js" charset="utf-8"></script>
<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X 965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH 8abtTE1Pi6jizo" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js" integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM B07jRM" crossorigin="anonymous"></script>
</head>
<body>
<section id="title">
<!-- Nav Bar -->
<div class="fluid-container">
<nav class="navbar navbar-expand-lg navbar-dark">
<a class="navbar-brand" href="">FoodZie</a>
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarSupportedContent">
<ul class="navbar-nav ml-auto">
<li class="nav-item">
<a class="nav-link" href="#">View Menu</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#">Add Items</a>
</li>
</ul>
</div>
</nav>
</div>
</section>
<div class="fluid-container">
<div id="foodRow" class="row">
<!-- PETS LOAD HERE -->
</div>
<div id="foodTemplate" style="display: none;">
<div class="col-sm-6 col-md-4 col-lg-3">
<div class="panel panel-default panel-pet">
<div class="panel-heading">
<br>
<h3 class="panel-title">Pizza</h3>
</div>
<div class="panel-body">
<img alt="140x140" data-src="holder.js/140x140" class="img-rounded img-center" style="width: 100%;" src="images/mpizza.jpg" data-holder-rendered="true" height="140" width="140">
<br/><br/>
<strong>Cost</strong>: <span class="price">250</span><br/><br/>
<button class="btn btn-success" type="button" data-id="0" id = "cart">Add to Cart</button><br>
<p id=out></p>
<br>
</div>
</div>
</div>
</div>
</div>
</div>
</body>
</html>
Комментарии:
1. Добавьте также свой html-код для большего понимания
2. что такое
('$out').text(i)
? этого не должно быть$('$out').text(i)
?3. это
console.log(data[i].id)
печатается в консоли браузера?4. ваш вопрос неясен, где вы хотите, чтобы «добавлялся к нему, как только я нажимаю на него».? вы хотите добавить его в свой текущий файл food.json? или просто отобразить в контейнере .out? «вывод не поступает» вы имеете в виду, что данные не были успешно сохранены в json?
5. Добавлен мой html-код
Ответ №1:
Несколько проблем в вашем текущем code
. ,
В вашем JSON
файле есть extra, который автоматически выдает ошибку, но она не отображается в консоли.
Во-вторых, вы неправильно отображаете data-id
кнопку «Добавить cart
в», ваша syntax
ошибка неверна.
$('#out').text(i)
Кроме того, вы добавляете свои продукты динамически после DOM
загрузки, поэтому event Delegation
в этом случае вам нужно использовать для прикрепления событий к вашим Add to Cart
кнопкам.
$(document).on('click', '.cart', function(){
var i = $(this).data("id"); //get the data-id of the clicked button
console.log(i);
$('#out').text(i)
});
Пожалуйста, обратите внимание, что я также использую class
селектор в вашей кнопке «Добавить в корзину <button class="btn btn-success cart" type="button" data-id="0">Add to Cart</button><br>
» — id's
он должен быть уникальным для каждой кнопки, чтобы избежать проблем.
Полный рабочий код:
//Food JSON file
var data = [
{
"id": 0,
"name": "Lasagna",
"picture": "images/lasagna.jpg",
"price": 500
},
{
"id": 1,
"name": "Mexican Pizza",
"picture": "images/mpizza.jpg",
"price": 310
},
{
"id": 2,
"name": "Tiramisu Shake",
"picture": "images/tiramisu.jpg",
"price": 290
},
{
"id": 3,
"name": "Penne Pasta",
"picture": "images/ppizza.jpg",
"price": 280
},
{
"id": 4,
"name": "Classic Maggi",
"picture": "images/maggi.jpg",
"price": 120
},
{
"id": 5,
"name": "Nachos",
"picture": "images/nachos.jpg",
"price": 250
},
{
"id": 6,
"name": "Margarita Pizza",
"picture": "images/margarita.jpg",
"price": 220
},
{
"id": 7,
"name": "Kitkat Shake",
"picture": "images/kitkat.jpg",
"price": 310
}
]
//$.getJSON('food.json', function(data) { //un comment this in your code
var foodRow = $('#foodRow');
var foodTemplate = $('#foodTemplate');
for (i = 0; i < data.length; i ) {
foodTemplate.find('.panel-title').text(data[i].name);
foodTemplate.find('img').attr('src', data[i].picture);
foodTemplate.find('.price').text(data[i].price);
foodTemplate.find('.btn-success').attr('data-id', data[i].id);
//console.log(data[i].id)
foodRow.append(foodTemplate.html());
}
//});
//Click event
$(document).on('click', '.cart', function(){
var i = $(this).data("id");
console.log(i);
$('#out').text(i)
});
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Foodzie</title>
<!-- FONT AWESOME -->
<script src="https://kit.fontawesome.com/887e6e97bd.js" crossorigin="anonymous"></script>
<!-- Latest compiled and minified CSS -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css">
<!-- jQuery library -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<!-- Popper JS -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.16.0/umd/popper.min.js"></script>
<!-- Latest compiled JavaScript -->
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.min.js"></script>
</head>
<body>
<section id="title">
<!-- Nav Bar -->
<div class="fluid-container">
<nav class="navbar navbar-expand-lg navbar-dark">
<a class="navbar-brand" href="">FoodZie</a>
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarSupportedContent">
<ul class="navbar-nav ml-auto">
<li class="nav-item">
<a class="nav-link" href="#">View Menu</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#">Add Items</a>
</li>
</ul>
</div>
</nav>
</div>
</section>
<div class="fluid-container">
<div id="foodRow" class="row">
<!-- PETS LOAD HERE -->
</div>
<div id="foodTemplate">
<div class="col-sm-6 col-md-4 col-lg-3">
<div class="panel panel-default panel-pet">
<div class="panel-heading">
<br>
<h3 class="panel-title">Pizza</h3>
</div>
<div class="panel-body">
<img alt="140x140" data-src="holder.js/140x140" class="img-rounded img-center" style="width: 100%;" src="images/mpizza.jpg" data-holder-rendered="true" height="140" width="140">
<br/><br/>
<strong>Cost</strong>: <span class="price">250</span><br/><br/>
<button class="btn btn-success cart" type="button" data-id="0">Add to Cart</button><br>
<p id='out'></p>
<br>
</div>
</div>
</div>
</div>
</div>
</div>
</body>
</html>