2009-08-03 3 views
12

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

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

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

ответ

3

Возможно, вы захотите проверить плагин jqGrid.

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

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

+0

Я попробовал, все это делает исчезает клетка, оставляет его пустым. – mrpatg

3

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

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

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

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

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

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

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

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

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

2

код 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); 
     });     
    }); 
}); 
+0

Что такое элемент #overlay? Это элемент ввода текста? – Nilesh

+0

Оверлей - это идентификатор элемента div, в котором я разместил текстовое поле и ссылку (с идентификатором «closelink») внутри –

+3

. В этом ответе должен также отображаться соответствующий HTML-код. – HRJ

12

Я использую Data tables (a jQuery plugin), как это делает все намного проще.

Они также говорят, что используют плагин jEditable со своим плагином. Позволяет создавать строки для редактирования: Link: Editable Table (содержит пример кода)

1

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

5

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

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

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

     if (inputNewText != null) { 
      $(this).text(inputNewText) 
     } 
    }); 
}); 
9

Видя, как эта страница как 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(); 
+0

Это не работает для меня - что-то простое, как '$ ('td'). MakeEditable();' не делает ячейку в одной таблице на странице редактируемой. – jimiayler

1

это на самом деле так прямо вперед, это мой 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> 
+0

О, так что http://jsonplaceholder.typicode.com/posts является фактическим рабочим URL-адресом. –