2009-08-03 18 views
12

Come posso usare jQuery per fare clic su una cella di tabella e modificarne il contenuto. C'è una colonna particolare che contiene diversi paragrafi di dati, quindi se possibile, avere una finestra pop-up con una grande area di testo (o idealmente un editor HTML).Uso di jQuery per modificare singole celle di tabella

Le modifiche devono essere solo superficiali poiché sto utilizzando un altro plug-in jQuery per analizzare il contenuto della tabella ed esportarlo in qualcos'altro.

Difficoltà, nessuna cella può avere nomi univoci o identificativi.

risposta

3

È possibile controllare il plug-in jqGrid.

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

Probabilmente un po 'più complicato di così, ma questa è l'idea di base senza vedere il tuo HTML.

+0

ho provato, non fa altro che scompare la cellula, lascia vuoto. – mrpatg

3

jEditable plug-in può aiutarti a modificare il tuo tavolo.

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

Fare contenuto modificabile può essere raggiunto con plugin come l'jQuery Editable uno. Ma quanto sarebbe facile da tradurre su un tavolo senza id, non ne sono sicuro.

per attraversare il vostro tavolo (e sto assumendo la vostra tavola o ha un ID del proprio o è l'unica tabella alla pagina) sarebbe ragionevolmente straight-forward se tu fossi in grado di ottenere che il lavoro plugin:

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

Ma questo non ti dà l'editor di testo avanzato che cerchi. L'altro approccio sarebbe quello di dimenticare quel plugin e provare a usare la finestra di dialogo dell'interfaccia utente jQuery.

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

Supponendo si mette un editor rich-text in quella finestra di dialogo, è possibile utilizzare $ .ajax() per inviare il risultato a qualche servizio alla fine del server.

Infine, lo jqGrid potrebbe essere una buona opzione per te, a seconda dei dati che desideri nella tabella.

2

codice di Inkedmn non funzionale come è, ma è il modo più semplice per farlo come idea: in modo da controllare il seguente codice di lavoro in base alla sua logica:

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

qual è l'elemento #overlay? È un elemento di input del testo? L'overlay – Nilesh

+0

è un id di elemento div in cui ho posizionato la textarea e un pulsante di collegamento (con un id di "closelink") all'interno di –

+3

Questa risposta deve mostrare anche l'HTML corrispondente. – HRJ

1

Il plug-in JQuery Datatables Editable sembra essere migliore del plug-in Editable Table ufficiale, perché il primo supporta l'editing in-line ed è open-source.

5

Prova questa soluzione semplice:

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

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

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

Visto che questa pagina non sia sia a 3 anni e il primo risultato in una ricerca su Google ho pensato che fosse a causa di una risposta più attuale. Dato il peso e la complessità delle opzioni di plug-in sopra, ho pensato che una soluzione più semplice, senza fronzoli e più diretta potesse essere apprezzata anche per chi è alla ricerca di alternative.

Questo sostituisce la cella con un input di testo e invita gli eventi personalizzati in modo da poter gestire qualsiasi caso d'uso che si desidera al momento del salvataggio, chiudere, sfocatura, ecc ...

In questo caso l'unico modo per cambiare il l'informazione nella cella è premere enter, ma è possibile personalizzarla se lo si desidera, ad es. potresti voler risparmiare sulla sfocatura.

In questo esempio è anche possibile premere il tasto Esc per interrompere la modifica e riportare la cella a quello che era. Puoi personalizzarlo se vuoi.

Questo esempio funziona con un singolo clic, ma alcune persone preferiscono il doppio clic, a scelta.

$.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; 
} 

È possibile applicare in modo selettivo le cellule modificabili da loro collegando in questo modo, o qualsiasi altra cosa ha senso per il vostro caso.

$('.editable').makeEditable(); 
+0

Questo non funziona per me - qualcosa di semplice come $ ('td'). MakeEditable(); 'non rende modificabile alcuna cella nella tabella che ho sulla pagina. – jimiayler

1

questo è in realtà così semplice, questo è il mio HTML, campione jQuery .. e funziona come un fascino, costruisco tutto il codice utilizzando un campione di dati JSON in linea. applausi

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

Oh, quindi http://jsonplaceholder.typicode.com/posts è un URL di lavoro effettivo. –

Problemi correlati