Comment rendre les cellules de table HTML modifiables?

j'aimerais rendre certaines cellules de la table html modifiables, double-cliquez simplement sur une cellule, entrez du texte et les modifications peuvent être envoyées au serveur. Je ne veux pas utiliser des outils comme Dojo data grid. Parce qu'il propose d'autres fonctionnalités. Me donneriez-vous des extraits de code ou des conseils sur la façon de le mettre en œuvre?

78
demandé sur Michał Perłakowski 2011-05-16 07:05:51

10 réponses

vous pouvez utiliser l'attribut contenteditable sur les cellules, les lignes ou la table en question.

mise à Jour de compatibilité IE8

<table>
<tr><td><div contenteditable>I'm editable</div></td><td><div contenteditable>I'm also editable</div></td></tr>
<tr><td>I'm not editable</td></tr>
</table>

notez juste que si vous rendez la table modifiable, dans Mozilla au moins, vous pouvez supprimer des lignes, etc.

vous devez également vérifier si les navigateurs de votre public cible supportent cet attribut.

en ce qui concerne l'écoute des changements (pour que vous puissiez envoyer au serveur), voir événements de changement contenteditable

95
répondu Brett Zamir 2017-05-23 12:02:23

HTML5 prend en charge contenteditable,

<table border="3">
<thead>
<tr>Heading 1</tr>
<tr>Heading 2</tr>
</thead>
<tbody>
<tr>
<td contenteditable='true'></td>
<td contenteditable='true'></td>
</tr>
<tr>
<td contenteditable='true'></td>
<td contenteditable='true'></td>
</tr>
</tbody>
</table>
36
répondu vardhan 2014-03-18 04:25:37

j'ai trois approches, Ici, vous pouvez utiliser à la fois <input> ou <textarea> selon vos exigences.

1. Utilisez L'entrée <td> .

utilisant <input> élément en tout <td> s,

<tr><td><input type="text"></td>....</tr>

Vous pouvez Aussi redimensionner l'entrée à la taille de ce td. ex.,

input { width:100%; height:100%; }

2. Utilisez l'attribut contenteditable='true' . (HTML5)

mais si vous voulez utiliser contenteditable='true' vous pourriez aussi vouloir sauvegarder les valeurs appropriées dans la base de données. vous pouvez y parvenir avec ajax.

vous pouvez attacher des poignées de touches keyup , keydown , keypress etc au <td> . En outre, il est bon d'utiliser certains delay() avec que les événements lorsque l'utilisateur tape en continu, l'événement ajax ne sera pas feu avec chaque pression d'utilisateur clé. par exemple,

$('table td').keyup(function() {
  clearTimeout($.data(this, 'timer'));
  var wait = setTimeout(saveData, 500); // delay after user types
  $(this).data('timer', wait);
});
function saveData() {
  // ... ajax ...
}

3. Ajouter <input> à <td> lorsqu'il est cliqué.

ajouter l'élément d'entrée dans td lorsque le <td> est cliqué, remplacer sa valeur en fonction de la valeur de la td. Lorsque l'entrée est blured, changez la valeur de la td avec la valeur de l'entrée. Tout cela avec javascript.

15
répondu Bhavesh Gangani 2017-05-23 12:34:17

Vous pouvez utiliser x-modifiable https://vitalets.github.io/x-editable/ sa bibliothèque impressionnante de bootstrap

4
répondu Ahmad Halah 2016-12-20 13:43:20

si vous utilisez Jquery, ce plugin vous aidera est simple, mais est bon

https://github.com/samuelsantosdev/TableEdit

3
répondu user3333866 2014-02-20 17:18:24

essayez ce code.

$(function () {
 $("td").dblclick(function () {
    var OriginalContent = $(this).text();

    $(this).addClass("cellEditing");
    $(this).html("<input type="text" value="&quot; + OriginalContent + &quot;" />");
    $(this).children().first().focus();

    $(this).children().first().keypress(function (e) {
        if (e.which == 13) {
            var newContent = $(this).val();
            $(this).parent().text(newContent);
            $(this).parent().removeClass("cellEditing");
        }
    });

 $(this).children().first().blur(function(){
    $(this).parent().text(OriginalContent);
    $(this).parent().removeClass("cellEditing");
 });
 });
});

vous pouvez également visiter ce lien pour plus de détails:

3
répondu user3751006 2014-06-18 05:58:23

ceci est un exemple simple et exécutable.

 <html>
            <head>
                    <script src="http://cdn.bootcss.com/jquery/3.1.1/jquery.min.js"></script> <!-- jQuery source -->
            </head>
            <body>
                    <table align="center">
                            <tr> <td>id</td> <td>name</td> </tr>
                            <tr> <td>001</td> <td>dog</td> </tr>
                            <tr> <td>002</td> <td>cat</td> </tr>
                            <tr> <td>003</td> <td>pig</td> </tr>
                    </table>
                    <script>
    $(function(){
            $("td").click(function(event){
                    if($(this).children("input").length > 0)
                            return false;
                    var tdObj = $(this);
                    var preText = tdObj.html();
                    var inputObj = $("<input type='text' />");
                    tdObj.html("");
                    inputObj.width(tdObj.width())
                            .height(tdObj.height())
                            .css({border:"0px",fontSize:"17px"})
                            .val(preText)
                            .appendTo(tdObj)
                            .trigger("focus")
                            .trigger("select");
                    inputObj.keyup(function(event){
                            if(13 == event.which) { // press ENTER-key
                                    var text = $(this).val();
                                    tdObj.html(text);
                            }
                            else if(27 == event.which) {  // press ESC-key
                                    tdObj.html(preText);
                            }
                  });
                    inputObj.click(function(){
                            return false;
                    });
            });
    });
                    </script>
            </body>
    </html>
