如何在昂贵的 jquery 操作期间显示进度图标?

发布于 2024-11-17 23:44:04 字数 556 浏览 3 评论 0原文

我有以下代码来显示进度 ajax 图标,然后运行一堆 javascript,然后隐藏进度图标。

运行此命令时,我根本看不到 div#collapseExpandProgress 变得可见。

我的猜测是:

  1. 它根本不显示
  2. 它立即显示并隐藏,因为 each() 方法在回调方法之外工作
$("#expandAll").click(function (e) {
      $('#collapseExpandProgress').show();

      $(".treeclick", "#treegrid").each(function () {
        if ($(this).hasClass("tree-plus")) {
            $(this).trigger("click");
        }
    });

    $('#collapseExpandProgress').hide();

});

对于这里可能出现的问题有什么建议吗?

I have the following code to show a progress ajax icon and then run a bunch of javascript and then hide the progress icon.

When running this I don't see the div#collapseExpandProgress become visible at all.

My guess is either:

  1. It's not showing at all
  2. It's showing and hiding immediately because the each() method works off the callback method
$("#expandAll").click(function (e) {
      $('#collapseExpandProgress').show();

      $(".treeclick", "#treegrid").each(function () {
        if ($(this).hasClass("tree-plus")) {
            $(this).trigger("click");
        }
    });

    $('#collapseExpandProgress').hide();

});

Any suggestion on what could be wrong here?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

这个俗人 2024-11-24 23:44:04

我没有完整的技术解释,但我以前经历过这种情况。这可能与 javascript 控制流的工作方式有关。大概是因为 Javascript 是单线程的,所以直到操作的同步部分完成之后,DOM 才会更新。

我还发现,在类似情况下,gif 动画可能会显示但不会动画。

您很可能可以像这样显示 gif:

  $('#collapseExpandProgress').show();

  window.setTimeout(function() {
      $(".treeclick", "#treegrid").each(function () {
        if ($(this).hasClass("tree-plus")) {
            $(this).trigger("click");
        }
      $('#collapseExpandProgress').hide();
    },50); // just some low number

但是,我怀疑它不会动画化,原因与它最初没有显示的原因相同,可能取决于浏览器。

I don't have a complete technical explanation, but I have experienced this before. It probably has something to do with the way javascript control flow works. Presumably because Javascript is single threaded, the DOM is not updated until after the synchronous part of your operation has completed.

I've also found that an animated gif may show but not animate in similar circumstances.

You can most likely get the gif to show like this:

  $('#collapseExpandProgress').show();

  window.setTimeout(function() {
      $(".treeclick", "#treegrid").each(function () {
        if ($(this).hasClass("tree-plus")) {
            $(this).trigger("click");
        }
      $('#collapseExpandProgress').hide();
    },50); // just some low number

However, I suspect it will not animate for the same reason it didn't show in the first place, perhaps depending on the browser.

你的呼吸 2024-11-24 23:44:04

在您要进行的 each() 的最后一个回调中进行一次小的洗牌以触发 hide() 应该可以解决问题。

elsCheck = $(".treeclick", "#treegrid");

$("#expandAll").click(function(e){

    $('#collapseExpandProgress').show();

    elsCheck.each(function(i){
        if ($(this).hasClass("tree-plus")) {
            $(this).trigger("click");
        }
        if (i==(elsCheck.length-1)){ $('#collapseExpandProgress').hide(); }
    });

});

A minor shuffle to trigger the hide() on the last callback for the each() you've got going should do the trick.

elsCheck = $(".treeclick", "#treegrid");

$("#expandAll").click(function(e){

    $('#collapseExpandProgress').show();

    elsCheck.each(function(i){
        if ($(this).hasClass("tree-plus")) {
            $(this).trigger("click");
        }
        if (i==(elsCheck.length-1)){ $('#collapseExpandProgress').hide(); }
    });

});
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文