javascript - setTimeout 和回调 - 不允许浏览器渲染刷新的 DOM 元素

标签 javascript callback settimeout

我有一个函数可以更新一些 DOM 元素,然后使用 setTimeout 调用回调,如下所示(如果提供了 - 否则调用一个虚拟函数):

        function updateprogressbar(id,val,label,callback) {
            var time = 0;
            if (typeof callback === "function") {
                var func = callback;
            } else {
                var func = function () {};
            }
            $( "#progressbar" ).progressbar({
                value: val
            });
            $( "#progress-label"+id ).html("Overall Progress: "+label);
            setTimeout(func(),time);
        }

用这个 for 循环调用:

        for(var i=0;i<emails.length;i++) {
            var howmuchdone = Math.ceil(totalchecked*100/totaltocheck);
            updateprogressbar(1,howmuchdone,howmuchdone+"%",function () {                   
                $("#EMAIL_ALL").val($("#EMAIL_ALL").val()+","+getmeadescriptor($.trim(emails[i])));
            });
            totalchecked = totalchecked + 1;
        }

它正在正确执行回调,但我使用 setTimeout 的目的是确保浏览器呈现更新的 DOM 元素。由于我无法弄清楚的原因,DOM 元素没有被更新。

(updateprogressbar 正在 for 循环中调用,传递给它的回调是一个匿名函数,它执行一些简单的处理 - 尽管我认为这与这个问题无关。)

关于为什么我在 updateprogressbar 调用上没有得到任何浏览器渲染的任何想法?

谢谢!

所以,根据@vinhHT的评论,我会尝试这个:

                var testfunction = function (value) {
                    $("#EMAIL_ALL").val($("#EMAIL_ALL").val()+","+value;
                }

                for(var i=0;i<emails.length;i++) {
                    var howmuchdone = Math.ceil(totalchecked*100/totaltocheck);
                    updateprogressbar(1,howmuchdone,howmuchdone+"%",testfunction(getmeadescriptor($.trim(emails[i]))));
                    totalchecked = totalchecked + 1;
                }

最佳答案

删除setTimeout中的()

As setTimeout(func,time);

在 jfriend00 的评论后编辑:

  1. 将函数正确声明为:

    var func = 函数() { //业务往这里走 }

  2. 将代码中对上述回调的调用更正为

    setTimeout(func, 时间);

3编辑问题已被编辑:在if-else block 之外声明func,更正setTimeout调用

function updateprogressbar(id, val, label, callback) {
    var time = 0;
    var func;
    if (typeof callback === "function") {
        func = callback;
    } else {
        func = function() {};
    }
    $("#progressbar").progressbar({
        value: val
    });
    $("#progress-label" + id).html("Overall Progress: " + label);
    setTimeout(func, time);
}

关于javascript - setTimeout 和回调 - 不允许浏览器渲染刷新的 DOM 元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36232853/

相关文章:

javascript - html dom的问题,如何获取p标签的高度?

javascript - RadGrid 上的 get_selectedItems()[0] 返回 null

javascript - Rails 将 localhost 放入 include 标签和 javascript 的方法

javascript - x未定义,setTimeout问题

javascript - 从 Django 模型获取数据到 Google Charts

javascript - 在自己内部嵌套回调

java - Android 5.0 Lollipop 中的 mediaPlayer,我无法播放,来自 url 的长声音。在 Android 5.0 到来之前我从未遇到过任何问题

node.js - 如何处理 mongoose 模型中 find 方法的回调结果

javascript - 使用 clearInterval() 时出错

javascript - setTimeout setInterval 函数内的奇怪行为