Не удается найти ошибку в моем файле json и javascript

#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>