¿Cómo hacer que la celda de la tabla HTML sea editable?

102

Me gustaría hacer editables algunas celdas de la tabla html, simplemente haga doble clic en una celda, ingrese algo de texto y los cambios se pueden enviar al servidor. No quiero usar algunos conjuntos de herramientas como la cuadrícula de datos de dojo. Porque proporciona algunas otras características. ¿Me proporcionaría algún fragmento de código o consejos sobre cómo implementarlo?

wqfeng
fuente

Respuestas:

116

Puede utilizar el atributo contenteditable en las celdas, filas o tabla en cuestión.

Actualizado para compatibilidad 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>

Solo tenga en cuenta que si hace que la tabla sea editable, al menos en Mozilla, puede eliminar filas, etc.

También debería comprobar si los navegadores de su público objetivo admitían este atributo.

En cuanto a escuchar los cambios (para que pueda enviarlos al servidor), consulte los eventos de cambio que se pueden contentar

Brett Zamir
fuente
Gracias. Parece que contenteditable es compatible con HTML5. Estoy buscando una solución que también funcione en html4.
wqfeng
Aunque finalmente está codificado en el estándar con HTML5, ya estaba bien admitido en la mayoría de los navegadores más antiguos (con la excepción del soporte parcial en FF3): caniuse.com/contenteditable (aunque no en dispositivos móviles)
Brett Zamir
Buen consejo. Lo estaba buscando. Gracias.
praneybehl
Gracias por el gran consejo.
Prasad Rajapaksha
1
Si necesita compatibilidad con IE8, solo tiene que agregar el contenteditablediv cada vez que cree un nuevo <td>. De lo contrario, como se menciona en la publicación, puede agregar el contenteditableen las celdas, filas o tabla.
Brett Zamir
61

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

Tercero editar

Para citar la entrada mdn en contenteditable

El atributo debe tomar uno de los siguientes valores:

  • verdadero o la cadena vacía, que indica que el elemento debe ser editable;

  • false, que indica que el elemento no debe ser editable.

Si no se establece este atributo, su valor predeterminado se hereda de su elemento padre.

Este atributo es enumerado y no booleano. Esto significa que el uso explícito de uno de los valores verdadero, falso o la cadena vacía es obligatorio y que no se permite una abreviatura ...

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

// correct usage
<label contenteditable="true">Example Label</label>.
vardhan
fuente
Extraño. Por lo general, el valor del atributo no lo es true, es el nombre que sea. Por ejemplo <td contenteditable='contenteditable'></td>,.
Trysis
1
Posibles estados de contenteditable : contenteditable ** = "" o ** contenteditable ** = "true" Indica que el elemento es editable. ** contenteditable ** = "false" Indica que el elemento no es editable. ** contenteditable ** = "heredar" Indica que el elemento es editable si su elemento padre inmediato es editable. Este es el valor predeterminado. Cuando agrega ** contenteditable a un elemento, el navegador hará que ese elemento sea editable. Además, todos los elementos secundarios de ese elemento también serán editables a menos que los elementos secundarios sean explícitamente ** contenteditable ** = "falso".
vardhan
1
Lo sé, pensé que era peculiar porque la mayoría de los otros atributos no tienen esa sintaxis.
Trysis
17

Tengo tres enfoques, aquí puede usar ambos <input>o <textarea>según sus requisitos.

1. Utilice Entrada en <td>.

Usando <input>elemento en todos los <td>s,

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

Además, es posible que desee cambiar el tamaño de la entrada al tamaño de su td. ex.,

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

Además, puede cambiar el color del borde del cuadro de entrada cuando no se está editando.

2. Utilice contenteditable='true'atributo. (HTML5)

Sin embargo, si desea utilizarlo contenteditable='true', es posible que también desee guardar los valores adecuados en la base de datos. Puede lograr esto con ajax.

Puede adjuntar keyhandlers keyup, keydown, keypressetc a la<td> . Además, es bueno usar algo de delay () con esos eventos cuando el usuario escribe continuamente, el evento ajax no se activará con cada tecla que presione el usuario. por ejemplo,

$('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. Agregar <input>a <td>cuando se hace clic en él.

Agregue el elemento de entrada tdcuando <td>haga clic en, reemplace su valor de acuerdo con el tdvalor de. Cuando la entrada está borrosa, cambie el valor de `td con el valor de la entrada. Todo esto con javascript.

Bhavesh Gangani
fuente
Lamentablemente, se perdió la parte de la pregunta "¿Cómo hacer que la celda de una tabla HTML sea editable?" especialmente en el ejemplo 2. El usuario preguntó cómo lograr esto en doubleclick. ¿Puede implementar amablemente la parte que falta?
Robert
@BhaveshGangani tengo algún problema con ¿ contenteditable=truepueden ayudarme en esto por favor?
1
Seguro que puedo intentarlo. ¿Tienes un violín js para eso?
Bhavesh Gangani
6

Este es un ejemplo ejecutable.

$(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>

ACE Arthur
fuente
4

Prueba este código.

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

También puede visitar este enlace para obtener más detalles:

usuario3751006
fuente
Para evitar problemas en IE con $ (this) .children (). First (). Focus (); - stackoverflow.com/a/3562193/5234417
Alexei Zababurin
4

Estoy usando esto para un campo editable

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

bharti parmar
fuente
3

Este es el punto esencial, aunque no es necesario que el código sea tan complicado. En su lugar, podría iterar a través de todos los <td>y agregar <input>los atributos y finalmente poner los valores.

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>

mathmaniac88
fuente
0

esto es realmente tan sencillo, esta es mi muestra HTML, jQuery ... y funciona como un encanto, construyo todo el código usando una muestra de datos json en línea. salud

<< 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>
Mahmoud Sayed
fuente