web-dev-qa-db-ja.com

HTMLテーブルセルを編集可能にする方法

Htmlテーブルのいくつかのセルを編集可能にして、セルをダブルクリックし、テキストを入力すると、変更をサーバーに送信できます。 dojo data gridのようなツールキットを使いたくありません。それはいくつかの他の機能を提供するためです。コードスニペットまたは実装方法に関するアドバイスを教えてください。

85
wqfeng

問題のセル、行、またはテーブルで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 change events を参照してください

104
Brett Zamir

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>

サードパーティ編集

contenteditableのMDNエントリ を引用するには

属性は、次の値のいずれかを取る必要があります。

  • trueまたは空の文字列。要素が編集可能である必要があることを示します。

  • false。要素が編集可能でないことを示します。

この属性が設定されていない場合、そのデフォルト値はその親要素から継承されます。

この属性は列挙型であり、ブール型ではありません。これは、値true、false、または空の文字列のいずれかを明示的に使用することが必須であり、略記...が許可されていないことを意味します。

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

// correct usage
<label contenteditable="true">Example Label</label>.
43
vardhan

3つのアプローチがあります。ここでは、要件に応じて<input>または<textarea>の両方を使用できます。

1。 <td>で入力を使用します。

すべての<input>sで<td>要素を使用して、

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

また、入力をtdのサイズにサイズ変更することもできます。例:

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

入力ボックスが編集されていないときは、さらに入力ボックスの境界線の色を変更できます。

2。 contenteditable='true'属性を使用します。 (HTML5)

ただし、contenteditable='true'を使用する場合は、適切な値をデータベースに保存することもできます。これはajaxで実現できます。

キーハンドラーkeyupkeydownkeypressなどを<td>にアタッチできます。また、ユーザーが連続して入力するイベントで delay() を使用すると、ユーザーがキーを押すたびに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で行います。

16
Bhavesh Gangani

このコードを試してください。

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

詳細については、次のリンクもご覧ください。

4
user3751006

X-editableを使用できます https://vitalets.github.io/x-editable/ ブートストラップからの素晴らしいライブラリ

4
Ahmad Halah

これは、実行可能な単一の例です。

 <html>
    <head>
        <script src="http://cdn.bootcss.com/jquery/3.1.1/jquery.min.js"></script> <!-- jQuery source -->
    </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>
        <script>
        $(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;
                });
            });
        });
        </script>
    </body>
</html>
3
ACE Arthur

Jqueryを使用している場合、このプラグインは簡単ですが、便利です

https://github.com/samuelsantosdev/TableEdit

3
user3333866

<input>要素を<td>にセルクリックで動的に挿入するだけです。単純なHTMLおよびJavascriptのみ。 contentEditablejqueryHTML5は不要です

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

2
gsivanov

これは実際には非常に簡単です。これは私の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
Mahmoud Sayed

コードをこのように面倒にする必要はありませんが、これは重要なポイントです。代わりに、すべての<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>
0
awesomeguy