JavaScript不会在按钮触发的重复操作上更新状态Div

德米特里·托尔巴(Dmitry Torba)

我有以下JavaScript。附带的代码是相当复杂的自动生成的JavaScript的极其简化的版本,该JavaScript在许多对象上启动相同的功能(不是循环的,而是生成的一堆函数调用)。

问题在于代码应该在每次启动函数时更新一个元素。但是,这不会发生。相反,当我按下按钮时,它只会冻结并更新所有状态(执行“完成”)后才能更新状态。那么,为什么long_function()在以下代码的每次调用中未更新该元素(以及如何解决该问题):

<html>
    <body>
        <h1 id="status">Not yet started</h1>
        <button onclick="perform()"> Start! </button>

        <script type="text/javascript">
            function sleepFor( sleepDuration ){
                var now = new Date().getTime();
                while(new Date().getTime() < now + sleepDuration){ /* do nothing */ }
            }

            function long_function(number)
            {
                document.getElementById("status").innerHTML = number;
                sleepFor(1000);
            }

            function perform(number) {
                long_function(1);
                long_function(2);

                document.getElementById("status").innerHTML = "Done";
            }
        </script>
    </body>
</html>

(问题发生在Google Chrome和Safari中)

(睡眠功能摘自对sleep()的JavaScript版本是什么的回答

福斯托(美国)

这就是我理解发生的情况的方式:

  1. 函数perform()运行,并且它long_function(1)首先调用
  2. innerHTML呼叫被发送。
  3. sleepFor(1000)函数被调用,但浏览器尚未呈现innerHTML更改。
  4. 实时编译器通过中的while循环运行,该循环本质sleepFor()上是阻塞的(它停止了其他JavaScript代码的运行,但也阻止了浏览器的呈现)。
  5. 一旦while循环完成,JavaScript的进行设置innerHTML你的元素来“完成”,但它从来没有得到呈现numberlong_function()

如果您想对事件循环(阻塞和非阻塞JavaScript)进行有趣的观察,请参考以下资源:

http://latentflip.com/loupe/

这个问题由于标题(innerHTML实际上不是异步运行)而有点误导,但答案很有趣:

无法信任innerHTML:并不总是同步执行

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Xamarin 命令不会在按钮单击时触发

来自分类Dev

<script type = text / javascript> $(function(){$('#buttonVal')。click(function(){警告不会在按钮单击时触发

来自分类Dev

不显眼的验证不会在单选按钮上触发

来自分类Dev

Flutter Image Widget不会在更改状态上更新

来自分类Dev

React不会在useEffect上更新状态

来自分类Dev

JavaScript-clearWatch()不会在setTimeout()上触发

来自分类Dev

div不会在Calling watchLocation上更新

来自分类Dev

React.js不会在按钮上获取引导程序格式

来自分类Dev

<div> 上的点击事件不会在 Firefox 上触发,但在 Chrome 上触发

来自分类Dev

OnLongClickListener不会在ViewPager上触发

来自分类Dev

父div上的角度单击不会在所有子div上触发

来自分类Dev

JTextField不会在按键时更新

来自分类Dev

ngAnimate-动画不会在重复的自定义指令上触发

来自分类Dev

jQuery on()不会在动态生成/单击的单选按钮上触发

来自分类Dev

滚动事件不会在可滚动 div 内的 div 上触发

来自分类Dev

在页面加载上调用函数LordRecord()不会在按钮单击ASP.NET时更新数据

来自分类Dev

状态正在改变,但转换不会在Xstate中触发

来自分类Dev

UIBarButtonItem操作不会在点击时触发

来自分类Dev

UIBarButtonItem操作不会在点击时触发

来自分类Dev

已解决:React Redux的useSelector不会在expo react-native上更新存储状态

来自分类Dev

窗体上的挂钩管理状态不会在父组件中更新

来自分类Dev

Android按钮不会在每次点击时触发事件

来自分类Dev

保存按钮不会在事件后面触发代码

来自分类Dev

Android按钮不会在每次点击时触发事件

来自分类Dev

Javascript 单击侦听器,但不会在子元素上触发?

来自分类Dev

GADInterstitial不会在iOS上触发任何委托方法

来自分类Dev

重大位置更改不会在设备上触发

来自分类Dev

开关盒不会在更改事件上触发

来自分类Dev

音频事件不会在播放事件上触发jQuery

Related 相关文章

  1. 1

    Xamarin 命令不会在按钮单击时触发

  2. 2

    <script type = text / javascript> $(function(){$('#buttonVal')。click(function(){警告不会在按钮单击时触发

  3. 3

    不显眼的验证不会在单选按钮上触发

  4. 4

    Flutter Image Widget不会在更改状态上更新

  5. 5

    React不会在useEffect上更新状态

  6. 6

    JavaScript-clearWatch()不会在setTimeout()上触发

  7. 7

    div不会在Calling watchLocation上更新

  8. 8

    React.js不会在按钮上获取引导程序格式

  9. 9

    <div> 上的点击事件不会在 Firefox 上触发,但在 Chrome 上触发

  10. 10

    OnLongClickListener不会在ViewPager上触发

  11. 11

    父div上的角度单击不会在所有子div上触发

  12. 12

    JTextField不会在按键时更新

  13. 13

    ngAnimate-动画不会在重复的自定义指令上触发

  14. 14

    jQuery on()不会在动态生成/单击的单选按钮上触发

  15. 15

    滚动事件不会在可滚动 div 内的 div 上触发

  16. 16

    在页面加载上调用函数LordRecord()不会在按钮单击ASP.NET时更新数据

  17. 17

    状态正在改变,但转换不会在Xstate中触发

  18. 18

    UIBarButtonItem操作不会在点击时触发

  19. 19

    UIBarButtonItem操作不会在点击时触发

  20. 20

    已解决:React Redux的useSelector不会在expo react-native上更新存储状态

  21. 21

    窗体上的挂钩管理状态不会在父组件中更新

  22. 22

    Android按钮不会在每次点击时触发事件

  23. 23

    保存按钮不会在事件后面触发代码

  24. 24

    Android按钮不会在每次点击时触发事件

  25. 25

    Javascript 单击侦听器,但不会在子元素上触发?

  26. 26

    GADInterstitial不会在iOS上触发任何委托方法

  27. 27

    重大位置更改不会在设备上触发

  28. 28

    开关盒不会在更改事件上触发

  29. 29

    音频事件不会在播放事件上触发jQuery

热门标签

归档