奇怪的是 - 我已经设置了jQuery效果来编辑用户的传记。基本上,他们可以单击文本并创建textarea。这工作正常,接管工作正常......但只有一次?
HTML:
mydata<-data.frame(height=NA)
mydata$height<-as.double(mydata$height)
typeof(mydata$height)
js(精简和精简):
<p id="bioEdit" style="text-align: center;" data-editable>{{ some.user.bio }}</p>
任何人都可以复制一次只有输入接管吗?如果是这样,您是否知道允许用户多次编辑的任何方法?
答案 0 :(得分:1)
仔细看看这一行:
$('#bioEdit').replaceWith( $input );
您删除 #bioEdit
,将$input
放在其位置上。这意味着,网页上不再有#bioEdit
。因此,$('#bioEdit').on('click', ...)
只生效一次。
您可以做的是将#bioEdit
包装在容器中,并仅替换容器内容:
<div id="bioEditContainer">
<p id="bioEdit" style="text-align: center;" data-editable>{{ some.user.bio }}</p>
</div>
$('#bioEditContainer').on('click', function() {
$('#bioEdit').replaceWith( $input );
答案 1 :(得分:1)
您在编辑后创建新的DOM元素,而您的点击处理程序绑定到旧的元素。如果您希望您的点击处理程序也可以处理新创建的元素,则需要对其进行修改以使用委托事件。
$(document).on('click', '#bioEdit', function() {
// Your code here
});
您可以.clone(true)
<p>
元素,然后将其替换为<input>
,然后将输入替换为克隆副本。见https://api.jquery.com/clone/。提供克隆的true
将使用事件复制元素。
然而,每当用户想要编辑文本时,第一种方法将更好地工作并且将使用比克隆元素更少的内存和资源。
答案 2 :(得分:1)
使用.replaceWith
您可以通过创建可重复使用的功能重新附加事件:
function editFn() {
var $input = $('<textarea class="form-control" style="160px"/>').val($('#bioEdit').text());
$('#bioEdit').replaceWith($input);
var save = function() {
var $p = $('<p id="bioEdit" style="text-align: center;" data-editable />').text($input.val());
var biography = $input.val()
$input.replaceWith($p);
$('#bioEdit').on('click', editFn);
};
$input.one('blur', save).focus();
}
$('#bioEdit').on('click', editFn); // attach the event handler here
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<p id="bioEdit" style="text-align: center;" data-editable>{{ some.user.bio }}</p>
&#13;