Как удалить полную строку по нажатию кнопки в javascript? - PullRequest
0 голосов
/ 22 января 2020

У меня есть html / php код , как показано ниже. Приведенный ниже код html / php работает таким образом, что при добавлении строк мы можем выбирать дату из каждой строки и сохранять ее.

Необходимо сделать две вещи.

  1. При нажатии кнопки Удалить следует удалить значение из массива JSON, поскольку все извлекается из JSON после сохранения формы.

  2. Кроме того, при нажатии кнопки Удалить следует удалить всю строку из DOM.

Ответы [ 6 ]

0 голосов
/ 04 февраля 2020

Если ваш json известен на внешнем интерфейсе (что, я думаю, вы подразумеваете, поскольку ваша rowDelete является JS -функцией), вы можете передать this с вызовом rowDelete , Затем вы можете пройти через DOM, чтобы получить значение для соответствующего поля ввода (например, this.parentNode.childNodes[1]).

Получив это значение, вы можете легко удалить его из соответствующего массива в вашем json:

let d = '2020-01-30'
let idx = arr.indexOf(d)   
let newdates = ([...arr.slice(0,idx), ...arr.slice(idx+1)])
data.house_sitting_date = newdates

(с некоторой дополнительной проверкой границ индекса, конечно).

После этого вы можете выполнить аналогичный обход DOM, чтобы удалить соответствующий элемент из DOM.

0 голосов
/ 04 февраля 2020

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

Он использует javascript запрос на выборку post для отправки в предоставленный вами скрипт для удаления элементов dom и обновите файл json.

Я немного изменил некоторые из ваших путей, поэтому вам нужно будет изменить их обратно (добавить в каталог ../feeds/ parent)

Как только пользователь нажал кнопку перезагрузки страницы, показывая обновленный интерфейс, загруженный из файла json.

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

<?php

if(file_exists('./ptp-ess_landing_house.json')){
    $data = json_decode(file_get_contents('./ptp-ess_landing_house.json'));
}

if ($_SERVER['REQUEST_METHOD'] === 'POST') {

    $_POST = json_decode(file_get_contents('php://input'), true);

    if(isset($_POST['requestType']) && in_array($_POST['requestType'], ['remove'])) {

        switch ($_POST['requestType']) {
            case 'remove' :
                    //Unset the values
                    unset($data->row_delete[$_POST['data'] -1]);
                    unset($data->house_sitting_date[$_POST['data'] -1]);

                    //We are reindexing the arrays as we have deleted some rows, note that we are using +1 array indexes
                    $data->row_delete = array_values($data->row_delete);
                    $data->house_sitting_date = array_values($data->house_sitting_date);

                    foreach($data->row_delete as $key=>$value) {
                        $data->row_delete[$key] = strval($key+1);
                    }

                    //Write the file back
                    $fp = fopen('./ptp-ess_landing_house.json', 'w');
                    fwrite($fp, json_encode($data));
                    fclose($fp);

                    header("HTTP/1.1 200 OK");
                    echo 'ok';
                    die;

                break;

            default:
        }

    }
}
?>
<script>
    function rowDelete(row) {
        //Make a request to your entry file (index.php here) to do the removal
        fetch('/index.php', {
            method: 'post',
            headers: {
                'Accept': 'application/json',
                'Content-Type': 'application/json'
            },
            body: JSON.stringify({requestType: 'remove', data: row})
        }).then(function(response) {
            location.reload();
            return response;
        });
    }