3
répondu ACE Arthur 2016-10-08 14:53:33

il suffit d'insérer <input> élément dans <td> dynamiquement, sur le clic de la cellule. Seulement HTML simple et Javascript. Pas besoin contentEditable , jquery , HTML5

https://Jsfiddle.net/gsivanov/38tLqobw/2/

2
répondu gsivanov 2017-09-19 14:43:15

c'est en fait aussi simple, c'est mon HTML, jQuery sample.. et ça fonctionne comme un charme, je construis tout le code en utilisant un échantillon de données JSON en ligne. cheers

< < HTML > >

<table id="myTable"></table>

< < jQuery >>

<script>
        var url = 'http://jsonplaceholder.typicode.com/posts';
        var currentEditedIndex = -1;
        $(document).ready(function () {
            $.getJSON(url,
            function (json) {
                var tr;
                tr = $('<tr/>');
                tr.append("<td>ID</td>");
                tr.append("<td>userId</td>");
                tr.append("<td>title</td>");
                tr.append("<td>body</td>");
                tr.append("<td>edit</td>");
                $('#myTable').append(tr);

                for (var i = 0; i < json.length; i++) {
                    tr = $('<tr/>');
                    tr.append("<td>" + json[i].id + "</td>");
                    tr.append("<td>" + json[i].userId + "</td>");
                    tr.append("<td>" + json[i].title + "</td>");
                    tr.append("<td>" + json[i].body + "</td>");
                    tr.append("<td><input type='button' value='edit' id='edit' onclick='myfunc(" + i + ")' /></td>");
                    $('#myTable').append(tr);
                }
            });


        });


        function myfunc(rowindex) {

            rowindex++;
            console.log(currentEditedIndex)
            if (currentEditedIndex != -1) {  //not first time to click
                cancelClick(rowindex)
            }
            else {
                cancelClick(currentEditedIndex)
            }

            currentEditedIndex = rowindex; //update the global variable to current edit location

            //get cells values
            var cell1 = ($("#myTable tr:eq(" + (rowindex) + ") td:eq(0)").text());
            var cell2 = ($("#myTable tr:eq(" + (rowindex) + ") td:eq(1)").text());
            var cell3 = ($("#myTable tr:eq(" + (rowindex) + ") td:eq(2)").text());
            var cell4 = ($("#myTable tr:eq(" + (rowindex) + ") td:eq(3)").text());

            //remove text from previous click


            //add a cancel button
            $("#myTable tr:eq(" + (rowindex) + ") td:eq(4)").append(" <input type='button' onclick='cancelClick("+rowindex+")' id='cancelBtn' value='Cancel'  />");
            $("#myTable tr:eq(" + (rowindex) + ") td:eq(4)").css("width", "200");

            //make it a text box
            $("#myTable tr:eq(" + (rowindex) + ") td:eq(0)").html(" <input type='text' id='mycustomid' value='" + cell1 + "' style='width:30px' />");
            $("#myTable tr:eq(" + (rowindex) + ") td:eq(1)").html(" <input type='text' id='mycustomuserId' value='" + cell2 + "' style='width:30px' />");
            $("#myTable tr:eq(" + (rowindex) + ") td:eq(2)").html(" <input type='text' id='mycustomtitle' value='" + cell3 + "' style='width:130px' />");
            $("#myTable tr:eq(" + (rowindex) + ") td:eq(3)").html(" <input type='text' id='mycustomedit' value='" + cell4 + "' style='width:400px' />");

        }

        //on cancel, remove the controls and remove the cancel btn
        function cancelClick(indx)
        {

            //console.log('edit is at row>> rowindex:' + currentEditedIndex);
            indx = currentEditedIndex;

            var cell1 = ($("#myTable #mycustomid").val());
            var cell2 = ($("#myTable #mycustomuserId").val());
            var cell3 = ($("#myTable #mycustomtitle").val());
            var cell4 = ($("#myTable #mycustomedit").val()); 

            $("#myTable tr:eq(" + (indx) + ") td:eq(0)").html(cell1);
            $("#myTable tr:eq(" + (indx) + ") td:eq(1)").html(cell2);
            $("#myTable tr:eq(" + (indx) + ") td:eq(2)").html(cell3);
            $("#myTable tr:eq(" + (indx) + ") td:eq(3)").html(cell4);
            $("#myTable tr:eq(" + (indx) + ") td:eq(4)").find('#cancelBtn').remove();
        }



    </script>
0
répondu Mahmoud Sayed 2016-07-10 06:58:39

C'est le point essentiel, même si vous n'avez pas besoin de rendre le code aussi confus. Au lieu de cela, vous pouvez simplement itérer à travers tous les <td> et ajouter le <input> avec les attributs et finalement mis dans les valeurs.

function edit(el) {
  el.childNodes[0].removeAttribute("disabled");
  el.childNodes[0].focus();
  window.getSelection().removeAllRanges();
}
function disable(el) {
  el.setAttribute("disabled","");
}
<table border>
<tr>
<td ondblclick="edit(this)"><input value="cell1" disabled onblur="disable(this)"></td>
<td ondblclick="edit(this)"><input value="cell2" disabled onblur="disable(this)"></td>
<td ondblclick="edit(this)"><input value="cell3" disabled onblur="disable(this)"></td>
<td ondblclick="edit(this)"><input value="so forth..." disabled onblur="disable(this)">
</td>
</tr>
</table>
0
répondu awesomeguy 2018-05-22 01:12:39