转载自:https://www.cnblogs.com/hajerbin/p/7098055.html
解决的问题:
1、代码中改变了dom,又想在后续的代码中操作此dom(自己不知道dom什么时候渲染就绪)。此用法对比Vue的nextTick()。
2、onkeypress等事件的触发是有先后顺序的,想在这些触发的事件执行完之后执行。比如input的内容改变是在的onkeypress事件之后,即onkeypress中无法获取input事件的改变,这时候可以使用setTimeout(func,0)
相关术语:
宏任务、微任务
演示代码:
1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> 2 <html> 3 <head> 4 <meta charset="utf-8"> 5 <title>setTimeout</title> 6 7 <script type="text/javascript" > 8 (function(){ 9 10 function get(id){ 11 return document.getElementById(id); 12 } 13 14 window.onload = function(){ 15 get(\'makeinput\').onmousedown = function(){ 16 var input = document.createElement(\'input\'); 17 input.setAttribute(\'type\', \'text\'); 18 input.setAttribute(\'value\', \'test1\'); 19 get(\'inpwrapper\').appendChild(input); 20 input.focus(); 21 input.select(); 22 } 23 get(\'makeinput2\').onmousedown = function(){ 24 var input = document.createElement(\'input\'); 25 input.setAttribute(\'type\', \'text\'); 26 input.setAttribute(\'value\', \'test1\'); 27 get(\'inpwrapper2\').appendChild(input); 28 setTimeout(function(){ 29 input.focus(); 30 input.select(); 31 }, 0); 32 } 33 get(\'input1\').onkeypress = function(){ 34 get(\'preview1\').innerHTML = this.value; 35 } 36 get(\'input2\').onkeypress = function(){ 37 setTimeout(function(){ 38 get(\'preview2\').innerHTML = get(\'input2\').value; 39 },0 ); 40 } 41 } 42 })(); 43 44 </script> 45 46 </head> 47 48 <body> 49 <h1><code>DEMO1</code></h1> 50 <h2>1、未使用 <code>setTimeout</code>(未选中文本框内容)</h2> 51 <button id="makeinput">生成 input</button> 52 <p id="inpwrapper"></p> 53 <h2>2、使用 <code>setTimeout</code>(立即选中文本框内容)</h2> 54 <button id="makeinput2">生成 input</button></h2> 55 <p id="inpwrapper2"></p> 56 57 -------------------------------------------------------------------------- 58 <h1><code>DEMO2</code></h1> 59 <h2>1、未使用 <code>setTimeout</code>(只有输入第二个字符时,前一个字符才显示出来)</h2> 60 <input type="text" id="input1" value=""/><div id="preview1"></div> 61 <h2>2、使用 <code>setTimeout</code>(输入时,字符同时显示出来)</h2> 62 63 <input type="text" id="input2" value=""/><div id="preview2"></div> 64 65 </body> 66 </html>