Javascript 保留dom元素的旧值
我有以下由django呈现的html。下面是一个例子,说明它是如何实现的 html 和jsJavascript 保留dom元素的旧值,javascript,jquery,django,Javascript,Jquery,Django,我有以下由django呈现的html。下面是一个例子,说明它是如何实现的 html 和js $("#save-phrase").on('click', function (event) { form = $("form#add-phrase") form.submit(); }); $(".edit-phrase").on('click', function(event){ event.preventDefault(); var inputBox; v
$("#save-phrase").on('click', function (event) {
form = $("form#add-phrase")
form.submit();
});
$(".edit-phrase").on('click', function(event){
event.preventDefault();
var inputBox;
var form = $(this).parent('form');
var p = $(this).siblings('p');
var input = '<input type="text" data-id="'+p.attr('data-id')+'" class="form-control input-sm col-md-4" id="id_phrase" name="phrase" value="'+p.text()+'">';
console.log(input);
if($(this).text() === 'Edit'){
p.replaceWith(input);
form.append('<button name="delete" class="btn btn-default btn-sm">Delete</button>');
form.append('<input type="submit" name="submit" class="btn btn-default btn-sm" value="Save">');
$(this).text('Cancel');
}else{
console.log(p);
inputBox = $(this).siblings('input#id_phrase');
console.log(inputBox);
p.text(inputBox.val());
inputBox.replaceWith('<p class="text-info" data-id="'+inputBox.attr('data-id')+'">'+inputBox.val()+'</p>');
$(this).siblings('input[type="submit"]').remove();
$(this).siblings('button').remove();
$(this).text('Edit');
}
});
$(“#保存短语”)。在('click',函数(事件){
表格=$(“表格#添加短语”)
表单提交();
});
$(“.edit phrase”)。在('click',函数(事件){
event.preventDefault();
var输入框;
var form=$(this.parent('form');
var p=$(this.sibbines('p');
var输入=“”;
控制台日志(输入);
如果($(this).text()='Edit'){
p、 替换为(输入);
格式。追加(‘删除’);
格式。附加(“”);
$(this.text('Cancel');
}否则{
控制台日志(p);
inputBox=$(this).sibbines('input#id_短语');
控制台日志(输入框);
p、 文本(inputBox.val());
inputBox.replaceWith(““+inputBox.val()+”);
$(this).sides('input[type=“submit”]').remove();
$(this.sides('button').remove();
$(this.text('Edit');
}
});
它的作用如下:
它用表单的输入元素部分替换了一个p dom元素,并发布了编辑短语或删除短语(如果按Delete)的命令。除了一件事之外,一切正常。当用户点击cancel时,它会将输入框替换为上一个p。但按照我编写代码的方式,旧的p会丢失,因此当用户取消替换它的p值时,它将是最后键入的值,而该值应该是原始值(编辑之前)。如何保存旧值。我不能使用一个或两个全局,因为这些短语是动态添加的。请注意,用户可以同时编辑三个短语(但一次只能保存一个)。您认为如果一次只编辑一个短语会更好吗?这将解决编辑前保存短语初始值的问题
这是它的主要部分。我编辑了一个适合这个问题的:
编辑p
时,为将来克隆元素,然后用副本替换元素。通过将p
的完整克隆存储在其自己的数据
属性中,它保留自己的历史记录。您可以多次单击“撤消”,因为它将继续从其数据中弹出自己的历史记录
$('.edit-phrase').on('click', function() {
var p = $(this).siblings('p');
p.data('my_clone', $(p).clone(true));
// continue with rest of the logic
});
$('.cancel-edit').on('click', function() {
var p = $(this).siblings('p');
p.replaceWith($(p).data('my_clone'));
// continue with rest of the logic
});
文件:
既然你有一个很好的id,那么哈希表怎么样
var cache = {};
需要缓存时
cache[inputBox.attr('data-id')] = p.clone();
当您想要检索p的旧版本时,使用id从哈希表中获取它
如果要存储p的多个版本,请使用哈希表,并将每个元素作为一个实现为堆栈的数组
欢呼声
见我以前的答案:我没有.取消编辑按钮,逻辑是在同一个按钮上实现的,但是谢谢你的回答。我认为把演示和逻辑混合起来是不好的做法(<代码>如果($(this).To())=(=‘编辑’)< /代码>)。文本“编辑”是表示层。使用类名来驱动你的控制器。那么你是建议使用两个单独的按钮?还是仅仅更改现有按钮的类。如果第二个选择正确,我应该使用一个代理?两个选择都可以。想象一下,如果您更改按钮的文本。想象一下,这个可怜的灵魂在未来维护着这个代码。是的,我明白你的意思,我想我会根据你的建议修改我的代码
var cache = {};
cache[inputBox.attr('data-id')] = p.clone();