dongtan5555 2016-10-12 10:57
浏览 96

JQuery ajax xhr在开始之前100%完成?

I have long script which can take few minutes to execute, so i decided to create an progressbar which will return current state.

But i have problem because xhr evt.loaded/evt.total (30/30) returns 1 (100%) before it start executing long script...

$(".systemform").live("submit",function(e) {    //run system
    run_system(); //start run system
    e.preventDefault(); 
}); 

function run_system(){
    $("#leftcontainer").html("");
    $("#leftcontainer").show();           
    $("#chartContainer").hide();

    $(".loading").show();

    var sysid = $(".sysid:checked").val();
    var oddstype = $(".odds_pref").val();
    var bettypeodds = $(".bet_type_odds").val();
    var bookie = $(".bookie_pref").val();
    if (typeof oddstype === "undefined") {
        var oddstype = $(".odds_pref_run").val();
        var bettypeodds = $(".bet_type_odds_run").val();
        var bookie = $(".bookie_pref_run").val();                   
    }

    $.ajax({                
        xhr: function () {
            var xhr = new window.XMLHttpRequest();
            xhr.upload.addEventListener("progress", function (evt) {
                if (evt.lengthComputable) {
                    var percentComplete = evt.loaded / evt.total;
                    console.log(percentComplete);
                    $('.progress').css({
                        width: percentComplete * 100 + '%'
                    });
                    if (percentComplete === 1) {
                        $('.progress').addClass('hide');
                    }
                }
            }, false);
            xhr.addEventListener("progress", function (evt) {
                if (evt.lengthComputable) {
                    var percentComplete = evt.loaded / evt.total;
                    console.log(percentComplete);
                    $('.progress').css({
                        width: percentComplete * 100 + '%'
                    });
                }
            }, false);
            return xhr;
        },
        type: "POST",
        url: '/index.php?/system/system_options/left/'+'1X2/'+oddstype+'/'+bettypeodds+'/'+bookie,          
        data: {             
            system : sysid,
            showpublicbet : showpublicbet 
        }, // serializes the form's elements.       
        dataType:"json",
        success: function(data)
        {     
            console.log(data);                                     
            $("#systemlist").load('/index.php?/system/refresh_system/'+sysid,function(e){
                systemradiotocheck(); 
            });
            $("#resultcontainer").load('/index.php?/system/showresults/'+sysid+'/false');                                                                             
            $("#resultcontainer").show();
            $("#leftcontainer").html(data.historic_table);
            $("#rightcontainer").html(data.upcoming_table); 
            var count = 0;
            var arr = [];
            $("#rightrows > table > tbody > tr").each(function(){
                var row = $(this).data('row');
                if(typeof row !== 'undefined'){
                    var rowarr = JSON.parse(JSON.stringify(row));
                    arr[count] = rowarr;                                    
                    $(this).find('td').each(function(){
                        var cell = $(this).data('cell');
                        if(typeof cell !== 'undefined'){
                            var cellarr = JSON.parse(JSON.stringify(cell));
                            arr[count][6] = cellarr[0];
                        } 
                    });
                    count ++;
                }
            });                           
            if(oddstype == "EU" && bookie == "Bet365"){
                $('.bet365').show();
                $('.pinnacle').hide();
                $('.ukodds').hide();
            }

            if(oddstype == "EU" && bookie == "Pinnacle"){
                $('.pinnacle').show();
                $('.bet365').hide();
                $('.ukodds').hide();
            }           

            if(oddstype == "UK"){
                $('.bet365').hide();
                $('.pinnacle').hide();
                $('.ukodds').show();
            }   

            if(bookie == "Pinnacle"){
                $(".pref-uk").hide();
            }                                                                     
            else{
                $(".pref-uk").show();
            }                             
            $(".loading").hide(); 
            runned = true;
            var options = {
                animationEnabled: true,
                toolTip:{   
                    content: "#{x} {b} {a} {c} {y}"      
                },
                axisX:{
                    title: "Number of Games"
                },
                axisY:{
                    title: "Cumulative Profit"
                },
                data: [
                {
                    name: [],
                    type: "splineArea", //change it to line, area, column, pie, etc
                    color: "rgba(54,158,173,.7)",
                    dataPoints: []
                }
                ]   
            }; 
                    //console.log(data);
            var profitstr = 0;
            var parsed = $.parseJSON(JSON.stringify(data.export_array.sort(custom_sort)));
            var counter = 0;
            for (var i in parsed) 
            {
                profitstr = profitstr + parsed[i]['Profit'];
                //console.log(profitstr);
                var profit = parseFloat(profitstr.toString().replace(',','.'));
                //console.log(profit);
                var event = parsed[i]['Event'].toString();
                var hgoals = parsed[i]['Home Goals'].toString();
                var agoals = parsed[i]['Away Goals'].toString();
                var result = hgoals + ":" + agoals;
                var date = parsed[i]['Date'].toString();
                var bettype = parsed[i]['Bet Type'];
                var beton = parsed[i]['Bet On'];
                var handicap = parsed[i]['Handicap'];
                counter++;
                options.data[0].dataPoints.push({x: counter,y: profit,a:event,b:date,c:result});
            }

            $("#chartContainer").show();
            $("#chartContainer").CanvasJSChart(options);

            $(".hidden_data").val(JSON.stringify(data.export_array));
            $(".exportsys").removeAttr("disabled");
            $(".exportsys").removeAttr("title");
        },          
        error: function(xhr, textStatus, error){
            console.log(xhr.statusText);
            console.log(textStatus);
            console.log(error);
        }
    }); 
}

