Come rendere modificabile la cella della tabella HTML?


102

Vorrei rendere modificabili alcune celle della tabella html, è sufficiente fare doppio clic su una cella, inserire del testo e le modifiche possono essere inviate al server. Non voglio usare alcuni toolkit come la griglia dati del dojo. Perché fornisce alcune altre funzionalità. Mi fornireste qualche frammento di codice o consigli su come implementarlo?

Risposte:


116

Puoi utilizzare l'attributo contenteditable nelle celle, nelle righe o nella tabella in questione.

Aggiornato per compatibilità con 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>

Tieni presente che se rendi la tabella modificabile, almeno in Mozilla, puoi eliminare righe, ecc.

Dovresti anche verificare se i browser del tuo pubblico di destinazione supportano questo attributo.

Per quanto riguarda l'ascolto delle modifiche (in modo da poterle inviare al server), vedere eventi di modifica modificabili


Grazie. Sembra che contenteditable sia supportato in HTML5. Sto cercando una soluzione che funzioni anche in html4.
wqfeng

Sebbene sia finalmente codificato nello standard con HTML5, era già ben supportato nella maggior parte dei browser meno recenti (ad eccezione del supporto solo parziale in FF3): caniuse.com/contenteditable (anche se non nei dispositivi mobili)
Brett Zamir

Ottimo suggerimento. Lo stavo cercando. Grazie.
praneybehl

Grazie per l'ottimo suggerimento.
Prasad Rajapaksha

1
Se hai bisogno della compatibilità con IE8, devi solo aggiungere il contenteditablediv ogni volta che ne crei uno nuovo <td>. Altrimenti, come accennato nel post, puoi aggiungere il contenteditablesu celle, righe o tabella.
Brett Zamir

61

HTML5 supporta 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>

Modifica di terze parti

Per citare la voce mdn su contenteditable

L'attributo deve assumere uno dei seguenti valori:

  • true o la stringa vuota, che indica che l'elemento deve essere modificabile;

  • false, che indica che l'elemento non deve essere modificabile.

Se questo attributo non è impostato, il suo valore predefinito viene ereditato dal suo elemento padre.

Questo attributo è enumerato e non booleano. Ciò significa che l'uso esplicito di uno dei valori true, false o della stringa vuota è obbligatorio e che una scorciatoia ... non è consentita.

// wrong not allowed
<label contenteditable>Example Label</label> 

// correct usage
<label contenteditable="true">Example Label</label>.

Strano. Di solito il valore dell'attributo non lo è true, è qualunque sia il nome. Ad esempio <td contenteditable='contenteditable'></td>,.
trysis

1
Possibili stati di contenteditable : contenteditable ** = "" o ** contenteditable ** = "true" Indica che l'elemento è modificabile. ** contenteditable ** = "false" Indica che l'elemento non è modificabile. ** contenteditable ** = "inherit" Indica che l'elemento è modificabile se il suo elemento genitore immediato è modificabile. Questo è il valore predefinito. Quando aggiungi ** contenteditable a un elemento, il browser renderà quell'elemento modificabile. Inoltre, anche qualsiasi figlio di quell'elemento diventerà modificabile a meno che gli elementi figlio non siano esplicitamente ** contenteditable ** = "false".
vardhan

1
Lo so, ho solo pensato che fosse peculiare perché la maggior parte degli altri attributi non hanno quella sintassi.
trysis

17

Ho tre approcci, qui puoi usare entrambi <input>o <textarea>secondo le tue esigenze.

1. Usa Input in <td>.

Usando l' <input>elemento in tutti <td>i messaggi,

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

Inoltre, potresti voler ridimensionare l'input alla dimensione del suo td. ex.,

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

È inoltre possibile modificare il colore del bordo della casella di immissione quando non viene modificata.

2. Usa contenteditable='true'attributo. (HTML5)

Tuttavia, se si desidera utilizzare contenteditable='true', è possibile salvare anche i valori appropriati nel database. Puoi ottenere questo risultato con ajax.

È possibile allegare keyhandlers keyup, keydown, keypressecc per il <td>. Inoltre, è bene usare un po 'di delay () con quegli eventi quando l'utente digita continuamente, l'evento ajax non si attiverà ad ogni pressione del tasto dell'utente. per esempio,

$('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. Aggiungi <input>a <td>quando viene cliccato.

Aggiungi l'elemento di input tdquando si <td>fa clic su, sostituisci il suo valore in base al tdvalore di. Quando l'ingresso è sfocato, modificare il valore di `td con il valore dell'ingresso. Tutto questo con javascript.


Sfortunatamente ti sei perso la parte della domanda "Come rendere modificabile la cella della tabella HTML?" specialmente nell'esempio 2. L'utente ha chiesto come ottenere questo risultato su doubleclick. Puoi gentilmente implementare la parte mancante?
Robert

@BhaveshGangani ho qualche problema con contenteditable=truepuoi aiutarmi in questo per favore?

1
Certo che posso provare. Hai un violino per questo?
Bhavesh Gangani,

6

Questo è un esempio eseguibile.

$(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;
    });
  });
});
<html>
    <head>
        <!-- jQuery source -->
        <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
    </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>
    </body>
</html>



4

Prova questo codice.

$(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");
 });
 });
});

Puoi anche visitare questo link per maggiori dettagli:


Per evitare problemi in IE con $ (this) .children (). First (). Focus (); - stackoverflow.com/a/3562193/5234417
Alexei Zababurin


4

Lo sto usando per il campo modificabile

<table class="table table-bordered table-responsive-md table-striped text-center">
  <thead>
    <tr>
      <th class="text-center">Citation</th>
      <th class="text-center">Security</th>
      <th class="text-center">Implementation</th>
      <th class="text-center">Description</th>
      <th class="text-center">Solution</th>
      <th class="text-center">Remove</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td class="pt-3-half" contenteditable="false">Aurelia Vega</td>
      <td class="pt-3-half" contenteditable="false">30</td>
      <td class="pt-3-half" contenteditable="false">Deepends</td>
      <td class="pt-3-half" contenteditable="true"><input type="text" name="add1" value="spain" class="border-none"></td>
      <td class="pt-3-half" contenteditable="true"><input type="text" name="add1" value="marid" class="border-none"></td>
      <td>
        <span class="table-remove"><button type="button"
                              class="btn btn-danger btn-rounded btn-sm my-0">Remove</button></span>
      </td>
    </tr>
  </tbody>
</table>



3

Questo è il punto essenziale anche se non è necessario rendere il codice così disordinato. Invece potresti semplicemente iterare attraverso tutto <td>e aggiungere il <input>con gli attributi e infine inserire i valori.

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

questo è in realtà così semplice, questo è il mio HTML, jQuery sample .. e funziona come un fascino, creo tutto il codice utilizzando un campione di dati json online. Saluti

<< 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>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.