Мой ajax submit onchange select работает только с первой строкой

У меня есть таблица HTML, в которой есть столбец с параметрами выбора, которые отправляются с использованием события onchange с использованием ajax. код отлично работает для первой строки каждой страницы (поскольку к таблице применяется нумерация страниц), но любая другая строка бесполезна.

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

мой индивидуальный HTML-код

<td>
        <form action = "" method = "POST">
        <select class = "changeStatus" name = "changeStatus" style = "margin-bottom:10px;">
            <option value = "<?php echo $row["STATUS"]; ?>" > <?php echo $row["STATUS"]; ?></option>
            <option value = "new">new</option>
            <option value = "checking">checking</option>
            <option value = "processing">processing</option>
            <option value = "done">done</option>
          </select>
           <input class = "order_Id" type = "hidden" name = "order_Id" value = "<?php echo $row["ORDER_ID"];?>"/>
           </form>
          </td> 

ajax-код

<script>
$(document).ready(function() {

    $('select.changeStatus').change(function(){
        $.ajax({
                type: 'post',
                url: 'test2.php',
                data: {selectFieldValue: $('select.changeStatus').val(), order_Id: $('input[name$ = "order_Id"]').val()},
                success: function(html){alert('Select field value has changed to' + $('select.changeStatus').val()); },
                dataType: 'html'
         });
    });
});
</script>

примечание: предупреждение также повторяет только первую строку.

php-код

<?php
$connection =   mysqli_connect('localhost' , 'root' ,'' ,'project_name');


    $changeStatus=$_POST['selectFieldValue'];
    $id=$_POST['order_Id'];

    $sql='UPDATE new_order SET STATUS = "'.$changeStatus.'" WHERE ORDER_ID  = "'.$id.'"';
     $result = mysqli_query($connection, $sql);


?>

Я искал несколько дней, и пока это был мой единственный успешный код. заранее спасибо

Я думаю, что у вас есть несколько записей и несколько форм на одной странице, и когда событие onChange запускается, вы используете одно и то же имя поля выбора. сделайте имя поля уникальным, и ваш код javascript сможет публиковать соответствующие сообщения.

Shoaib 07.04.2019 19:27

к сожалению, это единственная форма на этой странице, и строка ORDER_ID уникальна, и когда я проверяю ее в Firefox, она показывает правильный идентификатор для каждой строки. Я изменил атрибут имени и класс, чтобы убедиться, что он не конфликтует с другими атрибутами, но без результата. либо. Спасибо, что зашли.

Sarah Fahad 07.04.2019 19:41

Сара, не могли бы вы прислать мне исходный код (ctrl+u), когда вы откроете эту страницу в firefox, этот код поможет понять, что происходит.

Shoaib 07.04.2019 19:45

конечно не проблема, но как? Я совсем новичок в SOF.

Sarah Fahad 07.04.2019 19:55

Получил только что. Вернемся к вам как можно скорее.

Shoaib 07.04.2019 20:06

отправил вам письмо, проверьте свой почтовый ящик.

Shoaib 07.04.2019 20:28

Это работа для вас?

Shoaib 07.04.2019 20:43

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

Sarah Fahad 07.04.2019 20:52

@Shoaib, отправляющий вашу электронную почту для общения за пределами сайта, здесь совершенно неуместен. Поражение всей цели этого сайта

charlietfl 07.04.2019 21:27

@charlietfl в этом ты прав. он сделал это, потому что никто из нас еще не может использовать функцию чата. надеюсь, он удалит его, так как я получил электронное письмо сейчас.

Sarah Fahad 07.04.2019 21:39
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать 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
10
547
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

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

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

selectFieldValue: $('select.changeStatus').val()

Поскольку $('select.changeStatus') дает вам массив всех объектов, соответствующих селектору, а .val() возвращает значение только для первого объекта в массиве, вы эффективно обрабатываете только первую строку, независимо от того, какая строка была изменена. Вместо этого вам нужно использовать

selectFieldValue: $(this).val()

где this относится к объекту, на котором было запущено событие.

То же самое касается вашего оповещения; заменить $('select.changeStatus').val() на $(this).val().

Окончательный сценарий с этими изменениями будет таким:

<script>
$(document).ready(function() {

    $('select.changeStatus').change(function(){
        $.ajax({
                type: 'post',
                url: 'test2.php',
                data: {selectFieldValue: $(this).val(), order_Id:  $(this).siblings(".order_Id").val()},
//***only select that rows .order_Id by using $.siblings() with selector
                success: function(html){alert('Select field value has changed to' + $(this).val()); },
                dataType: 'html'
         });
    });
});
</script>

ваша точка зрения имеет смысл на самом деле. Я попробовал ваше предложение, но, похоже, что-то не так. мне нужно определить переменную для «changeStatus»? если да, пожалуйста, покажите мне, как.

Sarah Fahad 07.04.2019 21:34

@SarahFahad - та же проблема со скрытым вводом. Вам нужен конкретный для этой формы

charlietfl 07.04.2019 21:46

Вы можете показать мне окончательный сценарий? Я буду оценен.

Sarah Fahad 07.04.2019 22:17

Я отредактировал свой пост, чтобы включить окончательный код, в том числе о том, как получить скрытый ввод этих строк, как указал @charlietfl

carboncannonball 07.04.2019 22:33

Это сработало!! вау я очень благодарен большое спасибо! но сообщение с предупреждением перестало работать, я не знаю, в чем причина?

Sarah Fahad 08.04.2019 06:54

Что ж, правда в том, что все сводится к одному и тому же; это никогда не работало. Подумайте об этом, alert($('select.changeStatus').val()); просто выведет значение первого объекта в массиве $('select.changeStatus'), а именно значение вашей первой строки. Неважно, где написана эта строка или какую строку вы имели в виду. Причина, по которой мое исправление не сработало [признаюсь, я отредактировал его, не подумав ;-)], заключается в том, что this в вашей функции обратного вызова больше не находится в события и, следовательно, не указывает на объект, вызвавший событие.

carboncannonball 10.04.2019 20:57

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

carboncannonball 10.04.2019 20:58

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