I’m finding this code extremely problematic, as it will not edit only a single list item (the item that is clicked), but will instead edit all list items at once to the same input. Any advice is appreciated. Fiddle link below:
https://jsfiddle.net/hufflepuff_hamlet/hy564btq/8/
<div>
<form name="checkListForm" class="edit-form">
<input type="text" name="checkListItem"/>
</form>
<div id="button1" value="button">Add!</div>
<div id="button2" value="button">Edit!</div>
<p></p>
<div class="list" id="item"></div>
<p>[Click item on list to edit item]</p>
<p>[Doubleclick item on list to remove item]</p>
</div>
</div>
//adding an item to the list
$(document).ready(function(){
$('#button1').click(function(){
var toAdd = $('input[name=checkListItem]').val();
$('.list').append("<div class='item'>" + toAdd + "</div>" + "<br>");
});
$('.list').click(function(){
});
//removing an item from the list by double-clicking on it
$(document).on('dblclick', '.item', function(){
$(this).remove();
});
//editing an item from the list by clicking on it and the edit button
$(document).on('click', '.item', function(){
var toAdd = $('input[name=checkListItem]').val();
$(this).text();
$(input).text(content);
$(this).remove();
$('#button2').click(function(){
var toAdd = $('input[name=checkListItem]').val();
$('.item').replaceWith("<div class='edit-form'>" + toAdd + "</div>" + "<br>");
});
$('.item').click(function(){
});
});
});
Advertisement
Answer
You need to use contenteditable global attribute
https://developer.mozilla.org/fr/docs/Web/HTML/Attributs_universels/contenteditable
$(document).ready(function(){
// add new item
$('#button1').click(function(){
var toAdd = $('input[name=checkListItem]').val();
$('.list').append("<div class='item unselectable'>" + toAdd + "</div>" + "<br>");
});
//removing an item from the list by dobuble clicking on it
$(document).on('dblclick', '.item', function(){
$(this).remove();
});
//editing an item from the list by clicking on it, editing, clicking edit button
$(document).on('click', '.item', function() {
var $currentItem = $(this);
var isEditable = $currentItem.is('.editable');
// check if editing input already exist
if (!$currentItem.is('.editable')){
// make content editable
$currentItem.prop('contenteditable',!isEditable).toggleClass('editable');
$currentItem.removeClass('unselectable');
}
});
// clicking button edit
$(document).on('click', '#button2', function() {
$('.item').prop('contenteditable', false).removeClass('editable').addClass('unselectable');
});
});form {
display: inline-block;
}
body {
color: rgb(43, 61, 119);
font-family: garamond;
}
a:hover {
background-color: rgb(108, 86, 190);
}
#button1{
display: inline-block;
height:20px;
width:70px;
background-color:#5979b4;
font-family:arial;
font-weight:bold;
color:#ffffff;
border-radius: 5px;
text-align:center;
margin-top:2px;
}
#button2{
display: inline-block;
height:20px;
width:70px;
background-color: whitesmoke;
font-family:arial;
font-weight:bold;
color:#5979b4;
border-radius: 5px;
text-align:center;
margin-top:2px;
}
.list {
display: inline-block;
font-family:garamond;
font-weight:bold;
color:#3e549b;
}
.unselectable {
cursor:pointer;
-webkit-user-select: none;
-khtml-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
-o-user-select: none;
user-select: none;
}
.editable{
background:#EAEAEA;
}<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div>
<form name="checkListForm" class="edit-form">
<input type="text" name="checkListItem"/>
</form>
<div id="button1" value="button">Add!</div>
<div id="button2" value="button">Edit!</div>
<p></p>
<div class="list" id="item"></div>
<p>[Click item on list to edit item, edit, click edit button]</p>
<p>[Doubleclick item on list to remove item]</p>
</div>