Селектор jQuery: как я могу указать одно меню выбора, если у меня их несколько?

#javascript #jquery #selector

#javascript #jquery #селектор

Вопрос:

У меня есть 4 меню выбора, все с одинаковыми продуктами. (Предполагается, что пользователь использует меню выбора для добавления продуктов в счет-фактуру).

Таким образом, каждый раздел состоит из меню выбора, текстового поля количества и текстовых полей цены. Но у меня их ЧЕТЫРЕ на одной странице.

Всякий раз, когда я выбираю продукт из меню выбора, я хочу изменить количество и цену. Но более конкретно, я просто хотел бы знать, как узнать, КАКОЕ меню выбора было нажато.

если в меню выбора есть класс продукта (.product), при выборе продукта затрагиваются ВСЕ разделы. Но я хочу повлиять только на этот конкретный раздел меню выбора.

 $(".product").change(function(event){
  alert('product picked'); // testing
});
  

Я не могу просто добавить число, например: product1, product2, product3 . Потому что тогда в файле javascript мне пришлось бы написать 4 разные функции

 $(".product1").change(function(event){, 
$(".product2").change(function(event){, etc.
  

Я знаю, что это очень просто, но мне нужно обновить мой материал jQuery.

Это часть формы HTML. Я включил только меню выбора продукта и текстовое поле количества для упрощения.

 <div class="item">
<p>
  Product: 
  <select class="product" id="invoice_line_items_attributes_0_item_id" name="invoice[line_items_attributes][0][item_id]"><option value="1" data-defaultquantity="1">WP setup</option>
  <option value="2" data-defaultquantity="1">WordPress Theme Design</option>
  <option value="3" data-defaultquantity="1">WHE/yr</option>
  <option value="4" data-defaultquantity="1">WHE/mo</option></select>
</p>

Qty: <input class="quantity" id="invoice_line_items_attributes_0_quantity" name="invoice[line_items_attributes][0][quantity]" size="30" type="text" value="1"><br>
</div><hr>

<div class="item">
<p>
  Product: 
  <select class="product" id="invoice_line_items_attributes_1_item_id" name="invoice[line_items_attributes][1][item_id]"><option value="1" data-defaultquantity="1">WP setup</option>
  <option value="2" data-defaultquantity="1">WordPress Theme Design</option>
  <option value="3" data-defaultquantity="1">WHE/yr</option>
  <option value="4" data-defaultquantity="1">WHE/mo</option></select>
</p>
Qty: <input class="quantity" id="invoice_line_items_attributes_1_quantity" name="invoice[line_items_attributes][1][quantity]" size="30" type="text" value="1"><br>
</div><hr>
  

Ответ №1:

В вашем обработчике событий this он будет привязан к соответствующему <select> элементу.

 $(".product").change(function(event){
  alert($(this).attr('name')); // name of <select> element changed
});
  

Удобный трюк заключается в использовании атрибутов «данные», чтобы связать что-то подобное <select> с другими полями. То есть вы можете сделать что-то вроде сохранения «id» связанного поля в атрибуте данных, чтобы обработчик мог найти поле, с которым нужно возиться:

 <select name='whatever' data-quantity-id="whatever" data-price-id="whatever">
  <option ... >
</select>
  

Затем в обработчике:

 $('.product').change(function(event) {
  var $quantity = $('#'   $(this).data('quantityId'));
  var $price = $('#'   $(this).data('priceId'));

  // ...
});
  

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

1. Удалил мой ответ, который был похож на ваш. Отличный ответ.

2. И если вы хотите передать $(this) в подфункцию, вы можете использовать subfunction.call($(this), more_args …) . Может быть полезно.

3. Спасибо, это дало мне идеи для атрибута данных. В итоге я использовал ответ Кита, потому что у меня более одного меню выбора, и пользователь может выбрать один и тот же продукт в нескольких меню выбора. Поэтому я не мог использовать идентификаторы. Но я вижу, как это очень полезно в случае одного меню выбора, оно более четкое и краткое.

Ответ №2:

 $(".product").change(function(event){
  $(this).closest(".section").find(".quantity").val("somevalue");
  $(this).closest(".section").find(".price").val("somevalue");
});
  

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

1. В итоге я использовал этот ответ, потому что существует более одного меню выбора. Вместо выбора меню по идентификатору его необходимо выбрать по ближайшему, если один и тот же продукт выбран в нескольких меню выбора.