обход скриптом всех селекторов [закрыт]

165
18 апреля 2022, 20:50
Закрыт. Этот вопрос необходимо уточнить или дополнить подробностями. Ответы на него в данный момент не принимаются.

Хотите улучшить этот вопрос? Добавьте больше подробностей и уточните проблему, отредактировав это сообщение.

Закрыт 1 год назад.

Улучшить вопрос

у меня есть перечень товаров в таблице, каждый в отдельной строке. Вот таким селектором

function getNewSums(data = null){
    $("input[name*='product_count_bad'], [name*='variant']").on('input', function(){
        var product_id = + $(this).data('id');
        var all_count = + $('#all_count_'+product_id).html();
        var bad_count = parseInt($('input[name="Product['+product_id+'][product_count_bad]"][data-id="' + product_id + '"]').val());
        
        var variant = $("#s_"+product_id+"_variants option:selected").text();
        var variant_code = +($("#s_"+product_id+"_variants option:selected").val());
        
        var provider_price = data ? data.ops[product_id]['bill_price'] : + $('#bill_price_'+product_id).html();
        var client_price = data ? data.ops[product_id]['client_price'] : + $('#client_price_'+product_id).html();
        var fee_seller = data ? data.ops[product_id]['fee_seller'] : + $('#fee_seller_'+product_id).html();
        var fee_service = data ? data.ops[product_id]['fee_service'] : + $('#fee_service_'+product_id).html();
        var product_summ_cl = + ((all_count * client_price).toFixed(2));
        
        if(isNaN(bad_count)){bad_count=0}
        
        if(isNaN(bad_count)){
            $('#new_summ_cl_'+product_id).val('');
            $('#new_summ_pr_'+product_id).val('');
            $('#new_fee_seller_'+product_id).val('');
            $('#new_fee_service_'+product_id).val('');
        } else {
            //если недовоз или брак, то запрещаем вводить bad_count больше, чем all_count
            if((variant == variants[1] || variant == variants[2]) && bad_count > all_count){
                bad_count = all_count;
                $('input[name="Product['+product_id+'][product_count_bad]"][data-id="' + product_id + '"]').val(bad_count);
            }
            
            var val = {
                'product_count_bad':bad_count, 
                'variant': variant_code, 
                'bill_price':provider_price, 
                'client_price':client_price,
                'fee_seller':fee_seller, 
                'fee_service':fee_service, 
                'product_summ_cl':product_summ_cl
            };
console.log(product_id);
console.log(val);
            $.ajax({
                url: '/reclamation-product/get-new-summ',
                method: "POST",
                dataType: 'json',
                async : false,
                data: {'val': val},
                headers: {'X-CSRF-TOKEN': getToken()},
                success: function (result) {
                    if (result) {
                        changeRowSumms(result, product_id);
                        changeTotalSumms();
                    }
                }
            });
            
            if (variant == variants[2]) {showFields(product_id);} else {hideFields(product_id);}
            
            $('input[name = "Product['+product_id+'][comment]"]').on('input', function(){
                if ($(this).val().length > 1){
                    $('#save_button').prop('disabled', false);
                    $('#send_button').prop('disabled', false);
                }
            });
        }
    });
}

я получаю, вернее, я хотел бы получить ту строку с товаром, в которой произошло событие input. Потом я с ней что-то делаю. Как видно id товара я заранее не знаю и получаю его после события input. Загвоздка в том, что код, который потом выполняется, столько раз, сколько товаров в таблице.

отдельно взятая <tr> у меня вот такая:

