Данные цикла Foreach передаются в jquery

#javascript #jquery

Вопрос:

Хорошо, я попытаюсь объяснить это как можно лучше.

У меня на веб-сайте есть фильтр продуктов, созданный с использованием php foreach для создания заголовков и параметров фильтра из базы данных. Код, который он генерирует, приведен ниже.

 lt;div class="card mb-2 card-body alert-filters"gt; lt;h4gt;Product Filterlt;/h4gt; lt;div class="row"gt;  lt;div   class="col-md-3"gt;  lt;h5gt;Pricelt;/h5gt;  lt;input type="hidden" id="hidden_minimum_price" value="0"gt; lt;input   type="hidden" id="hidden_maximum_price" value="50"gt;  lt;p id="price_show"gt;£0 - £50lt;/pgt;  lt;div   id="price_range" class="ui-slider ui-corner-all ui-slider-horizontal ui-widget ui-widget-   content"gt;  lt;div class="ui-slider-range ui-corner-all ui-widget-header" style="left: 0%; width:   100%;"gt;lt;/divgt;  lt;span tabindex="0" class="ui-slider-handle ui-corner-all ui-state-default"   style="left: 0%;"gt;lt;/spangt;lt;span tabindex="0" class="ui-slider-handle ui-corner-all ui-  state- default" style="left: 100%;"gt;lt;/spangt;  lt;/divgt;  lt;/divgt;  lt;div class="col-md-3"gt;  lt;h5gt;Materiallt;/h5gt;  lt;div   style="height: 180px; overflow-y: auto; overflow-x: hidden;"gt;  lt;div class="list-group-item   checkbox"gt;lt;labelgt;lt;input type="checkbox" class="common_selector brand1" value="3"gt;  Metallt;/labelgt;   lt;/divgt;  lt;div class="list-group-item checkbox"gt;lt;labelgt;lt;input type="checkbox"  class="common_selector   brand1" value="1"gt; PLAlt;/labelgt;lt;/divgt;  lt;div class="list-group-item checkbox"gt;lt;labelgt;lt;input   type="checkbox" class="common_selector brand1" value="4"gt; Resinlt;/labelgt;lt;/divgt;  lt;/divgt;  lt;/divgt;  lt;div   class="col-md-3"gt;  lt;h5gt;Baselt;/h5gt;  lt;div style="height: 180px; overflow-y: auto; overflow-x: hidden;"gt;  lt;div class="list-group-item checkbox"gt;lt;labelgt;lt;input type="checkbox"  class="common_selector   brand2" value="2"gt; Includedlt;/labelgt;lt;/divgt;  lt;/divgt;  lt;/divgt;  lt;input type="hidden" name="cPath" id="cPath"   value="15_13_14"gt; lt;/divgt;  

Идентификатор категории добавляется в класс «бренд». Затем это передается в jquery ниже —

 $(document).ready(function(){   filter_data();   function filter_data()  {  $('.filter_data').html('lt;div id="loading" style="" gt;lt;/divgt;');  var action = 'fetch_data';  var minimum_price = $('#hidden_minimum_price').val();  var maximum_price = $('#hidden_maximum_price').val();  var cPath = $("#cPath").val();  var brand = get_filter('brand');  $.ajax({  url:"ext/filter/fetch_data.php",  method:"POST",  data:{action:action, minimum_price:minimum_price, maximum_price:maximum_price,   brand:brand, cPath: cPath},  success:function(data){  $("#product_list").html(data);  }  });  }   function get_filter(class_name)  {  var filter = [];  $('.' class_name ':checked').each(function(){  filter.push($(this).val());  });  return filter;  }   $('.common_selector').click(function(){  filter_data();  });   $('#price_range').slider({  range:true,  min:0,  max:50,  values:[0, 50],  step:1,  stop:function(event, ui)  {  $('#price_show').html('£'   ui.values[0]   ' - '   '£'   ui.values[1]);  $('#hidden_minimum_price').val(ui.values[0]);  $('#hidden_maximum_price').val(ui.values[1]);  filter_data();  }  });  });  

Это прекрасно работает, если я не добавляю идентификатор категории, так как он просто использует «бренд».

То, что я хочу сделать, это иметь var для «brand1», «brand2» и т. Д. В зависимости от того, сколько существует категорий или способ их группировки, и я могу разделить их на странице продолжения.

Ответ №1:

Если я вас правильно понимаю, вам нужен способ перебирать разные бренды, не зная заранее, что это за бренды. Вы используете название бренда в качестве класса. Вместо этого вы можете установить его как отдельный атрибут (не имя класса), чтобы упростить его разделение. Здесь я использовал data-brand для хранения названия бренда и простой цикл для сбора идентификаторов проверенных категорий после нажатия.