</script>
<?php if($data) { ?>
    <form method="post">
        <div id="rows" style="display:flex; justify-content: center;"><!-- Big div START -->

            <!-- Remove Button START -->
            <div class="rows-delete">
                <h4 style="text-align:center;">Delete Rows</h4>
                <?php if (empty($data->row_delete)) { ?>
                    <div class="row-delete" style="margin-right:30px; margin-top:22.5px;">
                        <button type="button" id="delete" onclick="rowDelete()">Remove</button>
                        <input type="hidden" name="row_delete[]" value="1" />
                    </div>
                <?php } else {  ?>
                    <?php  foreach ($data->row_delete as $row_delete){ ?>
                        <div class="row-delete" style="margin-right:30px; margin-top:22.5px;">
                            <button id="delete" type="button"  onclick="rowDelete(<?php echo $row_delete;?>)">Remove</button>
                            <input type="hidden" name="row_delete[]" value="<?php echo $row_delete;?>" />
                        </div>
                    <?php }} ?>
            </div>
            <!-- Remove Button END -->

            <!-- Sitting Date START -->
            <div class="sitting-days">
                <h4 style="text-align:center;">Select Date</h4>
                <?php if (empty($data->house_sitting_date)) { ?>
                    <!-- Select Date START -->
                    <div class="select-date" style="margin-right:30px; margin-top:20px;">
                        <input type="date" class="house-sitting-date" name="house_sitting_date[]" value="">
                    </div>
                <?php } else {  ?>
                    <?php  foreach ($data->house_sitting_date as $date){ ?>
                        <!-- Select Date START -->
                        <div class="select-date" style="margin-right:30px; margin-top:20px;">
                            <input type="date" class="house-sitting-date" name="house_sitting_date[]" value="<?php if($date) {echo $date;}?>">
                        </div>
                        <!-- Select Date END -->
                    <?php }} ?>
            </div>
            <!-- Sitting Date END -->

        </div><!-- Big div END -->
    </form>
<?php } else {
    echo 'Cannot read JSON settings file';
}
?>
0 голосов
/ 30 января 2020

Это то, что я делал в прошлом, и это прекрасно работает

Необходимым условием для этого ответа является каждая кнопка и поле ввода должно быть в DIV с уникальным идентификатором, и должен быть контейнер для всех этих div в В моем случае это

.

. На кнопке «Добавить» (если она есть) вам нужен узел клона и вставьте его под или над элементом, на котором он был нажат,

    // Create a clone of element with id ddl_1:
    let clone = document.querySelector('#row'+rownumber).cloneNode( true );
    // Append the newly created element on element p 
    document.querySelector('p').appendChild( clone );

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

    function changeids()
    {
     let rows =document.getElementsByClassName('rows');

     for(let i=0; i<rows.length; i++)
     {
       let thisid="row"+i;
       rows[i].setAttribute("id", thisid);

       let thisAddButton = rows[i].getElementsByClassName("add")[0];
       let thisDeleteButton = rows[i].getElementsByClassName("delete")[0];

       let onclickaddfunction = "addrow("+i+")";
       thisAddButton.setAttribute("onclick", onclickaddfunction);

       let onclickDeletefunction = "removerow("+i+")";
       thisDeleteButton.setAttribute("onclick", onclickDeletefunction);

     }
}

Затем, когда Вы удалите, вам нужно удалить узел и снова вызвать changeids

function removerow(rownumber){

document.getElementById('row'+rownumber).remove();
changeids();
}

Это даст вам всю рабочую идею добавления и удаления строк, весь код ниже, пожалуйста, игнорируйте мой грязный код, просто сделал это, чтобы дать вам и идею

<p>

  <div id="row1" class="rows">
   <button class="add" onclick="addrow(1)">add</button>
   <button class="delete" onclick="removerow(1)"> remove </button>
   <input type="text">
  </div>
</p>


<script>
function addrow(rownumber)
{
  // Create a clone of element with id ddl_1:
  let clone = document.querySelector('#row'+rownumber).cloneNode( true );

 // Append the newly created element on element p 
 document.querySelector('p').appendChild( clone );

 changeids();

}

function removerow(rownumber)
{
   document.getElementById('row'+rownumber).remove();
   changeids();
}

function changeids()
{
  let rows =document.getElementsByClassName('rows')

  for(let i=0; i<rows.length; i++)
  {
   let thisid="row"+i;
   rows[i].setAttribute("id", thisid);

   let thisAddButton = rows[i].getElementsByClassName("add")[0];
   let thisDeleteButton = rows[i].getElementsByClassName("delete")[0];

   let onclickaddfunction = "addrow("+i+")";
   thisAddButton.setAttribute("onclick", onclickaddfunction);

   let onclickDeletefunction = "removerow("+i+")";
   thisDeleteButton.setAttribute("onclick", onclickDeletefunction);

  }
}
</script>
0 голосов
/ 29 января 2020

