Javascript ToDoList-具有函数的DOM元素。用输入标签替换P标签,反之亦然。需要帮助以避免嵌套我的函数吗

Javascript ToDoList-具有函数的DOM元素。用输入标签替换P标签,反之亦然。需要帮助以避免嵌套我的函数吗,javascript,html,function,dom,Javascript,Html,Function,Dom,我正在尝试编写一个待办事项列表。但我正在一步一步地尝试,我刚开始就面临着一个问题 我有一个带有按键事件功能的输入标签元素。 每次我键入内容并按enter键时,DOM都会创建一个新的P-Tag-Element。 这个P的内部html等于输入的值 p-Tag-Elements也有一个keypress事件,以防我们以后要编辑它。 如果我按下P元素,DOM将用一个新的输入元素替换这个元素。 这个新输入的值等于我们重新计算的p元素的内部html 此输入元素具有按键功能,如果我按enter键,它将被一个新的

我正在尝试编写一个待办事项列表。但我正在一步一步地尝试,我刚开始就面临着一个问题

我有一个带有按键事件功能的
输入标签元素
。 每次我键入内容并按enter键时,DOM都会创建一个新的
P-Tag-Element
。 这个P的内部html等于输入的值

p-Tag-Elements
也有一个
keypress事件
,以防我们以后要编辑它。 如果我按下P元素,DOM将用一个新的输入元素替换这个元素。 这个新输入的值等于我们重新计算的p元素的内部html

此输入元素具有按键功能,如果我按enter键,它将被一个新的
p-Tag-Element
替换。如果你看我的代码,你会发现所有函数都是嵌套的。在“编辑”之后的“我的代码”中,您不能再编辑,除非您在此当前函数中添加另一个函数,并且如果您想停止编辑。您必须添加另一个函数isndie函数adn,依此类推

我真诚地希望有人了解我的想法并能帮助我。我找到了解决问题的办法,但我不喜欢。我将p元素放在div标记中,并向div标记添加了一个click事件。每当我单击div标记时,它都会查找第一个子元素,如果它是
P-tag-Element
,它就会用
Input-tag-Element
重新将其锁定,反之亦然。但这不是解决办法。使用这个解决方案感觉就像逃避一个你很快就会再次面对的问题

<!DOCTYPE html>
<html lang="de">
<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>Titel</title>
    <style>
        input,
        p {
            display: block;
            margin: 5px;
            padding: 5px
        }
    </style>
</head>
<body>
        <div id="display"></div>  <!-- My Start Display  -->

    <script>
        document.addEventListener("DOMContentLoaded", evt => {

            const ausgabe = document.querySelector('#display');

            const DOMElementCreate = ({  // creating my DOOM Ibjects with function
                content = '',
                typ = 'div',
                events = {},
                parent = display
            } = {}) => {
                let newElement = document.createElement(typ);
                newElement.innerHTML = content;
                newElement.value = content;
                Object.entries(events).forEach(event => newElement.addEventListener(...event));
                parent.append(newElement);
                return newElement;
            }


            DOMElementCreate({  // creating input-element with a keypress function
                typ: 'input',
                events: {
                    keypress: function (event) {
                        if (event.key === "Enter") {

                            DOMElementCreate({   // creating p-element with a click function
                                typ: 'p',
                                content: this.value,
                                events: {
                                    click: function (event) {

                                        this.replaceWith(DOMElementCreate({  // replacing p-element with new input element with keypress function
                                            typ: "input",
                                            content: this.innerHTML,
                                            events: {
                                                keypress: function (event) {
                                                    if (event.key === "Enter") {

                                                        this.replaceWith(DOMElementCreate({  // replacing input-element with new P element
                                                            typ: "p",
                                                            content: this.value
                                                        }));
                                                    }
                                                }
                                            }
                                        }));
                                    }
                                }
                            })
                        }
                    }
                }
            });
        });
    </script>
</body>
</html>


滴度
输入,
p{
显示:块;
保证金:5px;
填充:5px
}
document.addEventListener(“DOMContentLoaded”,evt=>{
const ausgabe=document.querySelector(“#display”);
const DOMElementCreate=({//使用函数创建我的厄运对象
内容=“”,
类型='div',
事件={},
父项=显示
} = {}) => {
让newElement=document.createElement(典型);
newElement.innerHTML=内容;
newElement.value=内容;
Object.entries(events.forEach(event=>newElement.addEventListener(…event));
parent.append(新元素);
返回新元素;
}
DOMElementCreate({//使用按键功能创建输入元素
类型:“输入”,
活动:{
按键:功能(事件){
如果(event.key==“输入”){
DOMElementCreate({//使用单击函数创建p元素
类型:“p”,
内容:这个值,
活动:{
单击:功能(事件){
this.replaceWith(DOMElementCreate({//使用keypress函数将p元素替换为新的输入元素
类型:“输入”,
内容:this.innerHTML,
活动:{
按键:功能(事件){
如果(event.key==“输入”){
this.replaceWith(DOMElementCreate({//用新的P元素替换输入元素
典型:“p”,
内容:这个值
}));
}
}
}
}));
}
}
})
}
}
}
});
});

您可以使用一个全局事件处理程序来避免无限嵌套,该事件处理程序与您正在创建的段落上的属性一起处理回车键

下面是一个简单的实现:

const input=document.getElementById('input');
window.onkeydown=({key,target})=>{
如果(键=='Enter'){
//防止段落中出现换行符,并在回车时停止编辑
如果(目标!==输入){
target.blur();
}else if(输入值){
document.body.append(Para(input.value));
input.value='';
}
}
}
函数参数(值){
const p=document.createElement('p');
返回Object.assign(p{
text内容:值,
contentEditable:真
});
}

谢谢!我根本没有想到这一点。但是我想知道如何用新元素解决我的例子。也许我把P标签改成标签,反之亦然。你能帮我吗?@dahood我更新了我的答案,给你一些建议。希望有帮助!谢谢你的建议。将考虑到这一点:))