为什么setTimeout(myFunction,0)有效,但运行函数本身不起作用?

时间:2012-07-12 00:31:23

标签: javascript jquery

当选择textarea时,此代码应选择textarea的内容。但是,它本身不起作用:

        $("#form").focus(function() {
            $("#form").select();
        });

仅当我给它setTimeout为0时才有效:

        $("#form").focus(function() {
            setTimeout(function() {
                $("#form").select();
            }, 0);
        });

为什么?

2 个答案:

答案 0 :(得分:1)

看起来第一个代码段正在选择,然后取消选择文本。我怀疑在focus事件结束后正在幕后处理文本选择,setTimeout在事件发生后执行select(当幕后的东西已经存在时)发生)。

答案 1 :(得分:1)

在处理此类事情时始终记住这一点:

浏览器是单线程的。这是一个简单的模型,但想到这样:等待事件(按键,鼠标,触摸,计时器等),执行脚本,一遍又一遍地更新页面。

当你setTimeout(func, 0)正在做的事情是告诉浏览器 next 迭代而不是这个。因此,它将有时间解析表单标记。或者,如果您正在处理宽度或高度,则可能有时间显示该项目,从而计算其宽度或高度(而不是将其读取为0)。

可能发生的事情是,通过聚焦textarea而调用的事件级联中的某些内容最终也会取消选择其内容。通过将选择移动到下一个迭代,您可以将其从焦点改变,选择全部,取消全选以进行聚焦,取消全选,全选。