javascript - 为什么我不能在函数开始时更改此按钮的文本?

标签 javascript jquery html

我有一个按钮。 onClick 按钮触发 JS 函数。在这个函数的第一行代码中,我使用 jQuery 更改了按钮的 HTML。然后该功能需要几秒钟。按钮 HTML 仅在完成完整功能后才更改(在浏览器中)。

https://jsfiddle.net/wqps1r0k/

代码:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.2.3/jquery.min.js"></script>
<button class="btn btn-primary" onclick="setToDisabled(this)">Toggle</button>

    <script type="text/javascript">
    function setToDisabled(btn) {
      //log
      console.log('start');

      //how to force the browser to show this text immediately?
      $(btn).html("TEXT CHANGED ON START OF FUNCTION");

      //create a 2 seconds delay
      var d1 = new Date();
      var t1 = d1.getTime();
      var keeprunning = true;
      while(keeprunning) {
        var d2 = new Date();	
        var t2 = d2.getTime();
        var dif = t2 - t1;
        if((dif / 1000) > 2) keeprunning = false;
      }
    
      //log
      console.log('done');
    }
    </script>

在此示例中,是否可以在流程开始时更改按钮文本并立即在我的浏览器中看到它?例如,将文本更改为“正在加载...”。

如果我检查按钮,您可以看到文本直接更改,但只有在函数完成后才可见。

附言。我用 Chrome

最佳答案

问题是因为 while() 循环是同步的,并且在更新 UI 的浏览器线程有机会执行之前开始执行。因此,在您的循环完成之前,UI 将被阻止更改,此时新的 HTML 将应用于按钮。

要解决此问题,请使用超时来延迟某些逻辑。它是异步的,不会干扰 UI:

$('.btn').click(function() {
  console.log('start');
  $(this).html("TEXT CHANGED ON START OF FUNCTION");

  setTimeout(function() {
    console.log('done');
  }, 2000);
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<button class="btn btn-primary">Toggle</button>

另请注意,我使用不显眼的事件处理程序删除了过时的 on* 事件属性,因为这被认为是更好的做法。

关于javascript - 为什么我不能在函数开始时更改此按钮的文本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48545972/

相关文章:

html - Z-index "stacking"在创建阴影

html - 固定位置菜单覆盖部分内容

javascript - JS 中的 flex 滚动和菜单栏错误

jquery - Javascript 错误被标签推到右边

html - 带页眉和页脚的速度邮件

javascript - "arrow"图像仅在 OpenLayers 3 的 map 中显示一半

javascript - 使用理想邮政编码查找时可能出现 jquery 冲突

javascript - 导航栏 -> 如何突出显示一个特定链接,即使它不是当前链接?

javascript - 可访问性和使用javascript

javascript - 将 JavaScript 字符串转换为二维数组