Чтобы удалить строку из dom, вы должны указать уникальный идентификатор для основного элемента строки, и вы можете использовать метод [ElementObject] .remove () для удаления, поэтому все, что внутри, будет удалено. Также Вам следует упростить и изменить JSON данные, чтобы они удалялись из json, также используя ajax с использованием одного идентификатора (ключа) в качестве параметра.

Вот рабочий код:

<?php

        if (!empty($_GET)) {
            if (!empty($_GET['action']) && $_GET['action'] == 'delete') {
                if(file_exists('ptp-ess_landing_house.json')) {
                    $data = json_decode(file_get_contents('ptp-ess_landing_house.json'), true);
                    if (!empty($_GET['row_number'])) {
                        unset($data[$_GET['row_number']]);

                        $fp = fopen('ptp-ess_landing_house.json', 'w');
                        fwrite($fp, json_encode($data));
                        fclose($fp);

                        echo 1;
                        exit;
                    }
                }

                echo 0;
                exit;
            }
        }

        if (!empty($_POST)) {
            $output = array();     

            if (!empty($_POST['row_item'])) {
                $output = $_POST['row_item'];
            }

            $fp = fopen('ptp-ess_landing_house.json', 'w');
            fwrite($fp, json_encode($output));
            fclose($fp);
        }

        $data = array();
        if(file_exists('ptp-ess_landing_house.json')) {
            $data = json_decode(file_get_contents('ptp-ess_landing_house.json'), true);
        }

        ?><form method="post">
            <!-- Add New Row Button START -->
            <div class="plus-minus-button" style="text-align:center;">    
                <button type="button" id="addRow" onclick="rowAdd()">+</button>
            </div>

            <!-- Add New Row Button END -->
            <div id="maindiv">
                <div style="display:flex; justify-content: center;">
                    <div class="rows-delete" style="text-align:center;">
                        <div class="row-delete" style="margin-right:30px;">
                            <h4 style="text-align:center;">Delete Rows</h4>
                        </div>
                    </div>
                    <div class="sitting-days" style="text-align:center;">
                        <div class="select-date" style="margin-right:30px;">
                            <h4 style="text-align:center;">Select Date</h4>
                        </div>
                    </div>
                    <div class="choose-options" style="text-align:center;">
                        <div class="yes-no-option" style="display:inline-grid;">
                            <h4 style="text-align:center;">Yes/No</h4>
                        </div>
                    </div>
                </div>

                <!-- Big div START --><?php

                $totalrow = 0;
                foreach ($data AS $key => $row) {
                    ?><div id="row-<?php echo $key; ?>" style="display:flex; justify-content: center; margin-top:20px;"><?php

                        ?><div class="rows-delete" style="text-align:center;">
                            <div class="row-delete" style="margin-right:30px;">
                                <button type="button" class="delete" onClick="delete_row(this.value)" value="<?php echo $key; ?>">Remove</button>
                                <input type="hidden" name="row_item[<?php echo $key; ?>][row_delete]" value="<?php echo $row['row_delete'];?>" />
                            </div>
                        </div>  

                        <!-- Remove Button END -->
                        <!-- This is what I have tried to add a button (END) -->    

                        <!-- Sitting Date START -->
                        <div class="sitting-days" style="text-align:center;">
                            <div class="select-date" style="margin-right:30px;">
                                <input type="date" class="house-sitting-date" name="row_item[<?php echo $key; ?>][house_sitting_date]" value="<?php echo $row['house_sitting_date']; ?>">
                            </div>
                        </div>  
                        <!-- Sitting Date END -->

                        <!-- YES/NO START --><?php
                        ?><div class="choose-options">
                            <div class="yes-no-option" style="display:inline-grid;">
                                <select name="row_item[<?php echo $key; ?>][house_sitting_date_yes_no]" class="house-yes-no" style="height:24px; ">
                                   <option value="<?php echo $row['house_sitting_date_yes_no']; ?>" <?php if($row['house_sitting_date_yes_no'] == "nada" ) echo "selected";?>>Please choose an option</option>
                                   <option value="<?php echo $row['house_sitting_date_yes_no']; ?>" <?php if($row['house_sitting_date_yes_no'] == "yes" ) echo "selected";?>>Yes</option>
                                   <option value="<?php echo $row['house_sitting_date_yes_no']; ?>" <?php if($row['house_sitting_date_yes_no'] == "no" ) echo "selected";?>>No</option>
                                </select>
                            </div>
                        </div>
                        <!-- YES/NO END -->
                    </div><?php

                    if ($key > $totalrow) $totalrow = $key;
                    else $totalrow++;
                }
            ?>
            <input type="hidden" name="totalrow" id="totalrow" value="<?php echo $totalrow; ?>">
            </div>
            <!-- Big div END -->

            <hr />
            <div style="text-align:center;">
                <input type="submit" value="submit" />
            </div>

        </form>

        <script>
            function delete_row(row_number) {
                var data = '<?php echo json_encode($data) ?>';
                data = JSON.parse(data);
                if (typeof(data[row_number]) != undefined) {
                    var request = new XMLHttpRequest();
                    request.open("GET", "index.php?action=delete&row_number=" + row_number);
                    request.onreadystatechange = function() {
                        if (this.readyState === 4 && this.status === 200) {
                            var row = document.getElementById('row-'+row_number);
                            row.remove();
                        }
                    }
                    request.send();
                }
                else {
                    var row = document.getElementById('row-'+row_number);
                    row.remove();
                }
            }
            function rowAdd(event) {    
                var totalrow = document.getElementById("totalrow").value;
                totalrow = parseInt(totalrow) + 1;

                document.getElementById("maindiv").insertAdjacentHTML('beforeend', newRow(totalrow));

                document.getElementById("totalrow").value = totalrow;
            }
            function newRow(row_number) {
                return `<div id="row-` + row_number + `" class="sitting-days" style="display:flex; justify-content:center; margin-top:20px;">
                    <div class="rows-delete" style="text-align:center;">
                        <div class="row-delete" style="margin-right:30px;">
                            <button type="button"  class="delete" onClick="delete_row(this.value)" value="` + row_number + `">Remove</button>
                            <input type="hidden" name="row_item[` + row_number + `][row_delete]" value="` + row_number + `" />
                        </div>
                    </div>
                    <div class="sitting-days" style="text-align:center;">
                        <div class="select-date" style="margin-right:30px;">
                            <input type="date" class="house-sitting-date" name="row_item[` + row_number + `][house_sitting_date]" value="">
                        </div>
                    </div>
                    <div class="choose-options">
                        <div class="yes-no-option" style="display:inline-grid;">
                            <select name="row_item[` + row_number + `][house_sitting_date_yes_no]" class="house-yes-no" style="height:24px; ">
                               <option value="nada">Please choose an option</option>
                               <option value="yes">Yes</option>
                               <option value="no">No</option>
                            </select>
                        </div>
                    </div>
                </div>`;
            }


    </script>
0 голосов
/ 29 января 2020

Fla sh, к сожалению, сам дизайн кода не очень профессиональный ... есть отдельные циклы для строк (в php), которые вместо этого должны быть только 1 l oop, как (с пример простого Javascript связывания при нажатии):

<?php
for ($i=0; $i<count($data["house_sitting_date"]); $i++)
{
     echo '<div class="remove"><a id="'.$data["row_delete"][$i].'" onclick="deleteRow(this);">Remove</a></div>';
     echo '<div class="date">....</div>';
     ...
}
?>
<script> function deleteRow(el) { el.remove(); } </script>

также, множество встроенных style="" .. кодов, вместо этого вы можете использовать 1 файл стиля.

0 голосов
/ 22 января 2020

Вы должны присвоить каждой добавленной строке идентификатор, соответствующий ее рангу:

row.id=i.toString();

, а затем использовать следующий код для удаления строки:

var row = document.getElementById(rowrankid);
row.parentNode.removeChild(row);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...