単純なアプローチは、Edit your content
パーツを独自のコンテナにラップして、そのコンテナのコンテンツを保存時に完全に置き換えることができる場合です。
<div id="div1">
<span class="content">Edit your content</span>
<a id="link1" href="#">click to Edit</a>
<textarea id="text1" cols="3"></textarea>
<input type="button" id="button1" value="Save" />
</div>
$('#div1 > a').click(function() {
var parent = $(this).closest('div');
parent.find('textarea').val(parent.find('.content').html());
parent.find(':input, .content, a').toggle();
});
$('#div1 > input[type=button]').click(function() {
var parent = $(this).closest('div');
parent.find('.content').html(parent.find('textarea').val());
parent.find(':input, .content, a').toggle();
});
デモ
この特定の例では、 の宣言をparent
簡単に置き換えることができますが、このコードを使用すると、セレクターを複数の要素に一致するもの (つまり; demo )に簡単に変更できます。#div1
#div1 > a
.editable > a
編集
初めてあなたの質問を読み違えたようですが、変更点はそれほど大きくありません。
テキストボックスを の値に設定するのではなく、.content
表示するたびにクリアします。.content
また、編集リンクがクリックされるたびに を隠したくない場合もあります。保存ボタンをクリックすると、.content
既存の要素を更新するのではなく、新しい要素を作成し、最後の の後に追加します。
$('#div1 > a').click(function() {
var parent = $(this).closest('div');
parent.find('textarea').val('');
parent.find(':input, a').toggle();
});
$('#div1 > input[type=button]').click(function() {
var parent = $(this).closest('div');
$('<div/>', { 'class': 'content' })
.html(parent.find('textarea').val())
.insertAfter(parent.find('.content:last'));
parent.find(':input, a').toggle();
});
ブロックレベルの動作のため、 に変更.content
したことに注意してください。div
もちろん、これは最初のマークアップにも反映されます。
デモ
編集 (2)
リンクのクリック時にテキストエリアと保存ボタンを追加することについて、コメントで質問を説明するには、いくつかの変更を加える必要があります。まず、リンク クリック リスナは、要素を追加するコードで更新する必要があります。おそらく、要素が既に存在するかどうかを確認するための最初のチェック (つまり、リンク ボタンの 2 回目のクリック) を行う必要があります。
$('#div1 > a').click(function() {
var parent = $(this).closest('div');
var txt = parent.find('textarea');
if(txt.length == 0) {
txt = $('<textarea/>', { id: 'text1', cols: 3 });
txt.appendTo('#div1');
$('<input />', { type: 'button', id: 'button1' }).val('Save').appendTo('#div1');
}
txt.val('');
parent.find(':input, a').toggle();
});
第二に、セレクターが評価される時点でドキュメントにそのようなボタンがないため、リスナー$('#div1 > input[type=button]')
は記述どおりに機能しなくなります。これを修正するには、次のようなライブ デリゲートを使用できます。
$('#div1').on('click', 'input[type=button]', function() { ... });
デモ。(以前のバージョンの jQuery では、では.delegate(selector, event, handler)
なくを使用して.on(event, selector, handler)
ください。)
... または、ボタンを作成するときにすぐにリスナーをボタンに追加することもできます。
$('<input />', { type: 'button', id: 'button1' })
.val('Save')
.appendTo('#div1')
.click(saveEdit);
デモ
おまけとして、これらのデモで表示した後、テキスト ボックスにフォーカスを追加しています。あなたもそれを望むかもしれません。