Javascript进程冻结HTML输入元素

Javascript进程冻结HTML输入元素,javascript,jquery,html,dom,html-input,Javascript,Jquery,Html,Dom,Html Input,我有一些按钮和输入字段。其中一个按钮启用一个javascript进程,该进程打算永远运行,除非单击另一个按钮,否则无法终止 但是,一旦流程启动,所有HTML元素都将冻结,因此无法终止流程 如果相关的话,我会参加歌剧演出。这并不让我感到惊讶。JavaScript在UI线程上运行。在每个事件处理程序或函数上,它旨在快速更改任何相关的DOM状态信息,启动任何异步进程,然后尽快完成。因此,其他任何事件都无法响应 听起来,作为“Web工作者”(一种允许实际多线程处理的稍新技术),或者如果您的无限进程不断检

我有一些按钮和输入字段。其中一个按钮启用一个javascript进程,该进程打算永远运行,除非单击另一个按钮,否则无法终止

但是,一旦流程启动,所有HTML元素都将冻结,因此无法终止流程


如果相关的话,我会参加歌剧演出。

这并不让我感到惊讶。JavaScript在UI线程上运行。在每个事件处理程序或函数上,它旨在快速更改任何相关的DOM状态信息,启动任何异步进程,然后尽快完成。因此,其他任何事件都无法响应


听起来,作为“Web工作者”(一种允许实际多线程处理的稍新技术),或者如果您的无限进程不断检查文档的状态,可能会将其安排在一系列重复的超时上。

可能是因为当js运行时,页面正在等待它完成。您应该“异步”执行它。尝试将其包装在setInterval中,如:

setInterval(function() {
    myFunction();    
}, 100);

function myFunction() {
  //Your code
}

之所以所有html元素都冻结,是因为在单击按钮后激发了永无止境的代码。您应该将永无止境的代码更改为异步,这样它就不会影响浏览器

JavaScript在HTML5之前不支持线程,但可以使用方法
setTimeout
setInterval
异步执行代码。对于您的情况,请使用setTimeout方法

有关使用它的更多信息,请参阅

在HTML5中,您可以使用类似于线程的web工作程序。这是一个新概念,因此即使在主要浏览器中也只能提供有限的支持。只需在谷歌中键入“HTML5WebWorker”,你就会得到很多关于这方面的教程

为支持web Worker的浏览器选中此项

如果使用
setTimeout
,我不能保证浏览器不会挂起,因为所有代码都在同一线程中执行。另一方面,web worker在单独的线程上运行。此外,如果使用web worker,javascript代码应该存在于单独的文件中

您还可以使用以下代码检查浏览器是否支持web worker

if(Worker){
    //Browser supports worker
    //Your code
}
else{
    //Web worker is not supported in this browser
}

如果选择使用web worker,请在单击按钮期间启动worker,并确保只创建一次worker。有一些限制,比如不能在工作线程中更新DOM。如果需要打破这些限制,请使用辅助线程的
postMessage
方法与浏览器主线程通信

你能展示你的代码吗?是第一个做dom更新的代码吗?您是否创建了inf循环或命中stackoverflow?开发工具中有错误吗?代码示例和JSFIDLE?