Использование jQuery для редактирования отдельных ячеек таблицы

Как я могу использовать jQuery, чтобы щелкнуть ячейку таблицы и отредактировать ее содержимое. Существует определенный столбец, который содержит несколько абзацев данных, поэтому, если возможно, создайте всплывающее окно с большой текстовой областью (или, в идеале, HTML-редактор).

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

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


person mrpatg    schedule 03.08.2009    source источник


Ответы (10)


Вы можете проверить подключаемый модуль jqGrid.

person Daniel Moura    schedule 03.08.2009

Учитывая, что этой странице уже 3 года, и это первый результат поиска в Google, я подумал, что это связано с более актуальным ответом. Учитывая вес и сложность описанных выше плагинов, я подумал, что более простое, без излишеств и более прямое решение также может быть оценено теми, кто ищет альтернативы.

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

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

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

Этот пример работает с одним кликом, но некоторые люди предпочитают двойной щелчок, на ваш выбор.

$.fn.makeEditable = function() {
  $(this).on('click',function(){
    if($(this).find('input').is(':focus')) return this;
    var cell = $(this);
    var content = $(this).html();
    $(this).html('<input type="text" value="' + $(this).html() + '" />')
      .find('input')
      .trigger('focus')
      .on({
        'blur': function(){
          $(this).trigger('closeEditable');
        },
        'keyup':function(e){
          if(e.which == '13'){ // enter
            $(this).trigger('saveEditable');
          } else if(e.which == '27'){ // escape
            $(this).trigger('closeEditable');
          }
        },
        'closeEditable':function(){
          cell.html(content);
        },
        'saveEditable':function(){
          content = $(this).val();
          $(this).trigger('closeEditable');
        }
    });
  });
return this;
}

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

$('.editable').makeEditable();
person Strixy    schedule 21.07.2014
comment
Это не работает для меня - такая простая вещь, как $('td').makeEditable();, не делает ни одну ячейку в одной таблице, которая есть на странице, редактируемой. - person jimiayler; 05.02.2016

Я использую таблицы данных (плагин jQuery), так как это значительно упрощает работу.

Они также говорят использовать плагин jEditable с их плагином. Позволяет сделать строки доступными для редактирования: Ссылка: редактируемая таблица (включает пример кода)

person Andrew    schedule 07.02.2011

Попробуйте это простое решение:

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

        var inputNewText = prompt("Enter new content for:", OriginalContent);

        if (inputNewText != null) {
            $(this).text(inputNewText)
        }
    });
});
person markouuu    schedule 16.09.2013

Плагин jEditable поможет вам редактировать таблицу на месте.

$(document).ready(function() {
    $('td').editable('http://www.example.com/save.php');
});
person RaYell    schedule 03.08.2009

Сделать контент редактируемым можно с помощью таких плагинов, как jQuery Editable один. Насколько легко это было бы перевести на таблицу без идентификаторов, я не уверен.

Чтобы просмотреть вашу таблицу (и я предполагаю, что ваша таблица либо имеет собственный идентификатор, либо является единственной таблицей на странице), было бы достаточно просто, если бы вы смогли заставить этот плагин работать:

$('#myTable td').editable();

Но это не дает вам редактора форматированного текста, который вам нужен. Другой подход — забыть об этом плагине и попробовать использовать диалог пользовательского интерфейса jQuery.

$('#myTable td').click(function(){
  $('myDialog').dialog('open');
});

Предполагая, что вы разместили в этом диалоговом окне редактор форматированного текста, вы можете использовать $.ajax() для отправки результата в какую-либо службу на стороне сервера.

Наконец, вам может подойти jqGrid, в зависимости от данных, которые вы хотите в своей таблице.

person Phil.Wheeler    schedule 03.08.2009

Код Inkedmn не работает как есть, но это самый простой способ сделать это как идею: Итак, проверьте следующий рабочий код, основанный на его логике:

$(function() {
    $('#overlay').hide();
    $('td').click(function(event) {
        var myText = '';
        $('#overlay').show();
        var o = $(this);
        $('#closeLink').click(function(event) {
            event.preventDefault();
            myText = $('#overlay textarea').val();
            $(o).html(myText);
            $(this).parent().hide(500);
        });                  
    });
});
person Murat Kazanova    schedule 07.02.2011
comment
что такое элемент #overlay? Это элемент ввода текста? - person Nilesh; 16.02.2011
comment
overlay - это идентификатор элемента div, в который я поместил текстовое поле и кнопку ссылки (с идентификатором closelink) внутри - person Murat Kazanova; 27.02.2011

$("td").click(function(event){
    var myText = '';
    $("myOverlayThing").show();
    $("myOverlayThingCloseLink").click(function(event){
        event.preventDefault();
        myText = $("myOverlayThing.textarea").val();
    });
    $(this).html(myText);
});

Вероятно, это немного сложнее, но это основная идея без просмотра вашего HTML.

person brettkelly    schedule 03.08.2009
comment
Я пробовал, все, что он делает, это исчезает ячейка, оставляет ее пустой. - person mrpatg; 04.08.2009

Плагин JQuery Datatables Editable кажется лучше, чем официальный плагин Editable Table, потому что первый поддерживает оперативное редактирование и имеет открытый исходный код.

person HRJ    schedule 01.07.2012

на самом деле это так просто, это мой образец 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>
person Mahmoud Sayed    schedule 10.07.2016
comment
О, так что jsonplaceholder.typicode.com/posts — это действительно рабочий URL-адрес. - person Kari Kääriäinen; 07.03.2017