Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 16.06.2018, 01:04
Аспирант
Отправить личное сообщение для Alessio18911 Посмотреть профиль Найти все сообщения от Alessio18911
 
Регистрация: 18.06.2017
Сообщений: 87

Не пересчитывается length после удаления элемента объекта JQ
Добрый вечер! Прошу помощи. Задача: есть корзина с карточками и заголовком, в котором указано количество карточек в корзине на данный момент. Нужно сделать так, чтобы при клике на кнопке в каждой карточке она удалялась из корзины, при этом в заголовке изменялось и цифра. На данный момент получилось реализовать только так: карточки удаляются, однако цифра не меняется, хотя если физически убирать карточки из разметки, то всё работает корректно. Подскажите, пожалуйста, в чём проблема.
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Made with Thimble</title>
    <link rel="stylesheet" href="style.css">
  </head>
  <body>
    <div class="container">
      <h4 class="title">Товары (<span class="amount"></span>)</h4>
      <div class="block">
        <a сlass="btn" href='#'>Нажми сюда</a>
      </div>
      <div class="block">
        <a сlass="btn" href='#'>Нажми сюда</a>
      </div>
      <div class="block">
        <a сlass="btn" href='#'>Нажми сюда</a>
      </div>
      <div class="block">
        <a сlass="btn" href='#'>Нажми сюда</a>
      </div>
    </div>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <script src='script.js'></script>
  </body>
</html>


Код:
/* Fonts from Google Fonts - more at https://fonts.google.com */
@import url('https://fonts.googleapis.com/css?family=Open+Sans:400,700');
@import url('https://fonts.googleapis.com/css?family=Merriweather:400,700');

body {
  background-color: white;
  font-family: "Open Sans", sans-serif;
  padding: 5px 25px;
  font-size: 18px;
  margin: 0;
  color: #444;
}

.container {
  display: flex;
  flex-direction: column;
  justify-content: space-between;
  height: 600px;
  outline: 3px dashed green;
}

.block {
  display: flex;
  justify-content: flex-end;
  align-items: flex-end;
  height: 100px;
  padding: 10px 20px;
  background: pink;
  outline: 2px solid red;
}

a {
  display: block;
  height: 50px;
  padding: 0 20px;
  color: white;
  font-weight: 600;
  line-height: 50px;
  text-decoration: none;
  background: red;
  border-radius: 30px;
  border: none;
}
$(document).ready(function(){
  var amount = $('.amount');
  var container = $('.container');
  var allBlocks = $(container.find('.block'));
  var buttons = $(allBlocks.find('a'));
  
  //calcAmount();
              
  buttons.on('click', function(e){
    e.preventDefault();
    
    deleteBlock($(e.currentTarget));
    calcAmount();
  });
  
  function deleteBlock($btn) {
    $btn.parents().remove('.block');
  }  
  
  function calcAmount() {
    amount.text(allBlocks.length);
    console.log(allBlocks.length);
  }  
  
});
Ответить с цитированием
  #2 (permalink)  
Старый 16.06.2018, 01:11
Аватар для j0hnik
Профессор
Отправить личное сообщение для j0hnik Посмотреть профиль Найти все сообщения от j0hnik
 
Регистрация: 01.12.2016
Сообщений: 3,650

получать заново нужно, это не "живая коллекция"

function calcAmount() {
    amount.text($(container).find('.block').length);
    console.log($(container).find('.block').length);
  }
Ответить с цитированием
  #3 (permalink)  
Старый 16.06.2018, 01:19
Аватар для j0hnik
Профессор
Отправить личное сообщение для j0hnik Посмотреть профиль Найти все сообщения от j0hnik
 
Регистрация: 01.12.2016
Сообщений: 3,650

живые коллекции хранят такие методы как
getElementsByTagName
getElementsByClassName
Ответить с цитированием
  #4 (permalink)  
Старый 16.06.2018, 01:21
Аспирант
Отправить личное сообщение для Alessio18911 Посмотреть профиль Найти все сообщения от Alessio18911
 
Регистрация: 18.06.2017
Сообщений: 87

Спасибо огромное за оперативный и детальный ответ! У меня уже возникло ощущение, что он "неживой", но вот как обойти это - не знал. Ещё раз благодарю!
Ответить с цитированием
  #5 (permalink)  
Старый 16.06.2018, 01:22
Аспирант
Отправить личное сообщение для Alessio18911 Посмотреть профиль Найти все сообщения от Alessio18911
 
Регистрация: 18.06.2017
Сообщений: 87

Сообщение от j0hnik Посмотреть сообщение
живые коллекции хранят такие методы как
getElementsByTagName
getElementsByClassName
А можно ли совмещать - часть элементов в JQ находить с помощью $, а часть - "живыми" методами? И ещё, почему считается, что "неживые" методы удобнее и практичнее в работе, нежели "живые"?
Ответить с цитированием
  #6 (permalink)  
Старый 16.06.2018, 01:23
Аватар для j0hnik
Профессор
Отправить личное сообщение для j0hnik Посмотреть профиль Найти все сообщения от j0hnik
 
Регистрация: 01.12.2016
Сообщений: 3,650

function calcAmount() {
var len = $(container).find('.block').length
    amount.text(len);
    console.log(len);
  }

только лучше так напишите, или простой счетчик создайте
Ответить с цитированием
  #7 (permalink)  
Старый 16.06.2018, 01:28
Аватар для j0hnik
Профессор
Отправить личное сообщение для j0hnik Посмотреть профиль Найти все сообщения от j0hnik
 
Регистрация: 01.12.2016
Сообщений: 3,650

есть свои преимущества и там и там.
совмещать можно, только нужно понимать, что методы Jquery не переменяются к коллекциям полученным родными методами, надо ее сначала сделать объектом Jquery
Ответить с цитированием
  #8 (permalink)  
Старый 16.06.2018, 01:31
Аспирант
Отправить личное сообщение для Alessio18911 Посмотреть профиль Найти все сообщения от Alessio18911
 
Регистрация: 18.06.2017
Сообщений: 87

Ага, всё понятно. И последний вопрос - покритикуйте, пожалуйста, правильность (рациональность) кода, который удаляет карточки при клике на кнопку. Честно говоря, только сегодня столкнулся с JQ по работе, и, фактически, всё сделал методом тыка. Да и JS ещё не силён у меня )
Ответить с цитированием
  #9 (permalink)  
Старый 16.06.2018, 01:45
Аватар для j0hnik
Профессор
Отправить личное сообщение для j0hnik Посмотреть профиль Найти все сообщения от j0hnik
 
Регистрация: 01.12.2016
Сообщений: 3,650

$(function(){
var amount = $('.amount');
  //calcAmount();    
  $('.container .block a').on('click', function(e){
    e.preventDefault();   
    deleteBlock(this);
    calcAmount();
  });
  
  function deleteBlock(th){
    $(th).parents('.block').remove();
  }  
  
  function calcAmount() {
  	var len = $('.container .block').length;
    amount.text(len);
    console.log(len );
  }   
});


я б так сделал, но в целом нормально, селектор сохраняйте в переменную только если собираетесь использовать больше одного раза.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Свойство объекта Cannot read property 'length' of undefined Blizzart Общие вопросы Javascript 3 04.07.2016 19:59
После удаления нужно обновить страницу Pumych Общие вопросы Javascript 3 15.02.2011 22:55
Текст после элемента Vulkan Events/DOM/Window 3 15.10.2010 11:59
после выбора элемента vanderv jQuery 4 30.05.2010 23:35
У элемента img внутри form пропадает событие после onsubmit формы Eugene Events/DOM/Window 2 18.06.2009 19:21