我最近遇到了一个相当讨厌的错误,其中代码是<select>通过JavaScript动态加载的.这种动态加载<select>具有预先选择的值.在IE6中,我们已经有了修复所选内容的代码<option>,因为有时它<select>的selectedIndex值与所选<option>的index属性不同步,如下所示:
field.selectedIndex = element.index;
Run Code Online (Sandbox Code Playgroud)
但是,此代码无效.即使selectedIndex正确设置了字段,最终也会选择错误的索引.但是,如果我alert()在正确的时间插入声明,则会选择正确的选项.考虑到这可能是某种时间问题,我尝试了一些随机的东西,我之前在代码中看到过:
var wrapFn = (function() {
var myField = field;
var myElement = element;
return function() {
myField.selectedIndex = myElement.index;
}
})();
setTimeout(wrapFn, 0);
Run Code Online (Sandbox Code Playgroud)
这有效!
我已经找到了解决问题的方法,但是我很不安,因为我不知道为什么这会解决我的问题.有人有官方解释吗?使用"稍后"调用我的功能可以避免哪些浏览器问题setTimeout()?
在使用主干几周后,我意识到下划线延迟最终修复了我遇到的关于渲染各种视图的许多异步问题.有人可以请帮助我准确理解下划线延迟的作用以及$ .ready()或其他类型的等待dom来呈现函数的方式有何不同.使用它有什么不利之处?
_.defer = function(func) {
return _.delay.apply(_, [func, 1].concat(slice.call(arguments, 1)));
};
Run Code Online (Sandbox Code Playgroud) 请看这个小提琴:http://jsfiddle.net/yg49k/
以下代码在FireFox中正常工作,但在最新版本的Chrome中无效.
HTML:
<input type="text" id="one" placeholder="Type two chars" />
<input type="text" id="two" placeholder="It should focus here" />
Run Code Online (Sandbox Code Playgroud)
jQuery的:
$("#one").on("input", function() {
if($("#one").val().length == 2) { $("#two").focus(); }
});
Run Code Online (Sandbox Code Playgroud)
有谁知道我怎么能解决这个问题?
我有一个input.onkeydown处理程序,我检查input.value后setTimeout(..0)。
我希望input.value在setTimeout回调运行时具有新值。
在除Firefox之外的所有浏览器中都可以。在Firefox中,情况并非总是如此。
要检查的代码是:
<input id="input">
<script>
input.onkeydown = function() {
setTimeout(() => this.value = this.value.toUpperCase());
};
</script>
Run Code Online (Sandbox Code Playgroud)
演示:http : //plnkr.co/edit/rZmiHdttSXNdpKkR8YbH?p=preview
由于我将after之后的输入值大写setTimeout(..0),因此应始终将其大写。但是如前所述,在Firefox中不是。
这是演示视频;前几秒钟演示了该问题:https : //jmp.sh/9XSROQ2
相关规范部分是https://dom.spec.whatwg.org/#concept-event-dispatch。
我没有得到任何东西,或者这是Firefox中的长期错误?
PS如果我添加console.log的setTimeout,我有时会看到旧值。
PPS这个问题的目的是要知道我setTimeout是否正确理解。我熟悉各种大写方式input; 请不要暗示oninput,requestAnimationFrame或者这样的。
var timeout = setTimeout(function(){
console.log("I'm message from timeout");
},0);
console.log("I'm message from outside timeout");
//1. I'm message from outside timeout
//2. I'm message from timeout
Run Code Online (Sandbox Code Playgroud)
尽管将setTimeout时间设置为0,为什么内部指令不会先执行?我使用各种时间,包括0/null,我想知道如何保留setTimeout对象并使用流程执行其指令.
以下是一些简单的Javascript代码setTimeout:
function setTimeouts() {
setTimeout(function() { console.log(2); }, 2);
setTimeout(function() { console.log(1); }, 1);
setTimeout(function() { console.log(0); }, 0);
}
for (var i = 0; i < 10; i++) {
setTimeouts();
}Run Code Online (Sandbox Code Playgroud)
当我在Chrome或Node.js上运行它时,结果类似:
1
0
1
0
1
0
1
0
1
0
1
0
1
0
1
0
1
0
1
0
2
2
2
2
2
2
2
2
2
2
Run Code Online (Sandbox Code Playgroud)
你可以看到超时的所有任务,0并且1在超时之前2,这是我的预期.
但是0和1它们相互混合,似乎它们具有相同的超时.我0以前所期待的都是1 …
我需要在按钮的点击事件上附加一个异步行为。我想让浏览器先打开带有链接的新标签页,当我返回上一页时,然后执行异步操作。
起初,我测试了这个: window.setTimeout(() => action(), 0);
它在 Chrome 中运行良好,但在 Firefoxaction()中在链接打开之前执行。很坏。我不敢相信 Firefox 像管理同步块一样管理它?
所以我试过了 window.setTimeout(() => action(), 1);
现在它起作用了!
1 毫秒在这里有什么不同,或者内部事件循环中有解释吗?
你知道答案吗 ?(以及为什么它在 Chrome 和 Firefox 之间的管理方式不同?)
javascript ×7
settimeout ×2
backbone.js ×1
dom ×1
event-loop ×1
firefox ×1
html ×1
jquery ×1
node.js ×1