<tr id="tr1_196025">
                    <td>1<input type="hidden" name="Product[196025][order_id]" value="1916"><input type="hidden" name="Product[196025][client_id]" value="2875"><input type="hidden" name="Product[196025][provider_id]" value="1909"><input type="hidden" name="Product[196025][seller_id]" value="1"><input type="hidden" name="Product[196025][product_id]" value="196025"><input type="hidden" name="Product[196025][product_name]" value="А5/12 кл. 1В BRAWL STARS, тетрадь учен."><input type="hidden" name="Product[196025][product_count_all]" value="250"><input type="hidden" name="Product[196025][product_count_confirm]" value="0"><input type="hidden" name="Product[196025][product_summ_pr]" value="593.675"><input type="hidden" name="Product[196025][currency_code_pr]" value="980"><input type="hidden" name="Product[196025][product_summ_cl]" value="617.5"><input type="hidden" name="Product[196025][currency_code_cl]" value="980"><input type="hidden" name="Product[196025][fee_seller]" value="6.175"><input type="hidden" name="Product[196025][fee_service]" value="12.35"><input type="hidden" name="Product[196025][product_photo]"><input type="hidden" name="Product[196025][status]" value="1"><input type="hidden" name="Product[196025][created_at]" value="1604660408"><input type="hidden" name="Product[196025][updated_at]" value="1604660408"><input type="hidden" name="Product[196025][sent_at]"><input type="hidden" name="Product[196025][bill_price]" value="2.37470"><input type="hidden" name="Product[196025][client_price]" value="2.47"></td>
                        <td>196025</td>
                        <td></td>
                        <td><a href="/product/196025-a512-kl-1v-brawl-stars-tetrad-ucen" target="_blank">А5/12 кл. 1В BRAWL STARS, тетрадь учен.</a></td>
                        <td id="all_count_196025">250</td> 
                        <td><select id="s_196025_variants" name="Product[196025][variant]" data-id="196025">
<option value="1">недовоз</option>
<option value="2">брак</option>
<option value="0">лишнее</option>
</select></td>    
                        <td><input type="text" name="Product[196025][product_count_bad]" style="width: 100%;" data-id="196025" onkeyup="this.value = this.value.replace(/[^\d]/g,'');"></td>
                        
                        <td id="bill_price_196025">2.37470</td>    
                        <td id="summ_pr_196025">593.675</td>    
                        <td><input type="text" id="new_summ_pr_196025" name="Product[196025][new_summ_pr]" readonly="" style="width: 100%; background-color: #eee; height: 27px; border: thin solid #ccc; padding: 2px; text-align: center;" data-sname="summ_pr"></td>    
                    
                        <td id="client_price_196025">2.47</td>    
                        <td id="summ_cl_196025">617.5</td>
                        <td><input type="text" id="new_summ_cl_196025" name="Product[196025][new_summ_cl]" readonly="" style="width: 100%; background-color: #eee; height: 27px; border: thin solid #ccc; padding: 2px; text-align: center;" data-sname="summ_cl"></td>
                    
                        <td id="fee_seller_196025">1</td>
                        <td><input type="text" id="new_fee_seller_196025" name="Product[196025][new_fee_seller]" readonly="" style="width: 100%; background-color: #eee; height: 27px; border: thin solid #ccc; padding: 2px; text-align: center;" data-sname="fee_seller"></td>  
                    
                        <td id="fee_service_196025">3</td>    
                        <td><input type="text" id="new_fee_service_196025" name="Product[196025][new_fee_service]" readonly="" style="width: 100%; background-color: #eee; height: 27px; border: thin solid #ccc; padding: 2px; text-align: center;" data-sname="fee_service"></td>    
                    
                    </tr>

Соответственно вопрос: как не выполнять код один раз для конкретного товара?

Answer 1

код, который потом выполняется, столько раз, сколько товаров в таблице.

Значит вызов кода

$("input[name*='product_count_bad'], [name*='variant']").on('input', function() { 
  var product_id = + $(this).data('id');
  ... 
}

генерится на каждую строчку. Нужно делать это только один раз.

Код

$('input[name = "Product['+product_id+'][comment]"]').on('input', function() {
  if ($(this).val().length > 1) {
    $('#save_button').prop('disabled', false);
    $('#send_button').prop('disabled', false);
  }
});

навешивает новый обработчик каждый раз, когда вызывается функция getNewSums. Представляете сколько там в конце концов будет этих обработчиков?

READ ALSO
Почему WaitAll не работает должным образом

Почему WaitAll не работает должным образом

Я хочу что бы метод DistributeTrucks выполнялся параллельно, но при этом запуск таймера должен происходить только тогда, когда все задачи выполнятьсяСейчас...

167
Цифровой сертификат и расширения

Цифровой сертификат и расширения

Всем доброго времени суток!

156
Не удается закрыть Excel в диспетчере задач

Не удается закрыть Excel в диспетчере задач

После создания объекта Excel не удается его закрыть: он также висит диспетчере задач:

168
Приведение строки к маске ввода

Приведение строки к маске ввода

От пользователя приходит некий код, и он сравнивается с форматом кода для каждой конкретной страны(он может быть разным), и если его можно...

168