Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/420.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
textarea中的文本编辑器慢速-javascript_Javascript_Html_Textarea - Fatal编程技术网

textarea中的文本编辑器慢速-javascript

textarea中的文本编辑器慢速-javascript,javascript,html,textarea,Javascript,Html,Textarea,我正在用一个固定大小(不会自动增长)的文本区域在html中实现一个简单(不丰富)的文本编辑器。我制作了一个分页系统,它将文本分割成适合该文本区域的部分。对于相对较大的文本(20页=20个文本区域),这20页的函数总共需要大约100毫秒(如果文本较少,则需要更少的时间)。逻辑是这样的: function paginate() { clienth = textarea.clientheight; while (maxTextSize>minTextSize+1) {

我正在用一个固定大小(不会自动增长)的文本区域在html中实现一个简单(不丰富)的文本编辑器。我制作了一个分页系统,它将文本分割成适合该文本区域的部分。对于相对较大的文本(20页=20个文本区域),这20页的函数总共需要大约100毫秒(如果文本较少,则需要更少的时间)。逻辑是这样的:

function paginate() {
    clienth = textarea.clientheight;
    while (maxTextSize>minTextSize+1) {
        textarea.value = text;
        // a binary subdivision algorithm which runs in logarithmic time
        if (textarea.scrollheight>clienth) {
            text = newsmallertext;
        } else {
          text = newbiggertext;
        }
        maxTextSize = newvalue1;
        minTextSize = newvalue2;
    }
}
因此,对于大约14KB的文本(19页),该函数被调用187次(每页10次),firefox的调用时间约为100ms,chrome和opera的调用时间约为60ms,IE的调用时间约为200ms。在这100ms中,将文本分配给textarea(.value=blablabla)的调用时间约为40ms其余60个用于检查卷轴高度是否大于卷轴高度。因此,99%的时间都花在那里

这似乎不多,但确实如此。为什么?因为我需要在用户每次在文本区域中键入(按键)时调用该函数,以便相应地应用新文本。用户可以键入字母、退格、删除、点击回车等等。因此,对于每个keydown,我再次调用paginate函数来计算适合textarea的新文本。这使得打字速度非常慢,因为每个按键都有100毫秒的延迟

所以我想知道是否有一种优化方法可以将文本分配到textarea或检查scrollheight,或者是一种完全不同的方法

提前感谢您的所有建议

请不要建议让textarea自动增长,这不符合要求


编辑:使while()循环更清楚地了解它的作用。

乍一看,这应该不会太慢,因为只要
不适合
返回false,整个算法就不会执行,而且大多数按键都不应该使其成为真-在100个字符长的区域上需要按100个键。您的
不适合
是如何实现的?有没有可能使你的一些算法成为非阻塞的呢?这个函数每一页都会被调用大约10次。19页的书名是187次。在开始的时候,让我们假设文本块是10KB。所以卷轴的高度更大。我把文本块切成两半…5k它还是更大…再切成两半…经过一些步骤,它变小了…然后我再把它变大,直到MintTextSize+1=MaxTextSize(即minsize适合,但max不适合。因此,它基本上是一种在对数时间内工作的二进制除法算法。它不能再快了。实际上,(MaxTextSize>MinTextChunkSize+1)通过setimeout(函数,0)使其无阻塞是可能的但这样,用户可以在分页结束前按另一个键,从而重新绘制(重新填充)文本区域在用户按下另一个键之后。这可能是因为我在这里有点迷路。你是说初始数据滞后于你的UI,还是说你正在对每个输入重新进行分页过程?@Amin如果我没记错的话,我只是做了一部分。不是所有文本同时出现,只是当前页面+-1