Удаление нескольких строк таблицы с помощью JQuery и ajax

Я хочу иметь возможность удалять строки, отмеченные флажком, но когда я нажимаю «Удалить выбранное», как таблица на веб-странице, так и база данных MySQL остаются неизменными. Как мне удалить выбранные строки как с веб-страницы, так и с базы данных?

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

datatable.php

<div class = "row well">
    <a type = "button" class = "delete_all btn btn-primary pull-right">Delete Selected</a>
</div>

<script type = "text/javascript">

$(document).ready(function($)
{

function create_html_table (tbl_data) {

tbl +='<table>';
tbl +='<thead>';
tbl +='<tr>';

tbl +='<th rowspan = "3"><input type = "checkbox" id = "master"></th>';
// More table headers
tbl +='</tr>';
tbl +='</thead>';

tbl +='<tbody>';

          $.each(tbl_data, function(index, val) 
            {   
                var row_id = val['row_id'];

                //loop through ajax row data
                tbl +='<tr id = "row" row_id = "'+row_id+'">';

                    tbl +='<td><input type = "checkbox" class = "sub_chk"></td>';
                    tbl +='<td>'+(index + 1)+'</td>';
                    tbl +='<td><div col_name = "filename">'+val['filename']+'</div></td>';
                    // More data
                tbl +='</tr>';
             });

tbl +='</tbody>';
tbl +='</table>';
}

var ajax_url = "<?php echo APPURL;?>/ajax.php" ;

// Multi-select
$(document).on("click","#master", function(e) {

if ($(this).is(':checked',true))  
{
    $(".sub_chk").prop('checked', true);  
}  
else  
{  
    $(".sub_chk").prop('checked',false);  
}  
});

//Delete selected rows
$(document).on('click', '.delete_all', function(event) 
{
    event.preventDefault();

    var ele_this = $('#row') ;
    var row_id = ele_this.attr('row_id');

    var allVals = [];
    $(".sub_chk:checked").each(function()
    {    
    allVals.push(row_id);
    });

    if (allVals.length <=0)  
    {  
        alert("Please select row.");  
    }

    else {

    var data_obj=
    {
        call_type:'delete_row_entry',
        row_id:row_id,
    };  

    ele_this.html('<p class = "bg-warning">Please wait....deleting your entry</p>')

    $.post(ajax_url, data_obj, function(data) 
    { 
        var d1 = JSON.parse(data); 
        if (d1.status == "error")
        {
            var msg = ''
            + '<h3>There was an error while trying to add your entry</h3>'
            +'<pre class = "bg-danger">'+JSON.stringify(data_obj, null, 2) +'</pre>'
            +'';


        }
        else if (d1.status == "success")
        {
            ele_this.closest('tr').css('background','red').slideUp('slow');              
        }
    });

    }   

});

});

</script>

ajax.php

//--->Delete row entry  > start
if (isset($_POST['call_type']) && $_POST['call_type'] = = "delete_row_entry")

{   

$row_id = app_db()->CleanDBData($_POST['row_id']);   

$q1 = app_db()->select("select * from data where row_id='$row_id'");
if ($q1 > 0) 
{
    //found a row to be deleted
    $strTableName = "data";

    $array_where = array('row_id' => $row_id);

    //Call it like this:
    app_db()->Delete($strTableName,$array_where);

    echo json_encode(array(
        'status' => 'success', 
        'msg' => 'deleted entry', 
    ));
    die();
}    
}
//--->Delete row entry  > end

Я видел другие подобные вопросы SO, такие как Вот этот, но я не думаю, что это применимо к моему коду.

Мой вывод:

Удаление нескольких строк таблицы с помощью JQuery и ajax

кажется, что при использовании var ele_this = $(this); в функции щелчка ваш ele_this является кнопкой удаления, а не флажками. Итак, во-первых, вы получаете не флажки row_id, а кнопку, которая не определена (вы должны получить row_id внутри each). Затем при попытке удалить строки так же, как ele_this остается кнопкой, поэтому closest будет делать неожиданные вещи. Вы должны переосмыслить и эту часть.

Kaddath 13.12.2018 09:46

Я немного отредактировал код и теперь могу удалять строки, но только по одной, даже если я устанавливаю более одного флажка. Есть идеи, как удалить более 1 строки за раз?

user10633051 13.12.2018 11:44
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
2
787
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Чтобы добиться желаемого, нужно правильно выбирать хорошие элементы. Например, HTML id должен быть уникальным, поэтому присвоение всем вашим элементам одного и того же id = "row" не сработает. Достаточно использовать свой класс. Затем вы должны учитывать, что each будет выполнять функцию отдельно для всех выбранных вами элементов, так что, если вы хотите делать что-то для каждого элемента, весь код должен быть внутри.

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

Также не очень ясно в вопросе, должен ли текст «Пожалуйста, подождите .... удаление вашей записи» должен отображаться на кнопке или в каждой строке, я предположил, что он был на кнопке, и это поможет вам отличить все элементы от того, как они выбраны.

//Delete selected rows
$(document).on('click', '.delete_all', function(event) 
{
    event.preventDefault();

    //'click' is called on the button, so 'this' here will be the button
    var button = $(this) ;

    var checked_checkboxes = $(".sub_chk:checked");

    if (checked_checkboxes.length <=0)  
    {  
        alert("Please select row.");  
    }
    else {

        button.html('<p class = "bg-warning">Please wait....deleting your entry</p>');

        //next code will be executed for each checkbox selected:
        checked_checkboxes.each(function(){
            var checkbox = $(this);
            var row_id = checkbox.attr('row_id');
            var data_obj=
            {
                call_type: 'delete_row_entry',
                row_id: row_id,
            };

            $.post(ajax_url, data_obj, function(data) 
            { 
                var d1 = JSON.parse(data); 
                if (d1.status == "error")
                {
                    var msg = ''
                    + '<h3>There was an error while trying to add your entry</h3>'
                    +'<pre class = "bg-danger">'+JSON.stringify(data_obj, null, 2) +'</pre>'
                    +'';

                    //you still have to do something with your message, keeping in mind that a separate message will be generated for each separate $.post (one is emitted for each checked checkbox)
                }
                else if (d1.status == "success")
                {
                    checkbox.closest('tr').css('background','red').slideUp('slow');              
                }
            });
        });
    }   

});

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