当前位置: 首页 > 面试题库 >

JavaScript为什么setTimeout(fn,0)有时有用?

暴向笛
2023-03-14
问题内容

我最近遇到了一个令人讨厌的错误,该错误中的代码是<select>通过JavaScript动态加载的。动态加载的<select>具有预先选择的值。在IE6中,我们已经有代码来修复selected
<option>,因为有时<select>selectedIndex值可能与selected
<option>index属性不同步,如下所示:

field.selectedIndex = element.index;

但是,此代码无法正常工作。即使selectedIndex正确设置了字段,最终也会选择错误的索引。但是,如果我alert()在正确的时间插入一条语句,则会选择正确的选项。考虑到这可能是某种时序问题,我尝试了一些以前在代码中看到的随机现象:

var wrapFn = (function() {
    var myField = field;
    var myElement = element;

    return function() {
        myField.selectedIndex = myElement.index;
    }
})();
setTimeout(wrapFn, 0);

这有效!

我已经为我的问题找到了解决方案,但是我不知道自己到底为什么能解决我的问题,对此我感到不安。有人有官方解释吗?通过使用调用函数“稍后”可以避免出现什么浏览器问题setTimeout()


问题答案:

在问题中,存在以下竞争条件:

  1. 浏览器尝试初始化下拉列表,准备对其选定的索引进行更新,以及
  2. 您的代码来设置选定的索引

您的代码始终在这场比赛中取胜,并在浏览器就绪之前尝试设置下拉菜单,这意味着该错误将出现。

之所以存在这种竞争,是因为JavaScript具有与页面渲染共享的单个执行线程。实际上,运行JavaScript会阻止DOM的更新。

您的解决方法是:

setTimeout(callback, 0)

调用setTimeout一个回调,以及零作为第二个参数将安排回调运行 异步 ,最短的延迟之后-
这将是10毫秒左右,当标签具有焦点和执行JavaScript的线程不是忙。

因此,OP的解决方案是将选定索引的设置延迟大约10ms。这为浏览器提供了初始化DOM的机会,从而修复了该错误。

Internet Explorer的每个版本都表现出古怪的行为,因此有时需要这种解决方法。另外,它可能是OP代码库中的真正错误。



 类似资料:
  • 问题内容: 两者之间有什么区别,什么时候可以使用另一种? 问题答案: setTimeout 就像延迟完成后调用该函数一样。每当调用一个函数时,它不会立即执行,而是排队,以便在所有正在执行的和当前排队的事件处理程序首先完成后再执行。setTimeout(,0)本质上是指在当前队列中的所有当前函数执行之后执行。无法保证需要多长时间。 setImmediate 在这方面很相似,除了它不使用函数队列。它检

  • 问题内容: 给定一个输入文件,例如 巴别塔将其编译为 但是在松散模式下编译时,函数调用输出为 问题答案: 确保在将函数设置为全局对象的情况下调用该函数(如果启用了严格模式,则为to )。如果你打电话直接,然后调用与设置。 相当于

  • 问题内容: 我已经成功实现了,但是我想知道为什么我们采用这个数组“ ”? 这是下面的代码: 问题答案: 从Selenium ExecuteScript 页面检查定义 这些参数将通过“ arguments”魔术变量提供给JavaScript,就好像该函数是通过“ Function.apply”调用的一样 并且executeScript的返回值为: 返回:布尔值,长整数,字符串,列表或WebEleme

  • 本文向大家介绍javascript在构造JavaScript时有什么用?,包括了javascript在构造JavaScript时有什么用?的使用技巧和注意事项,需要的朋友参考一下 Backbone是用于前端的MVC框架。使用Backbone,您可以将数据表示为模型,可以创建,验证,销毁并将其保存到服务器。每当UI操作导致模型的属性发生更改时,模型就会触发“更改”事件;可以将更改通知所有显示模型状态

  • 本文向大家介绍setTimeout和setInterval有什么区别呢?相关面试题,主要包含被问及setTimeout和setInterval有什么区别呢?时的应答技巧和注意事项,需要的朋友参考一下 setTimeout(fn,t),超时调用,超过时间t,就执行fn,只调用一次。 setInterval(fn,t),间歇调用,调用周期t,执行fn,可循环调用多次。 二者调用后,均返回一个数值ID,

  • 本文向大家介绍F# 0元组有什么用?,包括了F# 0元组有什么用?的使用技巧和注意事项,需要的朋友参考一下 示例 2元组或3元组表示一组相关项。(2D空间中的点数,颜色的RGB值等。)1元组不是很有用,因为可以很容易地将其替换为单个1 int。 一个0元组似乎毫无用处,因为它绝对不包含任何东西。但是它具有的特性使其在F#等功能语言中非常有用。例如,0元组类型只有一个值,通常表示为()。所有0元组都