我用document.createElement('button');创建了一个按钮。在DATE_FORMAT(FROM_UNIXTIME(FullDate), '%Y')
内;并作为document.createElement('li')传递。每当我向DOM添加新的<ul>
时,该按钮将显示在添加<li>
的前面。该按钮将以其<li>
作为参数,以在对象中访问它并调用函数。
但是,我还在HTML文件中创建了一个按钮,该按钮位于parentNode.Id
之外,并且未显示在<ul>
元素中。这是一个独立的按钮。如何使该按钮的行为与在<li>
元素中创建的按钮的行为相同?有什么办法可以在该对象外部的按钮中使用相同的属性?
<li>
元素只有一个按钮。我曾尝试给他们相同的<li>
,但这是行不通的。因为在Javascript文件中创建的按钮将显示在我的应用程序中添加的每个className
中。 <li>
前面显示的按钮正在获取特定的'<li>
<li>
作为参数。如果您看一下我在这里输入的那段代码,您将看到Javascript代码的最后一行,即参数。
parentNode.Id
答案 0 :(得分:2)
要使您的想法可行,您将必须在每个input
中包含一个li
元素。它应该是隐藏的,直到按下edit
按钮。我将向edit
添加一个li
类,并使用CSS揭示input
元素。一个cancel
按钮将从edit
中删除li
类。
因此,如果呈现的视图如下:
<ul class="todos">
<li>
<span class="todo-text">Old todo</span>
<input type="text" value="Old todo" />
</li>
<li class="edit">
<span class="todo-text">Old todo #2</span>
<input type="text" value="Old todo #2" />
</li>
</ul>
CSS的样式
li input,
li.edit .todo-text {
display: none;
}
li.edit input {
display: inline;
}
在当前li
和更改input
之间切换。
如果要在单击单个保存按钮时保存所有编辑<li>
的状态,则首先必须将事件侦听器绑定到<button>
:
const saveButton = document.createElement('button');
const body = document.getElementByTag('body');
// I chose body to append the button to, but you can append it to your main container
body.appendChild(saveButton);
saveButton.addEventListener('click', saveState);
现在,saveState
将定义为:
function saveState(e) {
let data = [];
const todos = document.querySelector('ul.todos li.edit');
// On save check all "changing" <li>
Array.from(todos).forEach((li, i) => {
const editInput = li.querySelector("input"); // Get input inside <li>
if (editInput != null) {
const span = li.querySelector("todo-text");
span.textContent = editInput.value; // add the edit text to the span
}
li.classList.remove("edit") // Remove the edit class
});
}
答案 1 :(得分:0)
根据我的理解,您想更新特定的待办事项。为此,您可以使用以下代码。
// id of the clicked todo
var todoID = -1;
// Your Todo array
var todos = [
{
id:1,
description: "Exercise",
isCompleted:false
},
{
id:2,
description: "Shopping",
isCompleted:false
},
];
// update specific todo item in the todo array according to the id
function updateToDos(id ,newDesc){
for (todo in todos){
if(todos[todo].id == id){
todos[todo].description = newDesc;
}
}
}
var ul = document.getElementById('todos');
// set event listener at in UL to get info about clicked li
ul.onclick = function(e) {
// get clicked li element, Note: e.srcElement for IE support
var target = e.target || e.srcElement;
// get id of the li element
todoID = target.id;
// get todo editing input field
var modifiedToDoDesc = document.getElementById("edit-todo-input");
// set the value of the input field = innerHTML of clicked li
modifiedToDoDesc.value = target.innerHTML;
};
var btnSave = document.getElementById('btnSave');
btnSave.onclick = function(){
var modifiedToDoDesc = document.getElementById("edit-todo-input").value;
updateToDos(todoID, modifiedToDoDesc);
// Update the todos in the UI here
}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
</head>
<body>
<ul id="todos" onClick="hello">
<li id="1">One</li>
<li id="2">Two</li>
</ul>
<input type="text" id="edit-todo-input">
<button id="btnSave">Save</button>
<script src="main.js"></script>
</body>
</html>