Обновление: Не уверен, нужны ли вам значения идентификатора категории или названия брендов, поэтому эта функция фильтра возвращает и то, и другое. Посмотрите на консоль.журнал, который я туда положил.

 $(document).ready(function() {   filter_data();   function filter_data() {  $('.filter_data').html('lt;div id="loading" style="" gt;lt;/divgt;');  var action = 'fetch_data';  var minimum_price = $('#hidden_minimum_price').val();  var maximum_price = $('#hidden_maximum_price').val();  var cPath = $("#cPath").val();  var filter = get_filter('brand');  // to get the brand names: filter.brand  // or if you wan tthe category values: filter.values  $.ajax({  url: "ext/filter/fetch_data.php",  method: "POST",  data: {  action: action,  minimum_price: minimum_price,  maximum_price: maximum_price,  brand: filter.brand,  cPath: cPath  },  success: function(data) {  $("#product_list").html(data);  }  });  }    // filters by dataset and value  function get_filter(what) {  let filter = {  [what]: [],  values: []  };  $('.common_selector:checked').each(function() {  let b = $(this).data(what)  if (!filter[what].includes(b)) filter[what].push(b)  filter.values.push($(this).val())  })  console.log('filter', filter)  return filter;  }   $('.common_selector').click(function() {  filter_data();  });   /*$('#price_range').slider({  range:true,  min:0,  max:50,  values:[0, 50],  step:1,  stop:function(event, ui)  {  $('#price_show').html('£'   ui.values[0]   ' - '   '£'   ui.values[1]);  $('#hidden_minimum_price').val(ui.values[0]);  $('#hidden_maximum_price').val(ui.values[1]);  filter_data();  }  });*/  }); 
 lt;script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"gt;lt;/scriptgt; lt;div class="card mb-2 card-body alert-filters"gt;  lt;h4gt;Product Filterlt;/h4gt;  lt;div class="row"gt;  lt;div class="col-md-3"gt;  lt;h5gt;Pricelt;/h5gt;  lt;input type="hidden" id="hidden_minimum_price" value="0"gt; lt;input type="hidden" id="hidden_maximum_price" value="50"gt;  lt;p id="price_show"gt;£0 - £50lt;/pgt;  lt;div id="price_range" class="ui-slider ui-corner-all ui-slider-horizontal ui-widget ui-widget-   content"gt;  lt;div class="ui-slider-range ui-corner-all ui-widget-header" style="left: 0%; width:   100%;"gt;lt;/divgt;  lt;span tabindex="0" class="ui-slider-handle ui-corner-all ui-state-default" style="left: 0%;"gt;lt;/spangt;lt;span tabindex="0" class="ui-slider-handle ui-corner-all ui-  state- default" style="left: 100%;"gt;lt;/spangt;  lt;/divgt;  lt;/divgt;  lt;div class="col-md-3"gt;  lt;h5gt;Materiallt;/h5gt;  lt;div style="overflow-y: auto; overflow-x: hidden;"gt;  lt;div class="list-group-item   checkbox"gt;lt;labelgt;lt;input type="checkbox" class="common_selector" data-brand="brand1" value="3"gt;  Metallt;/labelgt;  lt;/divgt;  lt;div class="list-group-item checkbox"gt;lt;labelgt;lt;input type="checkbox"  class="common_selector" data-brand="brand1" value="1"gt; PLAlt;/labelgt;lt;/divgt;  lt;div class="list-group-item checkbox"gt;lt;labelgt;lt;input   type="checkbox" class="common_selector" data-brand="brand1" value="4"gt; Resinlt;/labelgt;lt;/divgt;  lt;/divgt;  lt;/divgt;  lt;div class="col-md-3"gt;  lt;h5gt;Baselt;/h5gt;  lt;div style="overflow-y: auto; overflow-x: hidden;"gt;  lt;div class="list-group-item checkbox"gt;lt;labelgt;lt;input type="checkbox"  class="common_selector" data-brand="brand2" value="2"gt; Includedlt;/labelgt;lt;/divgt;  lt;/divgt;  lt;/divgt;  lt;input type="hidden" name="cPath" id="cPath" value="15_13_14"gt;  lt;/divgt; 

Комментарии:

1. Да, это в значительной степени то, к чему я стремлюсь. Но как бы ваш код вписался в мой?

2. Ознакомьтесь с пересмотренным ответом и посмотрите, поможет ли это.

3. Не совсем делаю то, что хочу, но добираюсь туда. Я надеюсь получить массив, который показывает значения 1 и 3 в разделе brand1 и значение 2 в разделе brand2. Я уверен, что смогу разобраться с этим отсюда, хотя