【问题标题】:How to display a loading progress bar when jQuery function is executing?jQuery函数执行时如何显示加载进度条?
【发布时间】:2019-12-03 08:33:47
【问题描述】:

我们希望在执行 jQuery 代码时显示加载进度条,但是在执行 jQuery 代码后才显示进度条。

<div id="loading">
  <img id="loading-image" src="images/ajax-loader.gif" alt="Loading..." />
</div>
$(window).load(function() {
  $('#loading').hide();
});

$("[id*=btnAddCa_Cl]").click(function() {

  var ttlCationCaco3 = $("input[id$='txtTdsAdjustmentForCation']").val();
  if (parseFloat(ttlCationCaco3) > 0) {
    $("input[id$='txtCalciumPpmAsCaCO3']").val(parseFloat($("input[id$='txtTdsAdjustmentForCation']").val()) + parseFloat($("input[id$='txtCalciumPpmAsCaCO3']").val()));
    $("input[id$='txtCalciumPpmAsCaCO3']").trigger('keyup');
  } else {
    $("input[id$='txtChloridePpmAsCaCO3']").val(parseFloat($("input[id$='txtTdsAdjustmentForAnion']").val()) + parseFloat($("input[id$='txtChloridePpmAsCaCO3']").val()));
    $("input[id$='txtChloridePpmAsCaCO3']").trigger('keyup');
  }

});

【问题讨论】:

  • 您显示的 JS 代码似乎对进度条没有任何作用,除了在加载时隐藏它......?此外,除非您进行冗长的异步操作(即 1 秒以上),否则加载栏是没有实际意义的。
  • 你的问题仍然没有意义。没有“正在执行的 jquery 函数”,并且您的图像在页面加载时仍然显示。 stackoverflow.com/questions/59068461/…
  • @RoryMcCrossan 这些值是根据按钮单击的 jquery 事件计算的。计算需要 30-40 多秒,因为它涉及使用各种公式计算 15-20 个文本框的值
  • 另外,您的意思是只想显示单个加载微调器图形进度条?两者是非常不同的东西。
  • 以上链接指向一个相同的问题,逐字逐句。

标签: javascript c# jquery asp.net progress-bar


【解决方案1】:

从问题下的 cmets 看来,您希望加载微调器图形(注意:不是进度条,两者在行为上非常不同)出现,而您的长期运行化学 -相关计算运行。

您在这里遇到的问题是计算是一个同步过程,并且会阻止 DOM 在处理过程中被更新。要解决此问题,您可以将计算逻辑放置在具有非常短延迟的超时内,以便给 DOM 一些时间来更新并且不阻止 UI 被修改。因此,试试这个:

let $loading = $('#loading');
let $calcPpmAsCao3 = $("input[id$='txtCalciumPpmAsCaCO3']");
let $chloridePpmAsCao3 = $("input[id$='txtChloridePpmAsCaCO3']");

let ttlCationCaco3 = parseFloat($("input[id$='txtTdsAdjustmentForCation']").val());
let ttlAnionCaco3 = parseFloat($("input[id$='txtTdsAdjustmentForAnion']").val());


$("[id*=btnAddCa_Cl]").click(function() {
  $loading.show();

  setTimeout(function() {
    // calculation logic here \/ \/ \/        

    if (ttlCationCaco3 > 0) {
      $calcPpmAsCao3.val(function(i, v) {
        return parseFloat(this.value) + ttlCationCaco3;
      }).trigger('keyup');
    } else {
      $chloridePpmAsCao3.val(function(i, v) {
        return parseFloat(this.value) + ttlAnionCaco3;
      }).trigger('keyup');
    }

    // calculation logic here /\ /\ /\        

    $loading.hide();
  }, 10);
});
#loading {
  display: none;
}

在这个例子中有几件事需要注意。首先,访问 DOM 是您在 JS 中可以做的(相对)最慢的事情之一。因此,值得采取措施减少执行此操作的次数。如果您需要多次引用一个元素,请将其“缓存”在一个变量中。

另外,对一个值调用一次parseFloat() 并将其存储在一个变量中。那么你就不需要一直打电话给parseFloat() 你已经可以访问的东西了。

最后,我使用 CSS 默认隐藏 #loading。不要在 JS 中执行此操作,因为在 JS 运行并隐藏它之前,元素将在一瞬间可见。 CSS 优先执行,速度更快,因此避免了这个问题。

【讨论】:

  • 获取未捕获的引用错误:$ 未定义
  • @Max 如果您指的是问题中的 sn-p,我将其删除,因为它依赖于 OP 图像而无法工作。如果您指的是自己的代码,那么您需要在页面中包含 jquery.js。如果您删除您的反对票,我也将不胜感激。
  • 这也帮助了我 php 哈哈,我的问题是我把 $loading.hide();在 setTimeout 函数之外
猜你喜欢
  • 1970-01-01
  • 2017-08-04
  • 2016-07-14
  • 1970-01-01
  • 1970-01-01
  • 2011-06-19
  • 2021-04-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多