Это мой список дел, которые я сделал. (Чтобы сделать мой код более читабельным, я попытался прокомментировать его. Надеюсь, это сработало.)
Если вы попробуете мою демонстрацию, вы можете добавить элементы li с помощью кнопки «Добавить». И у элементов li есть еще 2 кнопки. Я хочу создать кнопку изменения, чтобы пользователи могли изменять свои элементы списка. Я понятия не имею, что я могу сделать для этого с jQuery.
Вторая проблема заключается в том, что кнопки списка не работают идеально. Потому что, если я использую один раз кнопку удаления, она меняет кнопку «Готово», чтобы удалить элемент. Но если я не использую кнопку «Удалить», кнопка «Готово» работает хорошо. Я не знаю, почему, может быть, проблема в том же имени класса?
Вот моя демонстрация в JS Bin:https://jsbin.com/natiziqawa/edit?html,js,output
$(document).ready(function(){
$("#add").click(function(){
// Created list elements and their's buttons
var list_item =document.createElement("li");
var remove_button=document.createElement("button");
var done_button=document.createElement("button");
// append the buttons some string to caption buttons
$(remove_button).append("Delete");
$(done_button).append("Done");
// added class name the items to to distinguish them
$(list_item).addClass("item")
$(remove_button).addClass("delete");
$(done_button).addClass("done");
// filled the created items with the input values
var list_text =$("#input").val();
var time=$("#time").val();
// filled the list item with their's buttons and class names and input values
$(list_item).append(time," : ",list_text,done_button,remove_button);
// finally fill the ul with list items but first check out what is written in the input
if (input.value= = ""){
alert("Please enter an activity")
}
// If the input has some value can go
else{
$("ul").append(list_item);
// after clicked, clear the input field
$("#input").val("");
// list item's buttons
$(".done").click(function(){
$(list_item).click(function(){
$(this).css("color","white")
$(this).css("text-decoration","line-through")
});
});
$(".delete").click(function(){
$(list_item).click(function(){
$(this).remove()
});
});
}
});// main function close
}); // document ready close
Идея моего решения заключается в использовании атрибута contenteditable
для добавленных полей. Для этого вам нужно динамически обернуть первые два поля в дополнительный div, как показано здесь:
$(list_item).append('<div class = "edit_item" contenteditable = "true">'+time+'</div>'," : ",'<div class = "edit_item" contenteditable = "true">'+list_text+'</div>',done_button,remove_button);
Вам нужно будет заменить этот код существующим. Для лучшего понимания этот код находится в комментарии: "// заполнил элемент списка своими кнопками и именами классов и входными значениями"
Также вам нужно добавить это правило в css для выравнивания полей:
.edit_item {
display: inline-block;
}
А по второму вопросу:
У вас возникла проблема с таргетингом. Вы должны обратиться к текущему list_item
, используя метод closest()
.
Для отметки:
$(".done").click(function(){
$(this).closest(list_item).css("color","white")
$(this).closest(list_item).css("text-decoration","line-through");
});
Для удаления:
$(".delete").click(function(){
$(this).closest(list_item).remove();
});
Я попробовал ваш код, и ничего себе, он работает. Спасибо . Раньше я не знал contenteditable. О моих кнопках, попробуйте еще раз, добавьте 5 элементов и используйте один раз кнопку удаления на первом элементе, а затем используйте кнопку «Готово» на последнем элементе. Это будет удалено.
@EndreKovács, привет. Да, есть такая проблема. Я обновил свой ответ и дал вам код. Это сработало отлично для меня.
Спасибо большое работает. Можете ли вы сказать мне, почему не работает код?
@EndreKovács, потому что вы обернули два клика по разным селекторам, сделав их родительско-дочерними - это неправильно.
Вам нравится jsfiddle.net?