JS中配合layer弹窗实现数字进度的两种方法

JS中配合layer弹窗实现数字进度的两种方法

主要是实现如图所示效果数字进度


之前我在处理批量数据的时候,没有想到在前台做类似于进度的提示,当数据量大的时候且服务器端处理速度较慢时,用户容易误以为程序或者网站卡住了。所以需要加上进度来提示用户。
于是,第一版出来了,是这样的:

var n = $("#ids").val().split(",");
layer.open({
    type: 0,
    title: false,
    closeBtn: 0,
    btn: false,
    content: '<div class="executeprogress">正在执行,请耐心等待... ...</div>'
});
for (var i = 1; i <= n.length; i++) {
    $('.executeprogress').html('正在执行第' + (i) + '/' + n.length + '条数据,请稍等');
    $.ajax({
        async: false,
        type: "POST",
        data: {
            Number: number,
            Year: year,
            State: state,
            userid: n[i - 1].toString()
        },
        url: 'User/AddSet',
        dataType: 'text',
        success: function (data) {
         var result = $.parseJSON(data);
         if (result) {
             if (result.Success == true) {
             msg = result.Msg;
             } else {
              b = false;
              msg = result.Msg;
             }
       }}
    });
}

这时候就发现,不管怎样 弹窗显示进度那里都是有问题的。后来查了下,好像是:浏览器的渲染(UI)线程和js线程是互斥的,在执行js耗时操作时,页面渲染会被阻塞掉。当我们执行异步ajax的时候没有问题,但当设置为同步请求时,其他的动作(ajax函数后面的代码,还有渲染线程)都会停止下来。即使我的DOM操作语句是在发起请求的前一句,这个同步请求也会“迅速”将UI线程阻塞,不给它执行的时间
于是耗费了大量时间思考。
第二版:

使用setInterval实现

 function () {
            layer.open({
                type: 0,
                title: false,
                closeBtn: 0,
                btn: false,
                content: '<div class="executeprogress">开始执行,请耐心稍等... ...</div>',
            });
            var n = eval('(' + $("#str").val() + ')');
            var i = 3;
            mytime = setInterval(function () {
                $('.executeprogress').html('正在执行第' + (i) + '/' + n.length + '条');
                $.ajax({
                    async: false,
                    type: "POST",
                    data: { },
                    url: 'User/Account',
                    dataType: 'text',
                    success: function(data) {
                        var str = $.parseJSON(data);
                        if (!str.success) {
                            b = false;
                        }
                    }
                });
                i++;
                if (i >= n.length) {
                    clearInterval(mytime);
                    if (b == false) {
                        //调整错误列表
                        return;
                        } else {
                            var index = parent.layer.getFrameIndex(window.name); //获取窗口索引  
                            parent.layer.close(index); //关闭弹出的子页面窗口
                        }
                    }
                },
                200);
        }

关于setInterval()

setInterval() 方法可按照指定的周期(以毫秒计)来调用函数或计算表达式。
setInterval() 方法会不停地调用函数,直到 clearInterval() 被调用或窗口被关闭。由 setInterval() 返回的 ID 值可用作 >clearInterval() 方法的参数。 —— [ w3school]

这个的主要思路就是利用setinterval()方法重复调用ajax,达到一定条件就清除计时器。

使用回调函数实现

function inits() {
            var num = 0;
            var count = 10;//这里假装获取10条数给count;          
            var rec = function () {
                num++;
                if (num <= count) {
                    $('#show').html('正在执行第' + num + '/' + count + '条数据,请稍等');
                    getDate(rec)
                }
            };
            var getDate = function (callback) {
                $.ajax({
                    type: "get",
                    url: "xxxxxxxxxx",
                    dataType: 'json',
                    success: function (data) {
                        callback();
                    },
                    error: function (xml) {
                    }
                })
            };
            rec();
        }
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值