電子書籍の厳選無料作品が豊富!

2列のテーブルを表示するHTMLで、左の列は項目名、
右の列は何かの値とします。最初に表示するときは
テーブルのような形で表示しておきたい(入力など
一切できないようにする)のですが、例えばボタン
を押下することによって、編集モードに移り、
テーブルの右側の値を変更できるようにしたいのです。

値を変更するには、入力フィールドにしなければいけ
ないと思いますが、JavaScript等でそのようなことが
できるのでしょうか?


参考になるURL等の情報でも構いません。
よろしくお願いします。

A 回答 (4件)

ちょっと長いけど新しいブラウザならおおむね動きそうなサンプル。



送信するとなると name が重要だけど、どうするかわからなかったので適当に処理。

<html>
<head>
<title>テーブルの編集・送信</title>

<script type="text/javascript">
<!--
function formCancel(buttonObj,tableId) {
buttonObj.value="→編集モード";
buttonObj.onclick=function(){return formActive(this,tableId)};
buttonObj.parentNode.removeChild(buttonObj.previousSibling);
var oTbl = document.getElementById(tableId);
var oTbod = oTbl.tBodies[0];
for(var i=0;i<oTbod.rows.length;i++){
oCell = oTbod.rows[i].cells[1];
var Text = oCell.firstChild.defaultValue;
oCell.replaceChild(document.createTextNode(Text),oCell.firstChild);
}

return true;
}
function formActive(buttonObj,tableId) {
var oTbl = document.getElementById(tableId);
if(! oTbl) {
alert('動作対象のブラウザではありません。');
return false;
}
buttonObj.value="キャンセル";
buttonObj.onclick=function(){return formCancel(this,tableId)};
newSubmit = document.createElement('input');
newSubmit.type="submit";
newSubmit.value="送信する";
buttonObj.parentNode.insertBefore(newSubmit,buttonObj);

var oTbod = oTbl.tBodies[0];
for(var i=0;i<oTbod.rows.length;i++){
oCell = oTbod.rows[i].cells[1];
var Text = oCell.firstChild.nodeValue;
newInput = document.createElement('input');
newInput.type = 'text';
// nameはセルのタイトルから設定。
newInput.name =oCell.title;
// 幅の値は適当に変更して。
newInput.size = 5;
newInput.value = Text;
newInput.defaultValue = Text;
oCell.replaceChild(newInput,oCell.firstChild);
}

return false;
}
//-->
</script>

</head>
<body>

<form action="" method="get">

<table border id="dataTable">
<thead><tr><th>項目名</th><th>値</th></tr></thead>
<tbody>
<tr><td>ID</td><td title="id">123</td></tr>
<tr><td>名前</td><td title="name">unknown</td></tr>
<tr><td>その他</td><td title="other">abc</td></tr>
</tbody>
<tbody>
<tr><td colspan=2><input type="reset" value="→編集モード"
onclick="return formActive(this,'dataTable')">
</td></tr>
</tbody>
</table>

</form>

</body>
</html>

この回答への補足

ありがとうございました。
参考にさせていただきます。

補足日時:2005/09/09 09:10
    • good
    • 0

disabledかreadonlyに設定した入力フィールドの属性を変更するだけの方がテキスト→入力フィールドに変更するより簡単そうですね。



ところでBLUEPIXYさんのおっしゃるとおり、編集可能に変更するだけでは意味がなさそうなんですが編集可能に変更した後、CGIかなにかにフォームとして送信するんでしょうか?

この回答への補足

皆様ありがとうございます。

編集可能にしたあと、フォームとして送信したいです。
教えて頂いた方法では送信はできないんですね?
送信するにはどうすればよいのでしょうか?
こちらでもいろいろ調べてはいるのですが・・

よろしくお願いします。

補足日時:2005/09/08 13:12
    • good
    • 0

サンプルを作ってみました。

IEで動作します。(他では動作しません)
というか、編集できたとしても、保存できないからあまり意味が無いように思いますが・
---------------------------------------------------------------
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=SHIFT_JIS">
<title>テーブルの中身の変更</title>
<script type="text/javascript">
<!--
function edit(td){
td.innerHTML="<input type='text' value='"+td.innerText+"' onblur='restore(this)'>";
}
function restore(inp){
inp.outerText=inp.value;
}
//-->
</script>
</head>
<body>
値の列をダブルクリックして値を変更できます。<br>
変更が終わったら、セルの外をクリックして下さい<br>
<table border="1" cellspacing="0">
<col align="center"><col align="right" style="width:3em">
<tr><th>項目名</th><th align="center">値</th></tr>
<tr><td>A</td><td ondblclick="edit(this)">123</td></tr>
<tr><td>B</td><td ondblclick="edit(this)">789</td></tr>
</table>
</body>
</html>
    • good
    • 0

TDタグのinnerHTMLを書き換えてあげればできると思います。



--サンプル--
<table>
<tr><td id="td1">TEST</td><td><input type="button" onclick="change('td1');" value="編集"></tr>
</table>

function change(id){
var e = document.getElementById(id);
var v = e.innerHTML;
e.innerHTML = "<input type=\"text\" value=\"" + v + "\">";
}
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!