What is problem here???

when i console.log(evt) i get this: from upload progress:

ProgressEvent {isTrusted: true, lengthComputable: true, loaded: 30, total: 30, type: "progress"…}

from download progress:

system:302 ProgressEvent {isTrusted: true, lengthComputable: false, loaded: 28987, total: 0, type: "progress"…} system:302 ProgressEvent {isTrusted: true, lengthComputable: false, loaded: 104950, total: 0, type: "progress"…}

It looks like loaded is too large, what is my solution here???

I SOLVE IT by directly JQuery access to file instead php using $.get:

function refreshProgress(){
    $.get('1_run.txt', function(data) {
        console.log(data);
    }); 
}
  • 写回答

1条回答 默认 最新

  • dongmi4720 2016-10-12 11:12
    关注

    ajax xhr function replace for this code

    xhr: function ()
                    {
                        var xhr = new window.XMLHttpRequest();
                        //Upload progress
                         $("#loadAdd").show();
                        xhr.upload.addEventListener("progress", function (evt) {
                            if (evt.lengthComputable) {
                                var percentComplete = (evt.loaded / evt.total) * 100;
                                $('#loadAdd .progress-bar').css('width', percentComplete + '%');
                            }
                        }, false);
                        //Download progress
                        xhr.addEventListener("progress", function (evt) {
                            if (evt.lengthComputable) {
                                var percentComplete = evt.loaded / evt.total;
                            }
                        }, false);
                        return xhr;
                    }, 
    

    html code

    <div class="col-lg-12">
        <div id="loadAdd" class="progress progress-striped active">
            <div class="progress-bar progress-bar-success"    role="progressbar" aria-valuenow="40" aria-valuemin="0" aria-valuemax="100" style="width: 00%">
            </div>
        </div>
    </div>
    
    评论

报告相同问题?

悬赏问题

  • ¥15 随身WiFi网络灯亮但是没有网络,如何解决?
  • ¥15 gdf格式的脑电数据如何处理matlab
  • ¥20 重新写的代码替换了之后运行hbuliderx就这样了
  • ¥100 监控抖音用户作品更新可以微信公众号提醒
  • ¥15 UE5 如何可以不渲染HDRIBackdrop背景
  • ¥70 2048小游戏毕设项目
  • ¥20 mysql架构,按照姓名分表
  • ¥15 MATLAB实现区间[a,b]上的Gauss-Legendre积分
  • ¥15 delphi webbrowser组件网页下拉菜单自动选择问题
  • ¥15 linux驱动,linux应用,多线程