gpt4 book ai didi

javascript - 使用 getElementById( x ).onclick = someFunction

转载 作者:行者123 更新时间:2023-11-28 19:44:04 25 4
gpt4 key购买 nike

我想了很久如何定义这个问题,但我不能,我需要解释一下代码。

我想用 JavaScript 制作一个简单的组织器。您输入任务并单击“添加到列表”按钮,脚本会创建一个复选框,其中包含包含任务文本的段落。第二部分是禁用复选框,并在单击任务文本时删除该文本。我尝试通过为每个复选框提供一个函数(destroyIt(),通过 id 获取元素然后禁用它)来做到这一点,但它仅适用于添加到页面的最后一个复选框。我长时间查看此代码并且我看不出出了什么问题。请帮忙。这是我的代码:

<html>
<head>

<style id="stil">
.over{
text-decoration:line-through;
}
</style>


<script type="text/javascript">
var numberOfTasks=1;

function insertNew(){
tekst = document.getElementById("zadatak").value;
if(tekst.length>0){
var idEl= "check"+numberOfTasks;

document.getElementById("ispis").innerHTML+="<input type='checkbox' id='check"+numberOfTasks+"'> "+"<span class='"+idEl+"'>"+tekst+"</span> <br/>";

document.getElementById(idEl).onclick= function(){ destroyIt(idEl); };

numberOfTasks++;
}
}
function destroyIt(idEl){
document.getElementById(idEl).disabled=true;
document.getElementById("stil").innerHTML+= "."+idEl+"{text-decoration:line-through;}";
alert(idEl+"{text-decoration:line-through;}");
}


</script>
</head>

<body>
Tasks for: <span id="date"> </span>

<script>
var date= new Date();
document.getElementById("date").innerHTML= ""+ date.getDay() +"." +date.getMonth() +"." +date.getFullYear();
</script>

<br/> <br/>
New task: <input type="text" id="zadatak"> <button onclick="insertNew()"> add to the list </button>

<button onclick="provera()">Provera</button>
<p id="ispis"> </p>
</body>

最佳答案

问题是,当您执行 .innerHTML += "..." 时,它会破坏现有节点及其事件处理程序,并用新的干净节点替换它们。出于这个原因和其他原因,您几乎不应该在 .innerHTML 之后使用 +=

从 HTML 标记插入新内容的更好方法是使用 .insertAdjacentHTML()。第一个参数描述相对于调用它的元素的位置,第二个参数是新内容。

因此,带有 .insertAdjacentHTML() 的代码将如下所示:

function insertNew(){
tekst = document.getElementById("zadatak").value;
if(tekst.length>0){
var idEl= "check"+numberOfTasks;

document.getElementById("ispis")
.insertAdjacentHTML("beforeEnd", "<input type='checkbox' id='check"+numberOfTasks+"'> "+"<span class='"+idEl+"'>"+tekst+"</span> <br/>");

document.getElementById(idEl).onclick= function(){ destroyIt(idEl); };

numberOfTasks++;
}
}
<小时/>

此外,您可以修改 destroyIt 函数以对其 this 值进行操作,这将为您提供具有处理程序的 input 元素。然后,您可以使用其 .id 来获取 span 的类,或者您可以直接遍历到下一个元素。

此外,您不应修改样式表来隐藏该元素。只需添加一个类或直接样式属性即可。

所以在上面的函数中,这个:

document.getElementById(idEl).onclick= function(){ destroyIt(idEl); };

变成这样:

document.getElementById(idEl).onclick= destroyIt;

然后 destroyIt 函数变成这样:

function destroyIt(){
var span = this.nextElementSibling;
this.disabled=true;
span.style.textDecoration = "line-through";
}

.nextElementSibling 需要在 IE8 中进行修补,但这只是为了简单演示。

关于javascript - 使用 getElementById( x ).onclick = someFunction,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24588868/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com