Как сделать так, чтобы нажатие кнопки получало атрибут данных в своем собственном div?

<?php 
//jQuery calls this code to save changes to inventory
if (isset($_POST['inventoryID'])){
//Filter all incoming fields
$attributeID = preg_replace('#[^0-9]#i', '', $_POST['attrID']);	
$inventoryID = preg_replace('#[^0-9]#i', '', $_POST['inventoryID']);
$inventorySKU = preg_replace('#[^a-z0-9\-]#i', '', $_POST['inventorySKU']);	
$inventorySize = preg_replace('#[^a-z0-9]#i', '', $_POST['inventorySize']);
$inventoryStock = preg_replace('#[^0-9]#i', '', $_POST['inventoryStock']);
$inventoryStatus = preg_replace('#[^a-z]#i', '', $_POST['inventoryStatus']);	

//change letter case
$inventorySKU = strtoupper($inventorySKU);	
$inventorySize = ucwords(strtolower($inventorySize));

	//Check missing fields
	if (!empty($inventorySKU) && !empty($inventorySize) && !empty($inventoryStock) && !empty($inventoryStatus)){ 	
		//Update row for product into table since there is no changes to image made
		$sql = "UPDATE Inventory SET SKU = '$inventorySKU', Size = '$inventorySize', Stock = '$inventoryStock', Status = '$inventoryStatus' WHERE PK_InventoryID = '$inventoryID' AND FK_AttributesID = '$attributeID'";
		$query = mysqli_query($connection, $sql);
		if ($query){
			echo 'Your inventory has been successfully updated!';
		}else{
			echo 'FAILURE: Inventory not updated!';
		}
	}
	exit();	
}
?>

$(document).on('click', '#saveInvSubBtn', function() {
  // Obtain the inventory and attribute ID
  var iID = $('.deleteInvBtn').data("iid");
  var attrID = $('.deleteInvBtn').data("attrid");

  var form_data = new FormData();
  form_data.append('inventorySKU', $("#invSKU").val());
  form_data.append('inventorySize', $("#invSize").val());
  form_data.append('inventoryStock', $("#invStock").val());
  form_data.append('inventoryStatus', $("#invStatus").val());

  $.ajax({
    url: 'edit_inventory.php', // point to server-side PHP script 
    type: 'POST',
    data: form_data,
    dataType: 'text', // what to expect back from the PHP script
    cache: false,
    contentType: false,
    processData: false,
    success: function(data) { // display success(i.e, echo response) response from the PHP script
      if (data === 'Your inventory has been successfully updated!') {
        //do something
      } else {
        //do something else
      }
    },
    error: function() { // display error response(i.e, server timeout etc) from the PHP script
      //display error msg
    }
  });
});

У меня есть div (состоящий из текстовых полей и кнопки сохранения), как показано ниже. Этот div воспроизводится скриптом PHP и является динамическим, т. е. он реплицирует себя столько раз, сколько необходимо в соответствии с циклом PHP WHILE с помощью функции эха. Div состоит из данных из таблицы. Если было 2 строки данных, div реплицирует себя дважды и т. д.

Чего я хочу добиться, так это того, что при нажатии кнопки сохранения jQuery должен получить атрибут данных класса кнопки «deleteInvBtn» и значения всех текстовых полей ВНУТРИ СВОЕГО СОБСТВЕННОГО DIV.

Это работает только при нажатии первой кнопки сохранения div. Когда нажимается вторая кнопка сохранения div, jQuery получает атрибут данных и значения текстовых полей из THE FIRST DIV, что мне не нужно. Я понимаю, что событие клика Jquery получает первый идентификатор, соответствующий HTML. Как мне это решить, пожалуйста? Напоминаем, что оба элемента div, показанные ниже или в реальном скрипте, состоят из одних и тех же классов или идентификаторов.

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

//This is Div 1
    <div class = "flex-container-col">
        <form onSubmit = "return false;">
        <div>
         <button class = "deleteInvBtn" data-iid = "5" data-attrid = "67" 
         title = "Delete Inventory"> 
         <img src = "../images/bin.png" width = "100%"></button>
    															 
         <label for = "invSKU">SKU</label>
    	   <input type = "text" class = "form-text-no-border" id = "invSKU" value = "BSD-LALA40S">
        </div>
    														 
        <div>
    	    <label for = "invSize">SIZE</label>
    	    <input type = "text" class = "form-text-no-border" id = "invSize" value = "Small">
        </div>
    														 
        <div class = "flex-container-row">
    	    <div class = "flex-col-50">
    	      <label for = "invStock">STOCK</label>
    	      <input type = "text" class = "form-text-no-border"                      id = "invStock" value = "11">
          </div>
    															 
          <div class = "flex-col-50">
    	      <label for = "invStatus">STATUS</label>
    	      <select class = "form-text-no-border" id = "invStatus">
    	        //some option statement here
    	      </select>
    	    </div>
        </div>	
    														 
        <div class = "flex-container-row">
    	    <input type = "button" class = "form-btn" id = "saveInvSubBtn" 
             value = "SAVE">
        </div>
        </form>	
    </div>


