18910140161

HTML-JavaScript创建一个定时的onclick事件处理程序,它不'不要冻结页面?-堆栈溢出

顺晟科技

2022-10-18 12:40:37

68

目标:有一个按钮,当点击时,灰显1秒,并在1秒后增加一个值。这将允许您在等待时在页面上执行其他操作。

问题:当我单击该按钮时,页面冻结,我必须等到等待功能完成后才能单击另一个按钮。按钮也不会变灰。它会停止动画,然后在1秒钟后完成动画。

HTML代码:

<代码><;按钮ID=WoodBtn类=WoodBtnC类型=";按钮";onclick=";GetWood()";>;获取木材<;/按钮>;<;表格>;<;TR>;<;th>;木材<;/TH>;<;/tr>;<;TR>;<;TD ID=woodvalue>;0<;/TD>;>;<;/tr>;<;/表格>;

JavaScript代码:

<button id=woodBtn class=woodBtnC type="button" onClick="getWood()">Get Wood</button> 
<table>
    <tr>
        <th>Wood</th>
    </tr>
    <tr>
        <td id=woodValue>0</td>>
    </tr>
</table>

我不认为JavaScript有线程,所以我如何在没有线程的情况下做到这一点?


顺晟科技:

使用以下

命令

更改function getWood() { wood++; greyOut("woodBtn", 1); document.getElementById("woodValue").innerHTML = wood; writeConsole("Got 1 wood!!"); } function greyOut(id, time) { document.getElementById(id).style.opacity = "0.5"; var start = Date.now(); do{ var now = Date.now(); var delta = now - start; } while (delta < 1000); document.getElementById(id).style.opacity = "1.0"; } 代码:

<代码>函数GREYOUT(ID,时间){document.getElementById(ID).style.opacity=";0.5";Var start=date.now();setTimeout(函数(){document.getElementById(ID).style.opacity=";1.0";},1000)//延迟时间ms}

应该能行

JS是一种单线程语言,所以所有的代码只能在一个线程上运行-你不能进行多线程处理。由于连续循环,当您等待1秒时,您正在完全消耗线程1秒-该循环在终止之前可能运行了数百万次,整个页面将冻结,因为它不停地运行,而JS不能做任何其他事情。处理这种情况的方法是使用事件循环和回调函数-JS将告诉某人持有一个函数,直到指定的事件发生,当该事件发生时,某人将把该函数返回给JS运行。在这种情况下,某人是浏览器,浏览器提供了一个APIgreyOut,它在指定的时间后运行一个函数。下面是代码:


function greyOut(id, time) {
    document.getElementById(id).style.opacity = "0.5";
    var start = Date.now();
    setTimeout(function(){
        document.getElementById(id).style.opacity = "1.0";
    }, 1000) // delay time ms
}

<代码><;Button ID=WoodBtn Class=WoodBtnC type=“ Button ” onClick=“ getwood()”>;去拿木头<;/按钮>;<;表格>;<;TR>;<;th>;木材<;/TH>;<;/tr>;<;TR>;<;TD ID=“ woodvalue ”>;0<;/TD>;<;/tr>;<;/表格>;

  • TAG:
相关文章
我们已经准备好了,你呢?
2024我们与您携手共赢,为您的企业形象保驾护航