Как сделать ячейку таблицы HTML редактируемой?

103

Я хотел бы сделать некоторые ячейки таблицы html доступными для редактирования, просто дважды щелкните ячейку, введите текст, и изменения можно будет отправить на сервер. Я не хочу использовать некоторые инструменты, такие как сетка данных dojo. Потому что он предоставляет некоторые другие функции. Не могли бы вы дать мне какой-нибудь фрагмент кода или дать совет, как его реализовать?

wqfeng
источник

Ответы:

118

Вы можете использовать атрибут contenteditable в соответствующих ячейках, строках или таблице.

Обновлено для совместимости с 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>

Просто обратите внимание, что если вы сделаете таблицу редактируемой, по крайней мере, в Mozilla, вы можете удалять строки и т. Д.

Вам также необходимо проверить, поддерживает ли браузеры вашей целевой аудитории этот атрибут.

Что касается прослушивания изменений (чтобы вы могли отправить их на сервер), см. Contenteditable события изменения

Бретт Замир
источник
Спасибо. Кажется, что в HTML5 поддерживается contenteditable. Я ищу решение, которое работает и в html4.
wqfeng
Хотя он, наконец, кодифицирован в стандарте с HTML5, он уже хорошо поддерживался в большинстве старых браузеров (за исключением только частичной поддержки в FF3): caniuse.com/contenteditable (хотя и не на мобильных устройствах)
Бретт Замир,
Отличный совет. Я это искал. Спасибо вам.
praneybehl
Спасибо за отличный отзыв.
Prasad Rajapaksha
1
Если вам нужна совместимость с IE8, вам просто нужно добавлять contenteditablediv всякий раз, когда вы создаете новый <td>. В противном случае, как упоминалось в сообщении, вы можете добавить contenteditableв ячейки, строки или таблицу.
Бретт Замир
63

HTML5 поддерживает контентную,

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

Стороннее править

Процитировать запись mdn на contenteditable

Атрибут должен принимать одно из следующих значений:

  • true или пустая строка, указывающая на то, что элемент должен быть доступен для редактирования;

  • false, означающее, что элемент нельзя редактировать.

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

Этот атрибут является перечислимым, а не логическим. Это означает, что явное использование одного из значений true, false или пустой строки обязательно, а сокращение ... недопустимо.

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

// correct usage
<label contenteditable="true">Example Label</label>.
вардхан
источник
Странно. Обычно значение атрибута не имеет значения true, как бы там ни было. Например, <td contenteditable='contenteditable'></td>.
trysis 07
1
Возможные состояния contenteditable : contenteditable ** = "" или ** contenteditable ** = "true" Указывает, что элемент доступен для редактирования. ** contenteditable ** = "false" Указывает, что элемент недоступен для редактирования. ** contenteditable ** = "inherit" Указывает, что элемент доступен для редактирования, если его непосредственный родительский элемент доступен для редактирования. Это значение по умолчанию. Когда вы добавляете ** contenteditable к элементу, браузер сделает этот элемент доступным для редактирования. Кроме того, любые дочерние элементы этого элемента также станут доступны для редактирования, если дочерние элементы явно не ** contenteditable ** = «false».
vardhan
1
Я знаю это, я просто подумал, что это странно, потому что у большинства других атрибутов нет такого синтаксиса.
trysis
18

У меня есть три подхода. Здесь вы можете использовать оба <input>или <textarea>в соответствии с вашими требованиями.

1. Используйте ввод <td>.

Используя <input>element во всех <td>s,

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

Кроме того, вы можете изменить размер ввода до размера его td. напр.,

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

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

2. Используйте contenteditable='true'атрибут. (HTML5)

Однако, если вы хотите использовать contenteditable='true', вы также можете сохранить соответствующие значения в базе данных. Вы можете добиться этого с помощью ajax.

Вы можете прикрепить keyhandlers keyup, keydown, и keypressт.д. в <td>. Кроме того, хорошо использовать некоторую задержку () с этими событиями, когда пользователь непрерывно печатает, событие ajax не будет срабатывать при каждом нажатии клавиши пользователем. например,

$('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. При щелчке добавить <input>к <td>.

Добавьте элемент ввода tdпри <td>нажатии, замените его значение в соответствии tdсо значением. Когда ввод размыт, измените значение `td на значение ввода. Все это с помощью javascript.

Бхавеш Гангани
источник
К сожалению, вы пропустили часть вопроса "Как сделать ячейку таблицы HTML редактируемой?" особенно в примере 2. Пользователь спросил, как этого добиться при двойном щелчке. Не могли бы вы реализовать недостающую часть?
Роберт
@BhaveshGangani, у меня проблема, contenteditable=trueвы можете мне помочь, пожалуйста?
1
Конечно, я могу попробовать. У вас есть скрипка на js для этого?
Бхавеш Гангани
7

Это работоспособный пример.

$(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 Артур
источник
4

Попробуйте этот код.

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

Вы также можете посетить эту ссылку для получения более подробной информации:

user3751006
источник
Чтобы избежать проблем в IE с $ (this) .children (). First (). Focus (); - stackoverflow.com/a/3562193/5234417
Алексей Забабурин
4

Просто вставьте <input>элемент <td>динамически, щелкнув ячейку. Только простой HTML и Javascript. Нет необходимости contentEditable, jquery,HTML5

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

гсиванов
источник
4

Я использую это для редактируемого поля

<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

Если вы используете JQuery, этот плагин поможет вам просто, но он хорош.

https://github.com/samuelsantosdev/TableEdit

пользователь3333866
источник
2
Похоже, интересный плагин. Документацию по его использованию можно найти в файле index.html. Пожалуйста, загляните на meta.stackexchange.com/questions/8231/…, чтобы понять, почему включение большего количества информации, чем просто ссылка, дает лучший ответ.
Джейсон Аллер
3

Это важный момент, хотя вам не нужно делать код настолько беспорядочным. Вместо этого вы можете просто перебрать все, <td>добавить <input>атрибуты и, наконец, ввести значения.

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
источник
0

На самом деле это так просто, это мой образец HTML, jQuery ... и он работает как шарм, я создаю весь код, используя онлайн-образец данных json. ура

<< 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>
Махмуд Сайед
источник