//This is Div 2. Same as above but with diffrent values
    <div class = "flex-container-col">
        <form onSubmit = "return false;">
        <div>
         <button class = "deleteInvBtn" data-iid = "8" data-attrid = "84" 
         title = "Delete Inventory"> 
         <img src = "../images/bin.png" width = "100%"></button>
    															 
         <label for = "invSKU">SKU</label>
    	   <input type = "text" class = "form-text-no-border" id = "invSKU" value = "KCD-GERA40S">
        </div>
    														 
        <div>
    	    <label for = "invSize">SIZE</label>
    	    <input type = "text" class = "form-text-no-border" id = "invSize" value = "Medium">
        </div>
    														 
        <div class = "flex-container-row">
    	    <div class = "flex-col-50">
    	      <label for = "invStock">STOCK</label>
    	      <input type = "text" class = "form-text-no-border"                      id = "invStock" value = "31">
          </div>
    															 
          <div class = "flex-col-50">
    	      <label for = "invStatus">STATUS</label>
    	      <select class = "form-text-no-border" id = "invStatus">
    	        //some option statement here
    	      </select>
    	    </div>
        </div>	
    														 
        <div class = "flex-container-row">
    	    <input type = "button" class = "form-btn" id = "saveInvSubBtn" 
             value = "SAVE">
        </div>
        </form>	
    </div>

Когда нажата кнопка сохранения div 1, он должен получить атрибут данных div 1 «deleteInvBtn» и значение текстовых полей в div 1. Аналогичным образом, когда нажата кнопка сохранения div 2, он должен получить атрибут данных div 2 «deleteInvBtn» и текстовые поля значение в div 2.

Вам нужно будет добавить я бы на основе автоинкрементного числа (числа), полученного либо из базы данных, либо из вашего цикла. Покажите нам свой код PHP, чтобы мы могли вам помочь

KANAYO AUGUSTIN UG 30.01.2019 15:12

Я согласен с тобой! Атрибуты данных на самом деле управляются php. Я буквально просто вставил число здесь для ясности

Gerard Devaraj 30.01.2019 16:07
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
2
543
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете сделать это, как показано ниже:

//try to give the button a specific class instead of .form-btn for this purpose
$('.form-btn').click(function(){
  //from the clicked button find parent with type form then find id of the text field, then get the value.
  alert($(this).parents('form').find('#invSKU').val());
  
  //similarly for other elements.
  alert($(this).parents('form').find('.deleteInvBtn').data('attrid'));
  alert($(this).parents('form').find('.deleteInvBtn').data('iid'));
});
<script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
//This is Div 1
    <div class = "flex-container-col">
        <form onSubmit = "return false;">
        <div>
         <button class = "deleteInvBtn" data-iid = "5" data-attrid = "67" 
         title = "Delete Inventory"> 
         <img src = "../images/bin.png" width = "100%"></button>
    															 
         <label for = "invSKU">SKU</label>
    	   <input type = "text" class = "form-text-no-border" id = "invSKU" value = "BSD-LALA40S">
        </div>
    														 
        <div>
    	    <label for = "invSize">SIZE</label>
    	    <input type = "text" class = "form-text-no-border" id = "invSize" value = "Small">
        </div>
    														 
        <div class = "flex-container-row">
    	    <div class = "flex-col-50">
    	      <label for = "invStock">STOCK</label>
    	      <input type = "text" class = "form-text-no-border"                      id = "invStock" value = "11">
          </div>
    															 
          <div class = "flex-col-50">
    	      <label for = "invStatus">STATUS</label>
    	      <select class = "form-text-no-border" id = "invStatus">
    	        //some option statement here
    	      </select>
    	    </div>
        </div>	
    														 
        <div class = "flex-container-row">
    	    <input type = "button" class = "form-btn" id = "saveInvSubBtn" 
             value = "SAVE">
        </div>
        </form>	
    </div>


//This is Div 2. Same as above but with diffrent values
    <div class = "flex-container-col">
        <form onSubmit = "return false;">
        <div>
         <button class = "deleteInvBtn" data-iid = "8" data-attrid = "84" 
         title = "Delete Inventory"> 
         <img src = "../images/bin.png" width = "100%"></button>
    															 
         <label for = "invSKU">SKU</label>
    	   <input type = "text" class = "form-text-no-border" id = "invSKU" value = "KCD-GERA40S">
        </div>
    														 
        <div>
    	    <label for = "invSize">SIZE</label>
    	    <input type = "text" class = "form-text-no-border" id = "invSize" value = "Medium">
        </div>
    														 
        <div class = "flex-container-row">
    	    <div class = "flex-col-50">
    	      <label for = "invStock">STOCK</label>
    	      <input type = "text" class = "form-text-no-border"                      id = "invStock" value = "31">
          </div>
    															 
          <div class = "flex-col-50">
    	      <label for = "invStatus">STATUS</label>
    	      <select class = "form-text-no-border" id = "invStatus">
    	        //some option statement here
    	      </select>
    	    </div>
        </div>	
    														 
        <div class = "flex-container-row">
    	    <input type = "button" class = "form-btn" id = "saveInvSubBtn" 
             value = "SAVE">
        </div>
        </form>	
    </div>

Другие вопросы по теме