繁体   English   中英

JavaScript onclick function 只工作一次(非常简单的代码)

[英]JavaScript onclick function only works once (very simple code)

我知道有很多关于此的主题,但它们解决了一些可变问题。 我的要简单得多,但它不起作用。 只工作一次。

 var bt1; document.addEventListener('DOMContentLoaded', load); function load() { document.body.innerHTML += '<div>welcome</div>'; bt1 = document.getElementById('bt1'); bt1.onclick = clicked; } function clicked() { document.body.innerHTML += '<div>welcome</div>'; }
 <body> <button id="bt1">Click me</button> </body>

我尝试将clicked的 function 进出onclick语句(正如其他一些主题所建议的那样)。

我还尝试移动bt1变量声明(根本不使用变量)。

每当您分配给容器的innerHTML时(即使您只是与现有HTML串联),该容器的内容都将被删除 ,新的innerHTML 字符串将被解析,然后由浏览器呈现。 因此,以前附加到容器内部任何内容的侦听器将不再起作用。

 const container = document.querySelector('#container'); const child = container.children[0]; // Before: the child's parent is the `container`, as expected: console.log(child.parentElement); container.innerHTML += ''; // After: the child has no parent element! // If a listener was attached to the child before, // the child will no longer even be in the document! console.log(child.parentElement); 
 <div id="container"> <div>child</div> </div> 

对于您正在执行的操作,请使用insertAdjacentHTML ,它不会破坏侦听器,但是将执行与innerHTML +=类似的功能:

 var bt1; document.addEventListener('DOMContentLoaded', load); function load() { document.body.innerHTML += '<div>welcome</div>'; bt1 = document.getElementById('bt1'); bt1.onclick = clicked; } function clicked() { document.body.insertAdjacentHTML('beforeend', '<div>welcome</div>'); } 
 <body> <button id="bt1">Click me</button> </body> 

或者,显式创建要追加的新元素,并使用appendChild

 var bt1; document.addEventListener('DOMContentLoaded', load); function load() { document.body.innerHTML += '<div>welcome</div>'; bt1 = document.getElementById('bt1'); bt1.onclick = clicked; } function clicked() { const div = document.createElement('div'); div.textContent = 'welcome'; document.body.appendChild(div); } 
 <body> <button id="bt1">Click me</button> </body> 

另一个快速解决方案是在单击的方法中重新附加侦听器。

 var bt1; document.addEventListener('DOMContentLoaded', load); function load() { document.body.innerHTML += '<div>welcome</div>'; bt1 = document.getElementById('bt1'); bt1.onclick = clicked; } function clicked(a) { document.body.innerHTML += '<div>welcome</div>'; bt1 = document.getElementById('bt1'); bt1.onclick = clicked; } 
 <body> <button id="bt1">Click Me</button> </body> 

我有同样的麻烦。 但是,我不想连接任何东西。

在我简单编写的脚本中,创建了一个简单的 function。 我使用秒来创建 0 到 30 之间的随机数; 然后我将 function 放入按钮中,这样当我单击按钮时,随机数被写入 DIV 元素。

但是,onclick 仅在初始单击时有效,并且控制台中没有任何脚本错误。

示例脚本: var time = new Date(); //创建随机数function chngTstFld(){ var ss = time.getSeconds(); var random_Number = ss; if(ss>30){ random_Number = random_Number - 30}; function chngTstFld(){ var ss = time.getSeconds(); var random_Number = ss; if(ss>30){ random_Number = random_Number - 30}; document.getElementById("tstFld").innerHTML = random_Number};

我想用 DIV 中的新数字替换数字,就像我单击按钮一样多次。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM