最简单的方法是,如果该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
编辑
看来我第一次误读了您的问题,但变化并没有那么大。
与其将文本框设置为 your 的值,不如在.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
为 a div
,因为它的块级行为。这当然也应该反映在初始标记中。
演示
编辑 (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);
演示
作为奖励,在这些演示中显示文本框后,我将焦点添加到文本框。你可能也想要那个。