1
function init(){ // Ищем все поля ввода и назначаем обработчик
    NodeList.prototype.forEach = Array.prototype.forEach;
    document.querySelectorAll('.wrapper input[type="text"]').forEach(function(e){
        e.addEventListener('keyup', reCount, false);
    });
}

function reCount(){
    var parent = this.parentNode.parentNode;
    var count = this.value;
    if(/^(?:\D|\s)*$/.test(count)) // Если пусто или не цифра, то выходим
        return;
    var price = parent.querySelector('td:nth-child(2)').dataset.price;
    var disc = parent.querySelector('td:nth-child(4)').dataset.disc;
    var total = parent.querySelector('td:nth-child(5) strong');

    total.innerHTML = price * count - (price * count * disc); // Вычисляем итоговую цену за этот товар

    totalReCount(); // Запускаем глобальный пересчёт всех "Итого"
}

function totalReCount(){
    var totals = document.querySelectorAll('.wrapper tr:not([class="total"]) td:next- strong');
    var cost = 0;

    totals.forEach(function(item){
        cost += +item.innerHTML; // Пробегаемся по каждому "Итого" и прибавляем к итоговой цене
    });

    document.querySelector('.wrapper .total strong').innerHTML = cost; // Выводим общий чек
}

document.addEventListener('DOMContentLoaded', init, false);

Помогите завернуть это в $("body").on, т.к. скрипт присваивает обработчик после загрузки DOM, а у меня есть данные, которые динамически подгружаются на страницу, и они этим скриптом уже не обрабатываются. =(

14
  • 1
    Никакой печали, ваш код не работает как надо, а делегированные события писать на "чистом" js это надо уровнем много повыше быть и то все фичи реализовать очень непросто будет. Вообще не понимаю я этого jquery хейтерства. Зато все меньше понимаю действия w3c, эта мания всюду запихивать string... кто вот мешает в dataset или dragdata ссылки на объекты стандартизовать? И механизм для этого вполне легитимный есть...
    – zb'
    27 мар 2015 в 15:49
  • 1
    @TheDoctor jQuery создана с единственной целью "write less do more", и не такое оно уж и дерьмо по сравнению с вашим "нативным" кодом. говнокод, к слову, у вас начинается со второй строчки. (расширение объекта браузера)
    – zb'
    27 мар 2015 в 16:15
  • 2
    А не что? Я встречал некоторых, которые считают, что вызовы биндингов браузера можно считать нативными... А еще я встречал некоторых, которые, кроме ассемблера, ничего не признавали. Ещё наверняка, есть люди, которые не ездят на велосипедах, собранных не ими самими (при этом они в общем-то не гениальные конструкторы, просто считают, что заводское изделие - дерьмо, а их поделка лучше). Есть и другие люди, они берут инструмент и используют его по назначению. jQuery не идеальна, но не вам судить о ее недостатках, повсеместное использование (включая замещение) точно уж не недостаток.
    – zb'
    27 мар 2015 в 17:25
  • 1
    @Lucky, модифицирование прототипов в js сродни предоставлению UB-небезопасного интерфейса в сишке. Через год все браузеры предоставляют чуть иную реализацию, а вы ее пропатчили, и на конкретном сайте все работает не так, как ожидается. Или приходит еще один девелопер, так же патчит и вставляет свою функцию на это же место.
    – etki
    28 мар 2015 в 7:08
  • 1
    @Lucky ... как-то авторитет не очень... да ещё и связанный с esha.com кроме того, "Читать чужой код ему религия не позволит" - иногда чужого кода бывает больше чем можно за раз взять и прочитать, тут мы вообще попадаем в поле "глобалс это плохо". "Задумайтесь над тем, почему в Dart он есть" наверное Dart это другой язык, другой стандарт итд , его структуры документированы отдельно, разве нет ? (то что он волею судеб компиляется в js и может работать с браузером.. "Вообще, мне кажется, эту тему впервые в 2010 году затронул Kangax", я ещё раз напомню о глобальных переменных.
    – zb'
    29 мар 2015 в 3:08

0

Ваш ответ

By clicking “Отправить ответ”, you agree to our terms of service and acknowledge you have read our privacy policy.

Посмотрите другие вопросы с метками или задайте свой вопрос.